首页 > 解决方案 > 在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

使用管道进行下载也不起作用,因为管道是为每个项目执行的,并且在执行之间不存储值。

标签: pythonscrapy

解决方案


这个对我有用:

设置.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>


推荐阅读