首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >刮伤的request.priority不起作用

刮伤的request.priority不起作用
EN

Stack Overflow用户
提问于 2022-07-26 08:34:26
回答 1查看 89关注 0票数 0

正式文档对scrapy.Request.priority的解释如下:

优先级(int) -此请求的优先级(默认为0)。调度程序使用优先级来定义用于处理请求的顺序。优先级较高的请求将更早地执行。为了表示相对较低的优先级,允许使用负值.

但我的测试不是这样的:

scrapy version: 2.6.2

Python version: 3.7.13

代码语言:javascript
复制
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)

在爬行器日志之后,请求顺序始终保持如下所示:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2022-07-26 22:35:42

当从start_requests方法产生请求时,它会立即被传递给scrapy引擎,然后再传递给调度程序。如果调度程序在其优先级队列中没有任何先前生成的请求,那么它将在反应堆事件循环的下一次迭代时立即执行。

在第一次初始化一个刮刮蜘蛛时,将构造一个新的空调度程序,因此,第一个发送给start_requests方法调度程序的请求将始终是引擎执行的第一个请求。由于start_requests方法每次只生成一个请求,因此无论优先级如何,它们都很可能以相同的顺序执行,因为调度程序不知道具有较高优先级的后一个请求是否存在。

下面是对scrapy概述的链接,它描述了刮取工作流的逐步过程。

解决您的问题的一个方法是,在从start_requests方法生成urls之前,根据urls的优先级对它们进行排序。

例如:

代码语言:javascript
复制
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, ...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73120140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档