Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫

首先解决爬虫等待,不被关闭的问题:

1、scrapy内部的信号系统会在爬虫耗尽内部队列中的request时,就会触发spider_idle信号。

2、爬虫的信号管理器收到spider_idle信号后,将调用注册spider_idle信号的处理器进行处理。

3、当该信号的所有处理器(handler)被调用后,如果spider仍然保持空闲状态, 引擎将会关闭该spider。

scrapy-redis 中的解决方案 在信号管理器上注册一个对应在spider_idle信号下的spider_idle()方法,当spider_idle触发是,信号管理器就会调用这个爬虫中的spider_idle(), Scrapy_redis 源码如下:

def spider_idle(self):
        """Schedules a request if available, otherwise waits."""
        # XXX: Handle a sentinel to close the spider.
        self.schedule_next_requests()    # 这里调用
        schedule_next_requests() 来从redis中生成新的请求
        raise DontCloseSpider              # 抛出不要关闭爬虫DontCloseSpider异常,保证爬虫活着

解决思路:

  • 通过前面的了解,我们知道 爬虫关闭的关键是 spider_idle 信号。
  • spider_idle信号只有在爬虫队列为空时才会被触发, 触发间隔为5s。
  • 那么我们也可以使用同样的方式,在信号管理器上注册一个对应在spider_idle信号下的spider_idle()方法。
  • 在 spider_idle() 方法中,编写结束条件来结束爬虫,这里以 判断redis 中关键key 是否为空,为条件

在settings.py 文件的目录下,创建一个名为 extensions.py 的文件,在其中写入以下代码

# -*- coding: utf-8 -*-

# Define here the models for your scraped Extensions
import logging
import time
from scrapy import signals
from scrapy.exceptions import NotConfigured

logger = logging.getLogger(__name__)

class RedisSpiderSmartIdleClosedExensions(object):

    def __init__(self, idle_number, crawler):
        self.crawler = crawler
        self.idle_number = idle_number
        self.idle_list = []
        self.idle_count = 0

    @classmethod
    def from_crawler(cls, crawler):
        # first check if the extension should be enabled and raise

        # NotConfigured otherwise

        if not crawler.settings.getbool(‘MYEXT_ENABLED‘):

            raise NotConfigured

        # 配置仅仅支持RedisSpider
        if not ‘redis_key‘ in crawler.spidercls.__dict__.keys():

            raise NotConfigured(‘Only supports RedisSpider‘)

        # get the number of items from settings

        idle_number = crawler.settings.getint(‘IDLE_NUMBER‘, 360)

        # instantiate the extension object

        ext = cls(idle_number, crawler)

        # connect the extension object to signals

        crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)

        crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)

        crawler.signals.connect(ext.spider_idle, signal=signals.spider_idle)

        # return the extension object

        return ext

    def spider_opened(self, spider):
        logger.info("opened spider %s redis spider Idle, Continuous idle limit: %d", spider.name, self.idle_number)

    def spider_closed(self, spider):
        logger.info("closed spider %s, idle count %d , Continuous idle count %d",
                    spider.name, self.idle_count, len(self.idle_list))

    def spider_idle(self, spider):
        self.idle_count += 1
        self.idle_list.append(time.time())
        idle_list_len = len(self.idle_list)

        # 判断 redis 中是否存在关键key, 如果key 被用完,则key就会不存在
        if idle_list_len > 2 and spider.server.exists(spider.redis_key):
            self.idle_list = [self.idle_list[-1]]

        elif idle_list_len > self.idle_number:
            logger.info(‘\n continued idle number exceed {} Times‘
                        ‘\n meet the idle shutdown conditions, will close the reptile operation‘
                        ‘\n idle start time: {},  close spider time: {}‘.format(self.idle_number,
                                                                              self.idle_list[0], self.idle_list[0]))
            # 执行关闭爬虫操作
            self.crawler.engine.close_spider(spider, ‘closespider_pagecount‘)

  

在settings.py 中添加以下配置, 请将 lianjia_ershoufang 替换为你的项目目录名。

MYEXT_ENABLED=True      # 开启扩展
IDLE_NUMBER=360           # 配置空闲持续时间单位为 360个 ,一个时间单位为5s

# 在 EXTENSIONS 配置,激活扩展
‘EXTENSIONS‘= {
            ‘lianjia_ershoufang.extensions.RedisSpiderSmartIdleClosedExensions‘: 500,
        },
MYEXT_ENABLED: 是否启用扩展,启用扩展为 True, 不启用为 False
IDLE_NUMBER: 关闭爬虫的持续空闲次数,持续空闲次数超过IDLE_NUMBER,爬虫会被关闭。默认为 360 ,也就是30分钟,一分钟12个时间单位

原文地址:https://www.cnblogs.com/zhongshuiping/p/9820922.html

时间: 2024-10-05 23:33:30

Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫的相关文章

解决 Scrapy-Redis 空跑问题,链接跑完后自动关闭爬虫

Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫 问题:scrapy-redis框架中,reids存储的xxx:requests已经爬取完毕,但程序仍然一直运行,如何自动停止程序,结束空跑. 分布式扩展: 我们知道 scrapy 默认是单机运行的,那么scrapy-redis是如何把它变成可以多台机器协作的呢? 首先解决爬虫等待,不被关闭的问题: 1.scrapy内部的信号系统会在爬虫耗尽内部队列中的request时,就会触发spider_idle信号. 2.爬虫的

跑握手包/cap跑包等一系列服务 普通15元一包,跑出再收费/专业跑包,快速跑包

QQ:12065661   微信:Love1075621883 手机:15678251175/15678251135 邮件:[email protected] 网站:www.rt68.cn 我们是专业wifi密码破解团队 跑握手包/cap跑包等一系列服务 普通15元一包,跑出再收费/淘宝/拍拍交易 联系QQ:12065661  邮箱[email protected] 淘宝店:http://shop116438515.taobao.com/ 跑包规矩  跑出密码不得以任何借口不付款凡是同时发给多个

统计信息不准导致执行计划出错跑不出结果,优化后只要1分钟

一天查看数据库长会话,发现1个sql跑得很慢,1个多小时不出结果,花了点时间把它给优化了. 优化前: SELECT 20131023, "A2"."ORG_ID", COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'DP' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(D

跑不过时间就跑过昨天的自己(早安心语)

无论这个世界对你怎样,都请你一如既往的努力.勇敢.充满希望. 人生自当如此,即便已时夕阳,也应该美丽. 距离并不可怕,可怕的是心越来越远. 有些问题,没有答案就是最后的答案:有的事情,没有结果就是最好的结果. 得而不喜,失而不忧,内心宁静,则幸福常在. 试着用左手握住右手,给了自己最简单的温暖,不再奢求别人的给予,开始学着自己给自己. 叶散的时候,才明白欢聚,花谢的时候,才明白青春. 淡然,如一朵花,清雅而素净:从容,如一棵树,茂密而青葱. 不要急,你想要的,岁月都会给你. 人生有太多的不可控,

砖石OTC跑分系统源码开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

微信跑分APP定制开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

支付宝跑分软件模式开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

微信跑分系统模式开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

砖石OTC跑分系统模式开发-跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提