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