2012-06-26 12 views
9

Ich möchte einen Crawler in Scrapy von einem Python-Modul starten. Ich möchte im Wesentlichen das Wesen der $ scrapy crawl my_crawler -a some_arg=value -L DEBUGWas ist der einfachste Weg zum programmatischen Starten eines Crawlers in Scrapy> = 0.14

imitieren habe ich folgende Dinge im Ort:

  • eine settings.py Datei für das Projekt
  • Artikel und Pipelines
  • ein Crawler-Klasse, die BaseSpider erstreckt und erfordert Argumente bei der Initialisierung.

ich ganz glücklich mein Projekt mit dem scrapy Befehl wie oben angegeben ausgeführt werden kann, aber ich schreibe Tests Integration und ich möchte programmatisch:

  • Einführung der Crawl die Einstellungen in settings.py und die Verwendung von Crawler, das my_crawler name-Attribut hat (ich kann diese Klasse instanziiert leicht von meinem Testmodul.
  • ich alle Pipelines und Middleware will gemäß der Beschreibung in settings.py verwendet werden.
  • Ich bin froh, dass der Prozess blockiert wird, bis der Crawler fertig ist. Die Pipelines deponieren Dinge in einer DB und es ist der Inhalt der Datenbank, die ich nach dem Crawl untersuchen werde, um meine Tests zu erfüllen.

Also, kann mir jemand helfen? Ich habe einige Beispiele im Netz gesehen, aber sie sind entweder Hacks für mehrere Spinnen, oder umgehen Twisted's Blockierung der Natur, oder nicht mit Scrapy 0.14 oder höher arbeiten. Ich brauche einfach etwas wirklich Einfaches. Siehe :-)

+1

was mit 'subprocess.check_output falsch ist ([ 'scrapy' , ...], stderr = Unterprozess.STDOUT) '? – jfs

+1

Ich fühle, dass das Starten eines anderen Prozesses und das Ausführen des externen Skripts ein bisschen wie ein Hack ist. Ich weiß, dass es möglich ist, es innerhalb desselben Prozesses (natürlich) zu tun, und ich würde gerne wissen, wie ich es selbst machen kann. :-) – Edwardr

+2

es ist kein hack, wenn es ein integrationstest ist, sonst würdest du von einer bestimmten scrapy-version abhängen (einbauten ändern sich schneller als die kommandozeilenschnittstelle) – jfs

Antwort

7
from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 
from scrapy import log, signals 
from testspiders.spiders.followall import FollowAllSpider 

spider = FollowAllSpider(domain='scrapinghub.com') 
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 

this part of the docs

3

@ Wilfred Antwort von offiziellen Dokumente funktioniert gut Teil mit Ausnahme der Anmeldung, hier gehört mir:

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() 
crawler = crawler = Crawler(get_project_settings()) 
crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start_from_settings(get_project_settings()) 
reactor.run() 
Verwandte Themen