默认情况下Scrapy是否异步?

时间:2020-05-07 11:31:56

标签: python asynchronous web-scraping scrapy

我最近在我的项目中运行了一个Spider,但是我感到抓紧它正在等待,直到一页完成在另一页上移动为止。如果我对scrapy的性质是正确的,它将移动到另一页,直到收到上一页的答复为止。 this answer向下滚动后,我看到使用了async def,这意味着通过添加该方法可以显式地使该方法异步。如果我不将async-await放在蜘蛛网中,它们将不会变得异步。他们会等到收到答复吗?如果我有任何误解,请告诉我,谢谢。

2 个答案:

答案 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)