2017-08-07 3 views
0
  • cadre Scrapy-Redis, Redis stockées xxx: les demandes ont été rampé terminé, mais le programme est toujours en cours d'exécution, comment arrêter automatiquement le programme, plutôt que ce qui a été en cours d'exécution?Le programme scrapy-Redis ne se ferme pas automatiquement

  • Le code en cours d'exécution:

2017-08-07 09:17:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2017-08-07 09:18:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

  • J'utilise scrapy-Redis pour explorer un site, scrapy-Redis aura pas automatiquement arrêté, toujours demander url, mais a pas d'URL. Ainsi, il sera toujours scraped 0 items (at 0 items/min)
+0

Quelle est la signification de votre question? – Nabin

+0

Wolcome to Stack Overflow. Nous ne pouvons pas vous aider si vous posez des questions comme celle-ci. –

+0

J'utilise scrapy-redis pour explorer un site, scrapy-redis ne s'arrêtera pas automatiquement, doit encore demander l'URL, mais n'a pas d'URL. Donc, il sera toujours '' '0 objets (à 0 items/min)' '' –

Répondre

0

scrapy-redis attendra toujours que les nouvelles URL soient poussées dans la file d'attente redis. Lorsque la file d'attente est vide, l'araignée entre état et attend de nouvelles URL. C'est ce que j'ai utilisé pour fermer mon araignée une fois que la file d'attente est vide. Quand l'araignée est dans idle (quand il ne fait rien), je vérifie s'il reste quelque chose dans la file d'attente Redis. Sinon, je ferme l'araignée avec close_spider. Le code suivant se trouve dans la classe spider:

@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') 
+0

Informations très utiles. Thk! –

0

Eh bien scrapy-redis est fait pour être toujours en attente ouverte pour plus urls être poussé dans la file d'attente Redis, mais si vous voulez le fermer vous pouvez le faire avec un pipeline, ici:

class TestPipeline(object): 

def __init__(self, crawler): 
    self.crawler = crawler 
    self.redis_db = None 
    self.redis_len = 0 

@classmethod 
def from_crawler(cls, crawler): 
    return cls(crawler) 

def open_spider(self, spider):   
    self.redis_len = len(spider.server.keys('your_redis_key')) 

def process_item(self, item, spider): 
    self.redis_len -= 1 
    if self.redis_len <= 0: 
     self.crawler.engine.close_spider(spider, 'No more items in redis queue') 

    return item 

Je vais vous expliquer comment cela fonctionne dans le pipeline open_spider obtenir le total des clés dans la file d'attente Redis et process_item il décrémente la variable et quand il atteint zéro redis_len envoyer un signal de fermeture du dernier élément.

+0

Utile.J'essaierai. Thk! –