2012-06-28 11 views
7

in ähnlicher Weise auf diese Frage: stackoverflow: running-multiple-spiders-in-scrapyGebäude scrapy Spinnen in mein eigenes Programm, ich will nicht scrapy von der Kommandozeile aufrufen)

Ich frage mich, kann ich eine ganze scrapy Projekt von innen laufen ein anderes Python-Programm? Sagen wir einfach, ich wollte ein ganzes Programm erstellen, das mehrere verschiedene Seiten scrapen musste, und ich erstelle ganze Scrapy-Projekte für jede Site.

statt von der Befehlszeile als eine der laufen, möchte ich diese Spinnen laufen und die Informationen von ihnen erwerben.

Ich kann mongoDB in Python ok verwenden, und ich kann bereits Scrapy-Projekte erstellen, die Spider enthalten, aber jetzt alles in eine Anwendung zusammenfassen.

Ich möchte einmal die Anwendung auszuführen, und haben die Möglichkeit, mehrere Spinnen von meinem eigenen Programm zu steuern

Warum dies tun? Nun, diese Anwendung kann auch eine Verbindung zu anderen Sites über eine API herstellen und Ergebnisse in Echtzeit von der API-Site mit der Scraped-Site vergleichen. Ich möchte nicht immer Scrapy von der Kommandozeile aus aufrufen müssen, alles soll eigenständig sein.

(Ich habe viele Fragen zu stellen, um vor kurzem Schaben, weil ich die richtige Lösung zu finden versuchen zu bauen in)

Thanks :)

Antwort

7

Ja, natürlich können Sie;)

The idea (inspired from this blog post) ist ein Arbeiter zu erstellen und es dann in Ihrem eigenen Python-Skript verwenden:

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) 

Beispiel:

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

Ein anderer Weg, mit system()

den scrapy Crawl Befehl auszuführen wäre