Scrapy/Python请求优先级和并发_请求
我正在抓取一个只有一个IP的域。它有一个商店URL列表,每个商店URL都有一个产品列表(多页) 首先,我检查存储URL并生成请求,同时为每个存储分配较小的优先级。商店1得到-1,商店2得到-2等 当加载产品列表URL的下一页时,我为请求分配相同的优先级 当设置了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
并发请求时,这一切都可以正常工作。我一个接一个地加载优先级为-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,但仍然。。。。无论如何,我投票支持你的回答…我添加了示例代码,你可以看到设置并发请求
如何影响爬网顺序。。。