web scraping - mac - Ejecutando múltiples arañas en el mismo proceso, una araña a la vez
scrapy vs beautifulsoup (1)
Tengo una situación en la que tengo un CrawlSpider que busca resultados usando códigos postales y categorías (datos POST). Necesito obtener todos los resultados para todas las categorías en todos los códigos postales. Mi spider toma un código postal y una categoría como argumentos para los datos POST. Quiero iniciar programáticamente una araña para cada combinación de código postal / categoría a través de un script.
La documentación explica que puede ejecutar varias arañas por proceso con este ejemplo de código aquí: http://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same-process This es lo mismo que quiero hacer; sin embargo, quiero básicamente hacer cola a las arañas para que se ejecuten una tras otra después de que termine la araña anterior.
¿Alguna idea sobre cómo lograr esto? Parece haber algunas respuestas que se aplican a versiones anteriores de scrapy (~ 0.13) pero la arquitectura ha cambiado y ya no funcionan con la última versión estable (0.24.4)
Puede confiar en la señal spider_closed
para comenzar a rastrear el próximo código postal / categoría. Aquí está el código de muestra (no probado) basado en esta respuesta y adoptado para su caso de uso:
from scrapy.crawler import Crawler
from scrapy import log, signals
from scrapy.settings import Settings
from twisted.internet import reactor
# for the sake of an example, sample postal codes
postal_codes = [''10801'', ''10802'', ''10803'']
def configure_crawler(postal_code):
spider = MySpider(postal_code)
# configure signals
crawler.signals.connect(callback, signal=signals.spider_closed)
# detach spider
crawler._spider = None
# configure and start the crawler
crawler.configure()
crawler.crawl(spider)
# callback fired when the spider is closed
def callback(spider, reason):
try:
postal_code = postal_codes.pop()
configure_crawler(postal_code)
except IndexError:
# stop the reactor if no postal codes left
reactor.stop()
settings = Settings()
crawler = Crawler(settings)
configure_crawler(postal_codes.pop())
crawler.start()
# start logging
log.start()
# start the reactor (blocks execution)
reactor.run()