spider create python twisted scrapy

python - create - scrapy spider



El rastreo de Scrapy desde el script siempre bloquea la ejecución del script después del raspado (2)

Estoy siguiendo esta guía http://doc.scrapy.org/en/0.16/topics/practices.html#run-scrapy-from-a-script para ejecutar scrapy desde mi script. Aquí es parte de mi guión:

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!"

Funciona como debería: visita páginas, raspa la información necesaria y almacena el json de salida donde lo dije (a través de FEED_URI). Pero cuando Spider finaliza su trabajo (puedo verlo por número en la salida json) la ejecución de mi script no se reanudaría. Probablemente no sea un problema desagradable. Y la respuesta debe estar en algún lugar en el reactor retorcido. ¿Cómo podría liberar ejecución de hilo?


Deberás detener el reactor cuando la araña termine. Puedes lograr esto escuchando la señal spider_closed :

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.'')

Y la salida del registro de la línea de comandos puede verse algo así como:

stav@maia:/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. stav@maia:/srv/scrapy/testspiders$


En scrapy 0.19.x debes hacer esto:

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

Nota estas lineas

settings = get_project_settings() crawler = Crawler(settings)

Sin ella, su araña no usará su configuración y no guardará los elementos. Me tomó un tiempo averiguar por qué el ejemplo en la documentación no estaba guardando mis artículos. Envié una solicitud de extracción para arreglar el ejemplo del documento.

Una forma más de hacerlo es simplemente llamar al comando directamente desde su script

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