2012-06-28 17 views
7

en una línea similar a esta pregunta: stackoverflow: running-multiple-spiders-in-scrapyarañas edificio Scrapy en mi propio programa, no quiero llamar scrapy de línea de comandos)

Me pregunto, ¿puedo ejecutar un proyecto completo desde dentro scrapy otro programa python? Solo digamos que quería construir un programa completo que requiriera raspar varios sitios diferentes, y construyo proyectos completos de raspado para cada sitio.

en lugar de ejecutar desde la línea de comandos como uno de, quiero ejecutar estas arañas y obtener la información de ellos.

Puedo usar mongoDB en python ok, y ya puedo crear proyectos de scrapy que contengan arañas, pero ahora solo estoy fusionando todo en una sola aplicación.

Quiero ejecutar la aplicación una vez, y tienen la capacidad de controlar múltiples arañas de mi propio programa

Por qué hacer esto? bueno, esta aplicación también puede conectarse a otros sitios usando una API y necesita comparar los resultados del sitio API con el sitio raspado en tiempo real. No quiero tener que llamar a scrapy desde la línea de comandos, todo está destinado a ser autónomo.

(He estado haciendo muchas preguntas sobre el raspado hace poco, porque estoy tratando de encontrar la solución adecuada para construir en)

Gracias :)

Respuesta

7

Sí, por supuesto que puede;)

The idea (inspired from this blog post) es la creación de un trabajador y luego utilizarlo en su propio script de Python:

from scrapy import project, signals 
from scrapy.conf import settings 
from scrapy.crawler import CrawlerProcess 
from scrapy.xlib.pydispatch import dispatcher 
from multiprocessing.queues import Queue 
import multiprocessing 

class CrawlerWorker(multiprocessing.Process): 

    def __init__(self, spider, result_queue): 
     multiprocessing.Process.__init__(self) 
     self.result_queue = result_queue 

     self.crawler = CrawlerProcess(settings) 
     if not hasattr(project, 'crawler'): 
      self.crawler.install() 
     self.crawler.configure() 

     self.items = [] 
     self.spider = spider 
     dispatcher.connect(self._item_passed, signals.item_passed) 

    def _item_passed(self, item): 
     self.items.append(item) 

    def run(self): 
     self.crawler.crawl(self.spider) 
     self.crawler.start() 
     self.crawler.stop() 
     self.result_queue.put(self.items) 

Ejemplo de uso:

result_queue = Queue() 
crawler = CrawlerWorker(MySpider(myArgs), result_queue) 
crawler.start() 
for item in result_queue.get(): 
    yield item 

Otra forma sería la de ejecutar el comando scrapy rastreo con system()