2013-03-22 6 views
10

Scrapyデーモンを使わずにScrapyプロジェクトですべてのスパイダーを実行する方法はありますか?以前はscrapy crawlで複数のスパイダーを実行する方法がありましたが、その構文は削除され、Scrapyのコードはかなり変更されました。Scrapyのすべてのスパイダーをローカルで実行する

私は自分のコマンドを作成してみました:

from scrapy.command import ScrapyCommand 
from scrapy.utils.misc import load_object 
from scrapy.conf import settings 

class Command(ScrapyCommand): 
    requires_project = True 

    def syntax(self): 
     return '[options]' 

    def short_desc(self): 
     return 'Runs all of the spiders' 

    def run(self, args, opts): 
     spman_cls = load_object(settings['SPIDER_MANAGER_CLASS']) 
     spiders = spman_cls.from_settings(settings) 

     for spider_name in spiders.list(): 
      spider = self.crawler.spiders.create(spider_name) 
      self.crawler.crawl(spider) 

     self.crawler.start() 

しかし、クモがself.crawler.crawl()に登録されると、私は他のクモのすべてのためのアサーションエラーを取得:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/scrapy/cmdline.py", line 138, in _run_command 
    cmd.run(args, opts) 
    File "/home/blender/Projects/scrapers/store_crawler/store_crawler/commands/crawlall.py", line 22, in run 
    self.crawler.crawl(spider) 
    File "/usr/lib/python2.7/site-packages/scrapy/crawler.py", line 47, in crawl 
    return self.engine.open_spider(spider, requests) 
    File "/usr/lib/python2.7/site-packages/twisted/internet/defer.py", line 1214, in unwindGenerator 
    return _inlineCallbacks(None, gen, Deferred()) 
--- <exception caught here> --- 
    File "/usr/lib/python2.7/site-packages/twisted/internet/defer.py", line 1071, in _inlineCallbacks 
    result = g.send(result) 
    File "/usr/lib/python2.7/site-packages/scrapy/core/engine.py", line 215, in open_spider 
    spider.name 
exceptions.AssertionError: No free spider slots when opening 'spidername' 

にどのような方法がありますこれを行う?私はむしろ、このようなすべてのスパイダーを実行するためにコアのScrapyコンポーネントのサブクラス化を開始したくないでしょう。ここで

+0

あなたはどのようなScrapyバージョンを使用していますか? '$ scrapy version -v' –

+0

[' scrapyd'](http://doc.scrapy.org/ja/latest/topics/scrapyd.html)について知っていますか? –

+0

「0.16.4」。私はScrapydについて知っているが、私はこれらのスパイダーをローカルでテストしているので、むしろそれを使用したくない。 – Blender

答えて

16

は、カスタムコマンド内で実行されない例であるが、手動で原子炉を実行し、新しいクローラfor each spiderを作成します。

from twisted.internet import reactor 
from scrapy.crawler import Crawler 
# scrapy.conf.settings singlton was deprecated last year 
from scrapy.utils.project import get_project_settings 
from scrapy import log 

def setup_crawler(spider_name): 
    crawler = Crawler(settings) 
    crawler.configure() 
    spider = crawler.spiders.create(spider_name) 
    crawler.crawl(spider) 
    crawler.start() 

log.start() 
settings = get_project_settings() 
crawler = Crawler(settings) 
crawler.configure() 

for spider_name in crawler.spiders.list(): 
    setup_crawler(spider_name) 

reactor.run() 

すべてのスパイダーがあるときは、原子炉を停止するsome signal systemを設計する必要があります終了しました。

編集:そして、ここでカスタムコマンドで複数のクモを実行することができる方法である。

scrapy list|xargs -n 1 scrapy crawl 

from scrapy.command import ScrapyCommand 
from scrapy.utils.project import get_project_settings 
from scrapy.crawler import Crawler 

class Command(ScrapyCommand): 

    requires_project = True 

    def syntax(self): 
     return '[options]' 

    def short_desc(self): 
     return 'Runs all of the spiders' 

    def run(self, args, opts): 
     settings = get_project_settings() 

     for spider_name in self.crawler.spiders.list(): 
      crawler = Crawler(settings) 
      crawler.configure() 
      spider = crawler.spiders.create(spider_name) 
      crawler.crawl(spider) 
      crawler.start() 

     self.crawler.start() 
+0

ありがとう、これはまさに私がやろうとしていたものです。 – Blender

+0

私はどのようにプログラムにスターをつけますか? – user1787687

+0

コードをテキストエディタに置き、 'mycoolcrawler.py'として保存します。 Linuxでは、保存したディレクトリのコマンドラインから 'python mycoolcrawler.py'を実行することができます。おそらく、Windowsではfile-managerからダブルクリックするだけです。 –

14

なぜあなただ​​けのようなものを使用していませんでしたか?

+1

すべてのスパイダーを並列に実行するには、 'xargs'に' -P 0'オプションを使います。 – rgtk

4

は@Steven Almerothの答えはScrapy 1.0に失敗するだろう、とあなたは次のようにスクリプトを編集する必要があります

from scrapy.commands import ScrapyCommand 
from scrapy.utils.project import get_project_settings 
from scrapy.crawler import CrawlerProcess 

class Command(ScrapyCommand): 

    requires_project = True 
    excludes = ['spider1'] 

    def syntax(self): 
     return '[options]' 

    def short_desc(self): 
     return 'Runs all of the spiders' 

    def run(self, args, opts): 
     settings = get_project_settings() 
     crawler_process = CrawlerProcess(settings) 

     for spider_name in crawler_process.spider_loader.list(): 
      if spider_name in self.excludes: 
       continue 
      spider_cls = crawler_process.spider_loader.load(spider_name) 
      crawler_process.crawl(spider_cls) 
     crawler_process.start() 
0

このコードマイscrapyバージョンの作品は1.3.3です(同じに保存ディレクトリscrapy.cfg):

from scrapy.utils.project import get_project_settings 
from scrapy.crawler import CrawlerProcess 

setting = get_project_settings() 
process = CrawlerProcess(setting) 

for spider_name in process.spiders.list(): 
    print ("Running spider %s" % (spider_name)) 
    process.crawl(spider_name,query="dvh") #query dvh is custom argument used in your scrapy 

process.start() 
関連する問題