tutorial mac for example web-scraping scrapy scrapy-spider

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()