我最近在我的项目中运行了一个爬虫,但我觉得它是在等待一个页面完成后才移动到另一个页面。如果scrapy的性质是正确的,它会移动到另一个页面,直到收到前一个页面的响应。向下滚动后,我看到使用了async def
,这意味着通过添加in this page显式地使该方法成为异步方法。如果我不把async-await
放在我的爬虫里,它们不会变成异步的吗?它们是否等待接收到响应?如果我有任何误解,请让我知道,并提前谢谢你。
发布于 2020-05-07 19:43:54
Scrapy默认情况下是异步的。
使用Scrapy2.0中引入的coroutine syntax,在使用Twisted Deferreds时允许更简单的语法,这在大多数用例中是不需要的,因为Scrapy使其使用尽可能透明。
爬行器看起来同步的唯一原因是,您只从前一个请求的回调中生成了一个新的Request
对象。如果您从start_requests
产生多个请求,或者在start_urls
中有多个URL,这些请求将根据您的并发设置进行异步处理(Scrapy的默认值是每个域8个并发请求,总共16个)。
发布于 2020-05-09 03:18:26
是的,正如@Gallaecio所说,scrapy默认是异步的。我想补充的是,我可以使代码的同步部分异步。这样一来,
同步请求
def parse(self, response, current_page):
url = 'https://example.com/search?page={}'
# do some stuff
self.current_page += 1
yield Request(url.format(current_page), call_back=self.parse)
异步请求
def parse(self, response):
url = 'https://example.com/something?page={}'
# do some stuff
for page in range(self.total_pages): # variables are self explainable
yield Requests(url.format(page), callback=self.parse)
https://stackoverflow.com/questions/61656722
复制相似问题