2013-06-08 19 views
6

私はalgorithm.pyというスクリプトを持っています。スクリプト中にScrapyスパイダーを呼びたいと思っています。ファイルscructureは次のとおりです。MySpidersは、いくつかのscrapyプロジェクトを含むフォルダである MySpiders/別のPythonスクリプトから特定のScrapyスパイダーを呼び出す方法

algorithm.py

。私はperform_spider1()、perform_spider2()...アルゴリズムを呼び出すことができるメソッドを作成したいと思います。

このメソッドを作成するにはどうすればよいですか?

私は、次のコードを使用して1つのスパイダーを呼び出すことができましたが、方法ではなく、1つのスパイダーに対してのみ機能します。私は助けが必要な初心者です!

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

答えて

5

ちょうどあなたのスパイダーを通過し、configurecrawlstartを呼び出し経由でそれらを設定し、だけにしてlog.start()reactor.run()を呼び出します。そして、治療は同じプロセスで複数のスパイダーを実行します。

詳細はdocumentationthis threadを参照してください。

さらに、スパイダーをscrapydで実行することを検討してください。

希望に役立ちます。

+0

ありがとう、alecxe!最後のスパイダーの後に原子炉を止めるにはどうすればいいですか?現在、私は)( デフstop_reactorを使用しています: reactor.stop() dispatcher.connect(stop_reactor、信号= signals.spider_closed) はしかし、これはあなたが歓迎されている最初のクモ... –

+0

後に停止します。良い質問!どのようにスパイダーの追跡を 'stop_reactor'で手動で閉じて、すべてが閉じていれば原子炉を停止するのですか? Btw、私は答えを編集し、関連するスレッドへのリンクを含めました。 – alecxe

+0

ありがとう、仲間。私はあなたに投票するのに十分な評判を持っていませんが、私は道徳的に投票します:) –

2

alecxeの良いアドバイスに基づいて、ここに解決策があります。

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.') 
関連する問題