平时使用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
}