2013-06-08 22 views
6

Ben algoritm.py adlı bir komut dosyası var ve Script örümcekleri komut dosyası sırasında arayabilmek istiyorum. Dosya scructure geçerli:Belirli bir Python komut dosyasından özel Scrapy örümcekleri nasıl çağırılır

algorithm.py MySpiders/

MySpiders birkaç scrapy projelerini içeren bir klasör

. Algorithm.py'de arayabileceğim perform_spider1(), perform_spider2() ... yöntemlerini oluşturmak istiyorum.

Bu yöntemi nasıl oluştururum?

Aşağıdaki kodu kullanarak bir örümcek çağırmayı başardım, ancak bu bir yöntem değildir ve yalnızca bir örümcek için çalışır. Ben yardıma muhtaç bir başlangıç ​​yapıyorum!

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.') 

cevap

5

Sadece örümcekler geçmesi ve configure, crawl ve start arayarak yoluyla bunları ayarlayabilir ve ancak o zaman log.start() ve reactor.run() arayın. Ve terapi aynı işlemde birden fazla örümcek çalıştırır.

Daha fazla bilgi için bkz. documentation ve this thread.

Ayrıca örümceklerinizi scrapyd üzerinden çalıştırmayı düşünebilirsiniz.

Bu yardımcı olur umarım.

+0

Teşekkürler, alecxe! Son örümcekden sonra reaktörü nasıl durdurabilirim? Şu anda def stop_reactor() kullanıyorum: reactor.stop() dispatcher.connect (stop_reactor, sinyal = signals.spider_closed) Ancak bu Rica ederiz –

+0

... ilk örümcek sonra durur. İyi soru! Örümceklerin izini tutmak 'stop_reactor' el ile kapatıldı ve eğer hepsi kapatıldıysa reaktör durduruldu? Btw, cevabı düzenledim ve bağlantıyı ilgili bir konuya dahil ettim. – alecxe

+0

Teşekkürler, dostum. Size oy vermek için yeterli saygınlığım yok ama ben sizi ahlaki olarak oy kullanıyorum :) –

2

Aleksadan iyi tavsiyelere dayanarak, burada olası bir çözümdür.

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.') 
İlgili konular