python - 在scrapy中达到多次下载后如何限制蜘蛛爬虫停止?
问题描述
我需要去一个有文件列表的网站并下载每个项目。问题是每天的下载是有限的(认证系统),所以当我的蜘蛛下载了几个项目时需要停止,他将无法从那里下载任何文件。
这是我尝试过的:settings.py
CLOSESPIDER_ITEMCOUNT = 10
CLOSESPIDER_PAGECOUNT = 50
它不起作用,因为scrapy 对于自然是异步的,并且不够聪明,无法考虑丢弃的物品。 https://docs.scrapy.org/en/latest/topics/item-pipeline.html
class DownloadProductVersionPipeline(FilesPipeline):
count = 0
def file_path(self, request, response=None, info=None, item=None):
self.count+=1
if self.count > 10:
raise CloseSpider()
adapter = ItemAdapter(item)
fileName = f"{adapter['providerId']}/{adapter['product']['id']}/{adapter['product']['id']}-v{adapter['productVersion']['version']}.zip"
return fileName
使用管道进行下载也不起作用,因为管道是为每个项目执行的,并且在执行之间不存储值。
解决方案
这个对我有用:
设置.py
DOWNLOADER_MIDDLEWARES = {
'project.middlewares.ProjectDownloaderMiddleware': 543,
}
中间件.py
class ProjectDownloaderMiddleware(object):
def process_response(self, request, response, spider):
if (spider.crawler.stats.get_value('file_status_count/downloaded') is not None and spider.crawler.stats.get_value('file_status_count/downloaded') >= 10):
raise CloseSpider(
'More than 10 items were downloaded from the provider and the spider was suspended to avoid banning')
return response
我决定使用中间件而不是管道,因为我相信它更具语义。
致谢:Jon Clements♦</p>