我正在抓取具有单个IP的单个域。它有一个商店URL列表,每个商店URL都有一个产品列表(多页)
首先,我浏览商店URL并产生请求,同时为每个商店分配一个较小的优先级。商店1获得-1,商店2获得-2,依此类推。
在加载产品列表网址的下一页时,我为请求分配了相同的优先级。
设置CONCURRENT_REQUESTS
时,一切正常。我得到优先级为-1和-2的URL依次加载。 Scrapy不会处理优先级为-3或更低的URL。
但是,我尝试了CONCURRENT_REQUESTS_PER_DOMAIN
和CONCURRENT_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
答案 0 :(得分:1)
请求优先级不能保证顺序。
如果您有16个请求(每个请求具有不同的优先级)和CONCURRENT_REQUESTS_PER_DOMAIN
中的16
,则几乎同时发送所有16个请求,并按照来自服务器的顺序对其进行解析,这不太可能匹配其优先级值。
CONCURRENT_REQUESTS
和CONCURRENT_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
的值将被忽略。