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

Scrapy/Python请求优先级和并发_请求,python,scrapy,Python,Scrapy,我正在抓取一个只有一个IP的域。它有一个商店URL列表,每个商店URL都有一个产品列表(多页) 首先,我检查存储URL并生成请求,同时为每个存储分配较小的优先级。商店1得到-1,商店2得到-2等 当加载产品列表URL的下一页时,我为请求分配相同的优先级 当设置了并发请求时,这一切都可以正常工作。我一个接一个地加载优先级为-1和-2的URL。Scrapy不会前进到优先级为-3或更低的URL 然而,我尝试了CONCURRENT\u REQUESTS\u PER\u DOMAIN和CONCURRENT

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

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

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

当设置了
并发请求时,这一切都可以正常工作。我一个接一个地加载优先级为-1和-2的URL。Scrapy不会前进到优先级为-3或更低的URL

然而,我尝试了
CONCURRENT\u REQUESTS\u PER\u DOMAIN
CONCURRENT\u REQUESTS\u PER\u IP
,最后加载了优先级为-1、-2、-3、-4的URL

我想了解为什么
并发\u请求
的工作方式不同于
…每个\u域
…每个\u 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

请求优先级不能确保顺序

如果您有16个请求,每个请求具有不同的优先级,并且每个域有一个
CONCURRENT\u requests\u
16
,则几乎同时发送所有16个请求,并按照来自服务器的顺序对其进行解析,这不太可能与其优先级值匹配

CONCURRENT\u REQUESTS
CONCURRENT\u REQUESTS\u PER\u DOMAIN
实际上是组合工作的<默认情况下,code>CONCURRENT\u REQUESTS\u PER\u DOMAIN
为8,不定义
CONCURRENT\u REQUESTS\u PER\u DOMAIN
相当于将
8
定义为值。如果在设置每个域的并发请求时看到不同的行为,那一定是因为您使用的值不是
8


CONCURRENT\u REQUESTS\u PER\u IP
,它不同于名称所示的
CONCURRENT\u REQUESTS\u PER\u DOMAIN
。如果定义了,则忽略每个域的并发请求值。

你可能是对的,但我觉得当高优先级响应越深时,队列中的高优先级请求就越多。然而,我不认为只有高优先级的请求才会被执行,过了一段时间。。。我定义了所有的
CONCURRENT.*
选项,但是如果我只是注释掉
CONCURRENT.\u请求
scrapy,它的工作方式似乎就不同了。我可以从调试输出中看到,所有获取的请求都来自同一个域,该域只有一个IP,但仍然。。。。无论如何,我投票支持你的回答…我添加了示例代码,你可以看到设置
并发请求
如何影响爬网顺序。。。