scrapy-redis
attendra toujours que de nouvelles URL soient poussées dans la file d'attente Redis. Lorsque la file d'attente est vide, l'araignée passe en inactif état et attend de nouvelles URL. C'est ce que j'ai utilisé pour fermer mon araignée une fois la file d'attente vide.
Lorsque l'araignée est en inactivité (quand ça ne fait rien), je vérifie s'il reste encore quelque chose dans la file d'attente redis. Sinon, je ferme l'araignée avec close_spider
. Le code suivant est situé dans le spider
classe :
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
from_crawler = super(SerpSpider, cls).from_crawler
spider = from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.idle, signal=scrapy.signals.spider_idle)
return spider
def idle(self):
if self.q.llen(self.redis_key) <= 0:
self.crawler.engine.close_spider(self, reason='finished')