2015-03-11 17 views
5

Próbuję sprawić, że mój Spider Scrapy zostanie uruchomiony ponownie, jeśli przyczyną zamknięcia jest moje połączenie z Internetem (podczas gdy w nocy internet zejdzie na 5 minut). Kiedy internet schodzi pająk zamyka się po 5 próbach.Scrapy Spider: Ponownie uruchom pająka, gdy kończy się

Próbuję użyć tej funkcji w mojej definicji pająka próbuje zrestartować pająka kiedy zamknięty:

def handle_spider_closed(spider, reason): 
    relaunch = False 
    for key in spider.crawler.stats._stats.keys(): 
     if 'DNSLookupError' in key: 
      relaunch = True 
      break 

    if relaunch: 
     spider = mySpider() 
     settings = get_project_settings() 
     crawlerProcess = CrawlerProcess(settings) 
     crawlerProcess.configure() 
     crawlerProcess.crawl(spider) 
     spider.crawler.queue.append_spider(another_spider) 

próbowałem wiele rzeczy, jak ponownie instancję pająka ale dostałem błąd reaktor jest już działający lub coś w tym stylu.

Pomyślałem o wykonaniu pająka ze skryptu, a kiedy pająk zakończy to połączenie, ale nie zadziałało, ponieważ reaktor nadal jest w użyciu.

  • Moją intencją jest, aby zresetować pająk po jego zamknięciu (pająk zamyka, ponieważ stracił połączenie z Internetem)

Czy ktoś zna dobry i łatwy sposób to zrobić?

+0

Scenariusz badać będzie za pomocą pracy scrapy (http://doc.scrapy.org/en/latest/topics/jobs.html) do czynienia z zachowaniem między różnymi instancjami pająków i skryptami powłoki, aby sprawdzać na przykład co 10 minut, czy proces scrapy jest aktywny. jeśli nie ponownie go uruchom. – aberna

+0

Po prostu strzał w ciemności: co by było, gdyby użyć spider.crawler.crawl (spider) po przywróceniu pająka? Dzięki. – alecxe

+0

Czytałem te dokumenty, ale nie rozumiem, jak automatycznie ponownie uruchomić pająka, gdy zamyka się – AlvaroAV

Odpowiedz

5

Znalazłem rozwiązanie mojego problemu! Co próbowałem zrobić?

  • Uchwyt pająka, gdy nie powiedzie się lub zamyka
  • Spróbuj ponownie wykonać Spider, gdy zamyka

udało mi przez obsługę błędu pająka tak:

import time 

class mySpider(scrapy.Spider): 
    name = "myspider" 
    allowed_domains = ["google.com"] 
    start_urls = [ 
     "http://www.google.com", 
    ] 

    def handle_error(self, failure): 
     self.log("Error Handle: %s" % failure.request) 
     self.log("Sleeping 60 seconds") 
     time.sleep(60) 
     url = 'http://www.google.com' 
     yield scrapy.Request(url, self.parse, errback=self.handle_error, dont_filter=True) 

    def start_requests(self): 
     url = 'http://www.google.com' 
     yield scrapy.Request(url, self.parse, errback=self.handle_error) 
  • Użyłem dont_filter=True, aby Spider zezwolił na duplikowanie żądania, tylko wtedy, gdy przechodzi błąd.
  • errback=self.handle_error sprawia Spider przejść zwyczaju handle_error funkcja
Powiązane problemy