2016-05-03 7 views
0

Ich habe eine Spinne, die Links für die Websites durchläuft. Ich möchte dieselbe Spinne erneut starten, wenn die Ausführung mit anderen Datensätzen beendet ist. Wie kann derselbe Crawler erneut gestartet werden? Die Websites werden durch die Datenbank geleitet. Ich möchte, dass der Crawler in einer unbegrenzten Schleife läuft, bis alle Websites gecrawlt sind. Derzeit muss ich den Crawler scrapy crawl first die ganze Zeit starten. Gibt es eine Möglichkeit, den Crawler einmal zu starten, und er stoppt, wenn alle Websites gecrawlt werden?Aufruf der gleichen Spinne programmgesteuert

ich für das gleiche gesucht, und eine Lösung gefunden, um den Crawler einmal seine geschlossenen/Fertig Handhabung. Aber ich weiß nicht, wie man die Spinne von der closed_handler Methode programmatisch nennt.

Nachstehend ist mein Code:

class MySpider(CrawlSpider): 
     def __init__(self, *args, **kwargs): 
      super(MySpider, self).__init__(*args, **kwargs) 
      SignalManager(dispatcher.Any).connect(
       self.closed_handler, signal=signals.spider_closed) 

     def closed_handler(self, spider): 
      reactor.stop() 
      settings = Settings() 
      crawler = Crawler(settings) 
      crawler.signals.connect(spider.spider_closing, signal=signals.spider_closed) 
      crawler.configure() 
      crawler.crawl(MySpider()) 
      crawler.start() 
      reactor.run() 

     # code for getting the websites from the database 
     name = "first" 
     def parse_url(self, response): 
      ... 

Ich erhalte die Fehlermeldung:

Error caught on signal handler: <bound method ?.closed_handler of <MySpider 'first' at 0x40f8c70>> 

Traceback (most recent call last): 
    File "c:\python27\lib\site-packages\twisted\internet\defer.py", line 150, in maybeDeferred 
    result = f(*args, **kw) 
    File "c:\python27\lib\site-packages\scrapy\xlib\pydispatch\robustapply.py", line 57, in robustApply 
    return receiver(*arguments, **named) 
    File "G:\Scrapy\web_link_crawler\web_link_crawler\spiders\first.py", line 72, in closed_handler 
    crawler = Crawler(settings) 
    File "c:\python27\lib\site-packages\scrapy\crawler.py", line 32, in __init__ 
    self.spidercls.update_settings(self.settings) 
AttributeError: 'Settings' object has no attribute 'update_settings' 

Ist dies der richtige Weg, dies zu tun bekommen? Oder gibt es einen anderen Weg? Bitte helfen Sie!

Danke

+1

[Scrapy docs haben einen Abschnitt über mehrere Spinnen in einem Skript ausgeführt] (http://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same- Prozess), und am Ende gibt es ein Beispiel dafür, wie Spinnen sequenziell ausgeführt werden, _ _ –

Antwort

1

Ein anderer Weg, um sie in eine Datei zu tun, würde es ein neues Skript zu machen, wo Sie die Links aus der Datenbank auswählen und speichern und dann dem scrapy Skript

os.system("scrapy crawl first") 

auf diese Weise nennen und lade die Links aus der Datei auf deine Spinne und arbeite von dort aus weiter.

Wenn Sie die Datenbank für neue Verbindungen ständig zu überprüfen, in dem ersten Skript rufen Sie einfach die Datenbank von Zeit zu Zeit in einer Endlosschleife und den scrapy Anruf neue Links!

+0

Dank Rafael Almeida „durch Verkettung die deferreds der Spinnen nacheinander laufen“ .. :) Dies ist eigentlich für mich gearbeitet. Ich habe eine neue Python-Datei erstellt und folgenden Code eingegeben: import os während True: os.system ("scrapy crawl first") –