2015-05-13 12 views
15

Ich muss den Crawler aus einer anderen Python-Datei aufrufen, für die ich den folgenden Code verwende.Aufruf von Scrapy aus einer anderen Datei ohne Threading

def crawl_koovs(): 
    spider = SomeSpider() 
    settings = get_project_settings() 
    crawler = Crawler(settings) 
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
    crawler.configure() 
    crawler.crawl(spider) 
    crawler.start() 
    log.start() 
    reactor.run() 

Auf diesem läuft, bekomme ich den Fehler als

exceptions.ValueError: signal only works in main thread 

Die einzige Abhilfe, die ich finden konnte verwenden

reactor.run(installSignalHandlers=False) 

die ich will nicht verwenden, wie ich will um diese Methode mehrmals aufzurufen und den Reaktor vor dem nächsten Aufruf anzuhalten. Was kann ich tun, damit dies funktioniert? (Vielleicht den Crawler zwingen, im selben Hauptthread zu starten)?

+0

Hier veraltet ist ein [Arbeitsbeispielcode] (http://stackoverflow.com/questions/18838494/scrapy-very-basic-example/27744766#27744766) I habe früher Scrapy vom Skript ausgeführt. Ich hoffe es hilft. – alecxe

Antwort

6

Das erste, was ich Ihnen sagen kann, ist, wenn Sie Scrapy aus externen Datei sind die Ausführung der loglevel auf INFO gesetzt ist, sollten Sie es auf DEBUG ändern, um zu sehen, was passiert, wenn Ihr Code nicht

funktioniert
log.start() 

für

:

sollten Sie die Zeile

log.start(loglevel=log.DEBUG) 

speichern alles im Protokoll und einen Text erzeugen Datei (für Debug-Zwecke), die Sie tun können:

log.start(logfile="file.log", loglevel=log.DEBUG, crawler=crawler, logstdout=False) 

über die Signale Problem mit dem Protokollebene geändert DEBUG vielleicht können Sie eine Ausgabe sehen, dass Sie es beheben helfen können, können Sie versuchen, das Skript zu setzen in den Scrapy-Projekt-Ordner, um zu sehen, ob noch Abstürze auftreten.

Wenn Sie die Zeile ändern:

crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 

für:

dispatcher.connect(reactor.stop, signals.spider_closed) 

Was sagen ist das?

Je nach Scrapy Version kann es