Scrapy / Python请求优先级和CONCURRENT_REQUESTS

时间:2019-04-09 21:10:59

标签: python scrapy

我正在抓取具有单个IP的单个域。它有一个商店URL列表,每个商店URL都有一个产品列表(多页)

首先,我浏览商店URL并产生请求,同时为每个商店分配一个较小的优先级。商店1获得-1,商店2获得-2,依此类推。

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

设置CONCURRENT_REQUESTS时,一切正常。我得到优先级为-1和-2的URL依次加载。 Scrapy不会处理优先级为-3或更低的URL。

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

我想了解为什么CONCURRENT_REQUESTS...PER_DOMAIN...PER_IP选项的工作方式不同,因为我是从具有单个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

1 个答案:

答案 0 :(得分:1)

请求优先级不能保证顺序。

如果您有16个请求(每个请求具有不同的优先级)和CONCURRENT_REQUESTS_PER_DOMAIN中的16,则几乎同时发送所有16个请求,并按照来自服务器的顺序对其进行解析,这不太可能匹配其优先级值。

CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAIN实际上结合使用。 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的值将被忽略。