scrapy-redis在爬取页面完成后会处于空爬状态,不会自动结束

可以通过配置scrapy扩展来解决这个问题
在项目目录新建extensions.py
import time
from scrapy import signals
from scrapy.exceptions import NotConfigured
class ScrapyRedisAutoClose(object):
def __init__(self, item_count, crawler):
self.item_count = item_count
self.crawler = crawler
self.count = 0 # 统计空闲次数
self.idle_time = None # 记录时间,可有可无
@classmethod
def from_crawler(cls, crawler):
# 判断是否启用扩展
if not crawler.settings.getbool('MYEXT_ENABLED'):
raise NotConfigured
# MYEXT_ITEMCOUNT 默认10分钟,时间单位为12次每分钟,空闲时5秒进来一次
item_count = crawler.settings.getint('MYEXT_ITEMCOUNT', 120)
ext = cls(item_count, crawler)
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):
spider.log("opened spider %s" % spider.name)
def spider_closed(self, spider):
spider.log("closed spider %s" % spider.name)
def spider_idle(self, spider):
"""
记录信息,作出关闭选择
:param spider:
:return:
"""
# 记录第一次进入的时间
if self.count == 0:
self.idle_time = time.time()
# 判断redis_key中是否为空,如果为空时,则空闲一次,统计 + 1
if not spider.server.exists(spider.redis_key):
self.count += 1
else:
self.count = 0
# 空闲超过指定次数,结束程序
if self.count > self.item_count:
spider.log("spider continued idle number exceed:%s idle datetiem exceed:%s" % (
self.count, time.time() - self.idle_time))
# 发送结束信号
self.crawler.engine.close_spider(spider, 'close spider')
修改settings.py
# redis没有requests时自动关闭爬虫
MYEXT_ENABLED = True # 开启扩展
MYEXT_ITEMCOUNT = 60 # 配置空闲持续时间单位为 60个 ,一个时间单位为5s,即5分钟
# 在 EXTENSIONS 配置,激活扩展
EXTENSIONS = {
'<项目名>.extensions.ScrapyRedisAutoClose': 540,
}
本文介绍了如何处理scrapy-redis在完成页面爬取后仍然处于空爬状态的问题。通过创建自定义scrapy扩展并在settings.py中进行配置,可以确保爬虫在没有更多任务时自动结束。
1万+

被折叠的 条评论
为什么被折叠?



