Scrapy/Python请求优先级和并发请求

2024-09-30 18:13:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在抓取一个只有一个IP的域。它有一个存储URL列表,每个存储URL都有一个产品列表(多页)

首先,我遍历存储URL并生成请求,同时为每个存储分配一个更小的优先级。商店1得到-1,商店2得到-2等

当加载产品列表url的下一页时,我为请求分配相同的优先级。在

当设置了CONCURRENT_REQUESTS时,这一切都很好。我得到优先级为-1和-2的URL一个接一个地加载。Scrapy不能升级到优先级为-3或更低的url。在

但是,我尝试了CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP,这些URL最终加载了优先级为-1、-2、-3、-4的URL。在

我想了解为什么CONCURRENT_REQUESTS...PER_DOMAIN和{}选项的工作方式不同,因为我是从一个具有单个IP地址的域下载的。在

有人能解释一下吗?在

下面是示例代码以了解它是如何失败的:

from scrapy.spiders import Spider, Request
import scrapy
import logging

class MySpider(Spider):

    custom_settings = {
        'DEPTH_STATS_VERBOSE': True,
#        'CONCURRENT_REQUESTS': 1,
        'CONCURRENT_REQUESTS_PER_DOMAIN': 1,
        'CONCURRENT_REQUESTS_PER_IP': 1,
        'AUTOTHROTTLE_TARGET_CONCURRENCY': 1,
    }

    name = 'toscrapecom'
    start_urls = ['http://books.toscrape.com/catalogue/page-1.html']

    urls1 = (
        'http://books.toscrape.com/catalogue/page-{}.html'.format(i + 1) for i in range(5)
    )

    urls2 = (
        'http://books.toscrape.com/catalogue/page-{}.html'.format(i + 1) for i in range(5,10)
    )

    def parse(self, response):
        reqPriority = 20
        for url in self.urls1:
            yield Request(url,priority=reqPriority,callback=self.next_page)
            logging.info("%s Priority %s URL %s", self.name, reqPriority, url)
            reqPriority = reqPriority - 1

    def next_page(self,response):
        reqPriority = 40
        for url in self.urls2:
            yield Request(url,priority=reqPriority)
            logging.info("%s Priority %s URL %s", self.name, reqPriority, url)
            reqPriority = reqPriority - 1

Tags: inimportselfipurl列表forrequest
1条回答
网友
1楼 · 发布于 2024-09-30 18:13:18

请求优先级不能确保顺序。在

如果您有16个请求,每个请求具有不同的优先级,并且CONCURRENT_REQUESTS_PER_DOMAIN为{},则几乎同时发送所有16个请求,并按照它们来自服务器的顺序进行解析,这不太可能与它们的优先级值相匹配。在

CONCURRENT_REQUESTS和{}实际上是组合工作的。CONCURRENT_REQUESTS_PER_DOMAIN默认为8,不定义CONCURRENT_REQUESTS_PER_DOMAIN等同于用8作为值来定义它。如果您在设置CONCURRENT_REQUESTS_PER_DOMAIN时看到不同的行为,那一定是因为您使用了8以外的值。在

CONCURRENT_REQUESTS_PER_IP,顾名思义,它与CONCURRENT_REQUESTS_PER_DOMAIN不同。如果已定义,CONCURRENT_REQUESTS_PER_DOMAIN的值将被忽略。在

相关问题 更多 >