Scrapy是否为默认异步?

wfsdck30  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(250)

我最近在我的项目中运行了一个spider,但我觉得它像scrapy一样,它会等待一个页面完成后才移动到另一个页面。如果我对scrapy的性质没有错,它会移动到另一个页面,直到收到前一个页面的响应。in this page向下滚动后,我看到使用了async def,这意味着通过添加该方法显式地使该方法异步。如果我不这样做,不要在我的spider中放入async-await,它们不会变得异步吗?它们会等到收到响应吗?如果我有任何误解,请告诉我,并提前谢谢。

f3temu5u

f3temu5u1#

是的,正如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):
    # do some stuff
    for page in range(self.total_pages):
        yield Requests(f'https://example.com/search?page={page}', 
                          callback=self.parse)
thigvfpy

thigvfpy2#

Scrapy默认为异步。
使用Scrapy 2.0中引入的coroutine syntax,在使用Twisted Deferred时只允许更简单的语法,这在大多数用例中是不需要的,因为Scrapy尽可能地使其使用透明。
您的spider之所以看起来是同步的,唯一的原因是您只从先前请求的回调中产生了一个新的Request对象。如果您从start_requests产生了多个请求,或者在start_urls中有多个URL,这些请求将根据您的并发设置(Scrapy的默认值是每个域8个并发请求,总共16个)被异步处理。

相关问题