我正在抓取一个只有一个IP的域。它有一个存储URL列表,每个存储URL都有一个产品列表(多页)
首先,我遍历存储URL并生成请求,同时为每个存储分配一个更小的优先级。商店1得到-1,商店2得到-2等
当加载产品列表url的下一页时,我为请求分配相同的优先级。在
当设置了CONCURRENT_REQUESTS
时,这一切都很好。我得到优先级为-1和-2的URL一个接一个地加载。Scrapy不能升级到优先级为-3或更低的url。在
但是,我尝试了CONCURRENT_REQUESTS_PER_DOMAIN
和CONCURRENT_REQUESTS_PER_IP
,这些URL最终加载了优先级为-1、-2、-3、-4的URL。在
我想了解为什么CONCURRENT_REQUESTS
与...PER_DOMAIN
和{
有人能解释一下吗?在
下面是示例代码以了解它是如何失败的:
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个请求,每个请求具有不同的优先级,并且},则几乎同时发送所有16个请求,并按照它们来自服务器的顺序进行解析,这不太可能与它们的优先级值相匹配。在
CONCURRENT_REQUESTS_PER_DOMAIN
为{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
的值将被忽略。在相关问题 更多 >
编程相关推荐