我最近在我的项目中运行了一个Spider,但是我感到抓紧它正在等待,直到一页完成在另一页上移动为止。如果我对scrapy的性质是正确的,它将移动到另一页,直到收到上一页的答复为止。 this answer向下滚动后,我看到使用了async def
,这意味着通过添加该方法可以显式地使该方法异步。如果我不将async-await
放在蜘蛛网中,它们将不会变得异步。他们会等到收到答复吗?如果我有任何误解,请告诉我,谢谢。
答案 0 :(得分:3)
默认情况下,Scrapy是异步的。
使用Scrapy 2.0中引入的coroutine syntax,在使用Twisted Deferreds时仅允许使用更简单的语法,在大多数用例中不需要,因为Scrapy尽可能使使用透明。
您的蜘蛛看似同步的唯一原因是,您仅从先前请求的回调中产生了一个新的Request
对象。如果您从start_requests
发出多个请求,或者在start_urls
中有多个URL,则将根据您的并发设置异步处理这些请求(Scrapy的默认值为每个域8个并发请求,共16个)。>
答案 1 :(得分:0)
是的,因为@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)