2013-02-08 4 views
19

Ich folge diesem Leitfaden http://doc.scrapy.org/en/0.16/topics/practices.html#run-scrapy-from-a-script Scrapy von meinem Skript ausführen. Hier ist ein Teil meiner Skript:Scrapy Crawl von Skript blockiert immer Skriptausführung nach dem Scrapen

crawler = Crawler(Settings(settings)) 
    crawler.configure() 
    spider = crawler.spiders.create(spider_name) 
    crawler.crawl(spider) 
    crawler.start() 
    log.start() 
    reactor.run() 
    print "It can't be printed out!" 

Es funktioniert es soll: Besuche Seiten, kratzen benötigte Informationen und speichert Ausgabe json, wo ich ihm gesagt (via FEED_URI). Aber wenn Spinne seine Arbeit beendet (ich kann es durch Nummer in Ausgabe json sehen) würde die Ausführung meines Skripts nicht fortgesetzt. Wahrscheinlich ist es nicht scrapy Problem. Und Antwort sollte irgendwo im verdrehten Reaktor sein. Wie kann ich die Thread-Ausführung freigeben?

+0

Wrap diesen Code in einem neuen Skript und nennen das vielleicht? – Talvalin

+0

Ich bin mir nicht sicher, ob ich Ihren Kommentar richtig verstanden habe. Was meinst du "Call the Script"? Es hängt direkt in reactor.run() und log schreibt mir: "INFO: Closing Spinne (fertig)" so Spinne scheint fertig zu sein. –

Antwort

28

Sie müssen den Reaktor stoppen, wenn die Spinne beendet ist. Sie können dies für das spider_closed Signal durch das Hören erreichen:

from twisted.internet import reactor 

from scrapy import log, signals 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 
from scrapy.xlib.pydispatch import dispatcher 

from testspiders.spiders.followall import FollowAllSpider 

def stop_reactor(): 
    reactor.stop() 

dispatcher.connect(stop_reactor, signal=signals.spider_closed) 
spider = FollowAllSpider(domain='scrapinghub.com') 
crawler = Crawler(Settings()) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start() 
log.msg('Running reactor...') 
reactor.run() # the script will block here until the spider is closed 
log.msg('Reactor stopped.') 

und die Protokollausgabe Befehlszeile könnte etwa wie folgt aussehen:

[email protected]:/srv/scrapy/testspiders$ ./api 
2013-02-10 14:49:38-0600 [scrapy] INFO: Running reactor... 
2013-02-10 14:49:47-0600 [followall] INFO: Closing spider (finished) 
2013-02-10 14:49:47-0600 [followall] INFO: Dumping Scrapy stats: 
    {'downloader/request_bytes': 23934,...} 
2013-02-10 14:49:47-0600 [followall] INFO: Spider closed (finished) 
2013-02-10 14:49:47-0600 [scrapy] INFO: Reactor stopped. 
[email protected]:/srv/scrapy/testspiders$ 
+2

Es sollte unbedingt in Dokumentationen beschrieben werden. Vielen Dank. –

+0

Ich habe eine Pull-Anfrage eingereicht, die beschreibt, wie man den Reaktor auf die Scrapy-Dokumentation stoppt, sollte es bald sein :) –

+1

Wenn scrapy vom Skript wie das ausgeführt wird, wie übermittele ich Argumente für scrapy? Wie '-o output.json -t json' – Medeiros

6

In scrapy 0.19.x Sie sollten dies tun:

from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy import log, signals 
from testspiders.spiders.followall import FollowAllSpider 
from scrapy.utils.project import get_project_settings 

spider = FollowAllSpider(domain='scrapinghub.com') 
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() # the script will block here until the spider_closed signal was sent 

Hinweis diese Linien

settings = get_project_settings() 
crawler = Crawler(settings) 

Ohne Ihre Spinne werden Ihre Einstellungen nicht verwendet und die Objekte werden nicht gespeichert. Ich brauchte eine Weile, um herauszufinden, warum das Beispiel in der Dokumentation meine Artikel nicht speicherte. Ich habe eine Pull-Anfrage gesendet, um das Doc-Beispiel zu beheben.

Eine weitere Möglichkeit, es zu tun ist Befehl rufen Sie einfach direkt von Ihnen Skript

from scrapy import cmdline 
cmdline.execute("scrapy crawl followall".split()) #followall is the spider's name