2013-06-08 6 views
6

Ich habe ein Skript namens algorithm.py und ich möchte Scrapy-Spider während des Skripts aufrufen können. Die Datei scructure ist:Wie bestimmte Scrapy-Spider aus einem anderen Python-Skript aufgerufen werden

algorithm.py MySpiders/

wo MySpiders ist ein Ordner mehrere scrapy Projekte enthält. Ich möchte Methoden perform_spider1(), perform_spider2() ... erstellen, die ich in algorithm.py aufrufen kann.

Wie konstruiere ich diese Methode?

Ich habe es geschafft, eine Spinne mit dem folgenden Code aufzurufen, aber es ist keine Methode und es funktioniert nur für eine Spinne. Ich bin ein Anfänger, der Hilfe braucht!

import sys,os.path 
sys.path.append('path to spider1/spider1') 
from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 
from scrapy import log, signals 
from scrapy.xlib.pydispatch import dispatcher 
from spider1.spiders.spider1_spider import Spider1Spider 

def stop_reactor(): 
    reactor.stop() 

dispatcher.connect(stop_reactor, signal=signals.spider_closed) 

spider = RaListSpider() 
crawler = Crawler(Settings()) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start() 
log.msg('Running reactor...') 
reactor.run() # the script will block here 
log.msg('Reactor stopped.') 

Antwort

5

durch Ihre Spinnen Probier es einfach aus und setzt sie configure über den Aufruf, crawl und start, und nur dann log.start() und reactor.run() nennen. Und scrapy wird mehrere Spinnen in demselben Prozess laufen lassen. Für weitere Informationen siehe documentation und this thread.

Denken Sie auch daran, Ihre Spinnen über scrapyd zu betreiben.

Hoffe, dass hilft.

+0

Danke, Alecxe! Wie kann ich den Reaktor nach der letzten Spinne stoppen? Derzeit bin ich mit def stop_reactor(): reactor.stop() dispatcher.connect (stop_reactor, Signal = signals.spider_closed) jedoch hält dies nach der ersten Spinne ... –

+0

Sie sind willkommen. Gute Frage! Wie wäre es, die Spinnen im "stop_reactor" manuell zu verfolgen und den Reaktor zu stoppen, wenn alle geschlossen wären? Übrigens, ich habe die Antwort bearbeitet und den Link zu einem relevanten Thread eingefügt. – alecxe

+0

Danke, Kumpel. Ich habe nicht genug Reputation, um dich zu bewerten, aber ich stimme dich stattdessen moralisch ab :) –

2

Basierend auf dem guten Rat von Alecxe, hier ist eine mögliche Lösung.

import sys,os.path 
sys.path.append('/path/ra_list/') 
sys.path.append('/path/ra_event/') 
from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 
from scrapy import log, signals 
from scrapy.xlib.pydispatch import dispatcher 
from ra_list.spiders.ra_list_spider import RaListSpider 
from ra_event.spiders.ra_event_spider import RaEventSpider 

spider_count = 0 
number_of_spiders = 2 

def stop_reactor_after_all_spiders(): 
    global spider_count 
    spider_count = spider_count + 1 
    if spider_count == number_of_spiders: 
     reactor.stop() 


dispatcher.connect(stop_reactor_after_all_spiders, signal=signals.spider_closed) 

def crawl_resident_advisor(): 

    global spider_count 
    spider_count = 0 

    crawler = Crawler(Settings()) 
    crawler.configure() 
    crawler.crawl(RaListSpider()) 
    crawler.start() 

    crawler = Crawler(Settings()) 
    crawler.configure() 
    crawler.crawl(RaEventSpider()) 
    crawler.start() 

    log.start() 
    log.msg('Running in reactor...') 
    reactor.run() # the script will block here 
    log.msg('Reactor stopped.') 
Verwandte Themen