正式文档对scrapy.Request.priority的解释如下:
优先级(int) -此请求的优先级(默认为0)。调度程序使用优先级来定义用于处理请求的顺序。优先级较高的请求将更早地执行。为了表示相对较低的优先级,允许使用负值.
但我的测试不是这样的:
scrapy version: 2.6.2
Python version: 3.7.13
class TestSpider(scrapy.Spider):
name = 'test'
custom_settings = {
'DOWNLOAD_DELAY': 5,
'CONCURRENT_REQUESTS': 1
}
def start_requests(self):
urls = {
10: 'https://www.baidu.com/s?wd=111111',
20: 'https://www.baidu.com/s?wd=222222',
30: 'https://www.baidu.com/s?wd=333333' # this url may pass to the first request?
}
for index, url in urls.items():
yield scrapy.Request(url,
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
},
callback=self.parse,
priority=index, # <- check here!!
meta={'priority': index},
dont_filter=True)
def parse(self, response, **kwargs):
self.log(datetime.datetime.now().strftime('%H:%M:%S'))
self.log(response.request.url)
title = response.xpath('//title/text()').get()
self.log(title)在爬行器日志之后,请求顺序始终保持如下所示:
2022-07-26 16:16:10 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.baidu.com/s?wd=111111> (referer: None)
2022-07-26 16:16:10 [test] DEBUG: 16:16:10
2022-07-26 16:16:10 [test] DEBUG: https://www.baidu.com/s?wd=111111
2022-07-26 16:16:10 [test] DEBUG: 111111_百度搜索
2022-07-26 16:16:15 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.baidu.com/s?wd=222222> (referer: None)
2022-07-26 16:16:15 [test] DEBUG: 16:16:15
2022-07-26 16:16:15 [test] DEBUG: https://www.baidu.com/s?wd=222222
2022-07-26 16:16:15 [test] DEBUG: 222222_百度搜索
2022-07-26 16:16:20 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.baidu.com/s?wd=333333> (referer: None)
2022-07-26 16:16:20 [test] DEBUG: 16:16:20
2022-07-26 16:16:20 [test] DEBUG: https://www.baidu.com/s?wd=333333
2022-07-26 16:16:20 [test] DEBUG: 333333_百度搜索
2022-07-26 16:16:20 [scrapy.core.engine] INFO: Closing spider (finished)发布于 2022-07-26 22:35:42
当从start_requests方法产生请求时,它会立即被传递给scrapy引擎,然后再传递给调度程序。如果调度程序在其优先级队列中没有任何先前生成的请求,那么它将在反应堆事件循环的下一次迭代时立即执行。
在第一次初始化一个刮刮蜘蛛时,将构造一个新的空调度程序,因此,第一个发送给start_requests方法调度程序的请求将始终是引擎执行的第一个请求。由于start_requests方法每次只生成一个请求,因此无论优先级如何,它们都很可能以相同的顺序执行,因为调度程序不知道具有较高优先级的后一个请求是否存在。
下面是对scrapy概述的链接,它描述了刮取工作流的逐步过程。
解决您的问题的一个方法是,在从start_requests方法生成urls之前,根据urls的优先级对它们进行排序。
例如:
def start_requests(self):
urls = {10: 'https://www.baidu.com/s?wd=111111',
20: 'https://www.baidu.com/s?wd=222222',
30: 'https://www.baidu.com/s?wd=333333'}
for index, url in sorted(urls.items(), reverse=True):
yield scrapy.Request(url, callback=self.parse, priority=index, ...)https://stackoverflow.com/questions/73120140
复制相似问题