首页 > 解决方案 > 可以同时调用递归(解析)函数吗?

问题描述

我已经用 asyncio、aiohttp 和 async/await 语法编写了一些用于 webscraping 的并发代码。在这种情况下,我收集了我感兴趣的所有网页的 url 列表,并通过或多或少的示例代码将其提供给事件循环:

futures = [asyncio.ensure_future(fetch(url,session)) for url in URLlist]
data_list=[[data[i] for i in range(len(data))] for data in await asyncio.gather(*futures)]

现在我试图抓取另一个网站,如果我不能(或者至少我不知道如何)在开始解析之前提取一个 urllist。在他们的主页中查看 Scrapy 示例,我使用递归模拟了他们的跟随功能(用于提取 nextpage-url 以提供爬虫),以这种方式:

def parse (url):
html=requests.get(url)
soup = BeautifulSoup(html.content,"html.parser")
#... code to extract post information...
nextpage = soup.select_one('a.blog-pager-older-link')
if nextpage is not None:
    nexthref = nextpage.get('href')
    parse(nexthref)

在我看来,使用与 Scrapy 相同的逻辑:您需要 GET 请求(I/O 等待)-> html 解析-> 在内容 href url 中查找 -> 递归。但是 Scrapy(我对此了解不多,所以可能是错误的)被宣传为原生并发库。

但是,如果它需要(至少在其主页中的示例中)在访问下一页 URL 之前等待 I/O 请求,它怎么可能是并发的呢?对于相同的逻辑,我找不到使我的代码异步的方法。

对此事有更深入了解的人可以给我任何建议是否可以使其异步/并发以及该 Scrapy 示例是否是真正的异步?

在这里,他们似乎正在使代码的处理(提取)阶段异步,但请求(GET)阶段不是真正减慢代码的阶段吗?

标签: pythonrecursionweb-scrapingconcurrencyscrapy

解决方案


推荐阅读