【问题标题】:Is Scrapy Asychronous by Default?Scrapy 默认是异步的吗?
【发布时间】:2020-05-07 11:31:56
【问题描述】:
我最近在我的项目中运行了一个蜘蛛,但我觉得它在等到一个页面完成才能移动另一页。如果我在scrapy的性质上是正确的,它会移动到另一个页面,直到收到前一个的响应。 in this page 向下滚动后,我看到 async def 被使用,这意味着该方法通过添加该方法被显式地设为异步。如果我不把async-await 放在我的蜘蛛中,它们不会变成异步的。他们会等到收到回复吗?如果我有任何误解,请告诉我,并提前感谢您。
【问题讨论】:
标签:
python
asynchronous
web-scraping
scrapy
【解决方案1】:
是的,正如@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)
【解决方案2】:
Scrapy 默认是异步的。
使用在 Scrapy 2.0 中引入的coroutine syntax,在使用 Twisted Deferreds 时只允许使用更简单的语法,这在大多数用例中是不需要的,因为 Scrapy 尽可能使其使用透明。
你的蜘蛛看起来同步的唯一原因是因为你只从前一个请求的回调中产生一个新的Request 对象。如果您从 start_requests 产生多个请求,或者在 start_urls 中有多个 URL,这些将根据您的并发设置异步处理(Scrapy 的默认设置是每个域 8 个并发请求,总共 16 个)。