解决 scrapy redis爬虫空跑,redis中的链接跑完后,程序仍然在监听队列,不关闭问题

平时使用scrapy redis主从式爬虫的时候,一般都是每天都会有爬取,所以没有考虑过这个问题,但是现在有个爬虫项目,redis队列是直接生成的,并且数量是一定的,所以在使用 scrapy slave时,需要判断一下队列是否已经被爬取完毕!

经过度娘指点,知道了需要重写 spider_idle 方法,在该方法中写自己的规则来判断是否要停止爬取。

感谢!!!  http://www.mamicode.com/info-detail-2225397.html

我在此基础上写了自己的规则,不需要像他一样等待那么长时间,我只要判断redis为空时,立刻停止爬虫即可

所以我的规则是这样的:


import redis
from scrapy import signals


class RedisSpiderClosedExensions(object):
    def __init__(self, crawler, host, port, pwd, db):
        self.crawler = crawler
        # 链接redis
        self.r = redis.Redis(host=host, port=port, db=db, password=pwd, decode_responses=True)

    @classmethod
    def from_crawler(cls, crawler):
        ext = cls(crawler,
                  # 获取redis参数
                  host=crawler.settings.get("REDIS_HOST"),
                  port=crawler.settings.get("REDIS_PORT"),
                  pwd=crawler.settings.get("REDIS_PARAMS")['password'],
                  db=crawler.settings.get("REDIS_PARAMS")['db']
                  )
        # 指定重写方法
        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 ext

    def spider_opened(self, spider):
        print('-----spider开启-----')

    def spider_closed(self, spider):
        print('-----spider关闭-----')

    def spider_idle(self, spider):
        # 获取队列的长度
        length = self.r.llen('demo')
        if length == 0:
            # 如果redis长度为0,则关闭该spider
            self.crawler.engine.close_spider(spider, 'closespider_pagecount')

附上我的setting中相关配置:


EXTENSIONS = {
    'DemoScrapy.RedisSpiderClosedExensions.RedisSpiderClosedExensions': 500,
}


REDIS_HOST = 'localhost'
REDIS_PORT = 6379
redis_db = 0
REDIS_PARAMS = {
    'password': '',  # 入无密码,可用 '' 代替,也可不写
    'db': redis_db
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值