scrapy 主动停止爬虫

"""CloseSpider is an extension that forces spiders to be closed after certain
conditions are met.

See documentation in docs/topics/extensions.rst
"""

class CloseSpider(object):

    def __init__(self, crawler):
        self.crawler = crawler

        self.close_on = {
            ‘timeout‘: crawler.settings.getfloat(‘CLOSESPIDER_TIMEOUT‘),
            ‘itemcount‘: crawler.settings.getint(‘CLOSESPIDER_ITEMCOUNT‘),
            ‘pagecount‘: crawler.settings.getint(‘CLOSESPIDER_PAGECOUNT‘),
            ‘errorcount‘: crawler.settings.getint(‘CLOSESPIDER_ERRORCOUNT‘),
            }

        if not any(self.close_on.values()):
            raise NotConfigured

        self.counter = defaultdict(int)

        if self.close_on.get(‘errorcount‘):
            crawler.signals.connect(self.error_count, signal=signals.spider_error)
        if self.close_on.get(‘pagecount‘):
            crawler.signals.connect(self.page_count, signal=signals.response_received)
        if self.close_on.get(‘timeout‘):
            crawler.signals.connect(self.spider_opened, signal=signals.spider_opened)
        if self.close_on.get(‘itemcount‘):
            crawler.signals.connect(self.item_scraped, signal=signals.item_scraped)
        crawler.signals.connect(self.spider_closed, signal=signals.spider_closed)

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def error_count(self, failure, response, spider):
        self.counter[‘errorcount‘] += 1
        if self.counter[‘errorcount‘] == self.close_on[‘errorcount‘]:
            self.crawler.engine.close_spider(spider, ‘closespider_errorcount‘)

    def page_count(self, response, request, spider):
        self.counter[‘pagecount‘] += 1
        if self.counter[‘pagecount‘] == self.close_on[‘pagecount‘]:
            self.crawler.engine.close_spider(spider, ‘closespider_pagecount‘)

    def spider_opened(self, spider):
        self.task = reactor.callLater(self.close_on[‘timeout‘],             self.crawler.engine.close_spider, spider,             reason=‘closespider_timeout‘)

    def item_scraped(self, item, spider):
        self.counter[‘itemcount‘] += 1
        if self.counter[‘itemcount‘] == self.close_on[‘itemcount‘]:
            self.crawler.engine.close_spider(spider, ‘closespider_itemcount‘)

    def spider_closed(self, spider):
        task = getattr(self, ‘task‘, False)
        if task and task.active():
            task.cancel()

1  上述代码是一个scrapy 关闭爬虫的一个的扩展类,从代码中可以看出主要是实现了timeout, itemcount, pagecount, errorcount 4种方式,因此可以在setting中设置这4种方式,当触发条件的时候会自动停止爬虫

在setting中设置

CLOSESPIDER_TIMEOUT  # 指定时间退出

CLOSESPIDER_ITEMCOUNT  # 生成了指定数量的item

CLOSESPIDER_PAGECOUNT  # 抓取了指定数量的响应

CLOSESPIDER_ERRORCOUNT  # 在发生指定数量的错误

2  从CloseSpider类中可以了解到停止爬虫是使用了 self.crawler.engine.close_spider() 方法,因此当满足一定条件的时候我们也可以调用这个方法停止scrapy

# 在Spider文件中

self.crawler.engine.close_spider(self, 错误信息)

# 在piplines或者是middlewares文件中

spider.crawler.engine.close_spider(spider, 错误信息)

原文地址:https://www.cnblogs.com/kentlin/p/10819998.html

时间: 2024-11-09 10:48:52

scrapy 主动停止爬虫的相关文章

scrapy主动退出爬虫的代码片段(python3)

问题:在运行scrapy的过程中,如果想主动退出该怎么做? 背景:比如说我只要爬取当日的新闻,那么在遍历的时候,如果出现了超过1条不是当日的新闻,那么就不爬取了,就主动退出爬虫,这个时候该怎么做呢? IDE:pycharm 版本:python3 框架:scrapy 系统:windows10 代码如下: # -*- coding: utf-8 -*- import scrapy from torrentSpider.items.NavigationItem import NavigationIte

Requests爬虫和scrapy框架多线程爬虫

1.基于Requests和BeautifulSoup的单线程爬虫 1.1 BeautifulSoup用法总结 1. find,获取匹配的第一个标签 tag = soup.find('a') print(tag) tag = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie') tag = soup.find(name='a', class_='sister', recursive=True, te

scrapy框架【爬虫的暂停和启动】

scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 方法一: 1.首先cd进入到scrapy项目里(当然你也可以通过编写脚本Python文件直接在pycharm中运行) 2.在scrapy项目里创建保存记录信息的文件夹 3.执行命令: scrapy crawl 爬虫名称 -s JOBDIR=保存记录信息的路径 如:scrapy crawl cnblogs -s JOBDIR=zant/001 执行命令会启动

第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略

第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫和反爬的对抗过程以及策略-scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图

第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫数据保存 注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy

python scrapy 简单的爬虫

1 scrapy的文档 比较简单 http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html 我假定你已经安装了Scrapy.假如你没有安装,你可以参考这篇文章. 在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容 1. 创建一个新的Scrapy Project scrapy creatproject "project-name" 2. 定义你需要从网页中提取的元素Item 3.实现一

Python scrapy 实现网页爬虫

Python scrapy 安装和网页爬虫功能实现 现在组内有个工作就是维护恶意URL库,然后这个维护工作,主要是通过从几个会发布恶意URL地址的网站获取恶意网址,每次都得花费半天,很乏味的事情.所以就想到能否用个爬虫搞定. 这两天研究了下python scrapy,发现利用scrapy的确很容易实现网址爬取功能. 一.scrapy安装 简单的说明一下scrapy的安装过程 window安装 先安装python,要提醒一下是环境变量的配置,只有环境变量配置对了,才能在命令行执行窗口找到pytho

第7章 Scrapy突破反爬虫的限制

7-1 爬虫和反爬的对抗过程以及策略 Ⅰ.爬虫和反爬虫基本概念 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法. 误伤:反爬虫技术将普通用户识别为爬虫,如果误伤过高,效果再高也不能用. 成本:反爬虫需要的人力和机器成本. 拦截:成功拦截爬虫,一般拦截率越高,误伤率越高. Ⅱ.反爬虫的目的 初级爬虫----简单粗暴,不管服务器压力,容易弄挂网站. 数据保护 失控的爬虫----由于某些情况下,忘记或者无法关闭的爬虫. 商业竞争对手 Ⅲ.爬虫和反爬虫对抗过程

Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)

Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,暂时不想再上面装太多软件. Scrapy的入门教程见下面链接:Scrapy入门教程 上面的入门教程是很基础的,先跟着作者走一遍,要动起来哟,不要只是阅读上面的那篇入门教程,下面我简单总结一下Scrapy爬虫过程: 1.在Item中定义自己要抓取的数据: movie_name就像是字典中的“键”,爬到的数