2013-03-22 11 views
10

Czy istnieje sposób na uruchomienie wszystkich pająków w projekcie Scrapy bez użycia demona Scrapy? Był kiedyś sposób na uruchomienie wielu pająków z scrapy crawl, ale ta składnia została usunięta, a kod Scrapy zmienił się całkiem sporo.Lokalnie uruchomić wszystkie pająki w Scrapy

Próbowałem tworzyć własne komendy:

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() 

Ale gdy pająk jest zarejestrowany self.crawler.crawl(), otrzymuję błędy twierdzenie dla wszystkich innych pająków:

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' 

Czy istnieje jakiś sposób, aby Zrób to? Wolałbym nie rozpoczynać podklasowania składników Core Scrapy, tylko po to, aby uruchomić wszystkie moje pająki w ten sposób.

+0

Jakiej wersji Scrapy używasz? '$ scrapy version -v' –

+0

Czy wiesz o [' scrapyd'] (http://doc.scrapy.org/en/latest/topics/scrapyd.html)? –

+0

'0.16.4'. Wiem o Scrapyd, ale testuję te pająki lokalnie, więc wolałbym go nie używać. – Blender

Odpowiedz

16

Oto przykład, który nie działa wewnątrz polecenia niestandardowego, ale uruchamia Reactor ręcznie i tworzy nowy Crawler 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() 

trzeba będzie zaprojektować some signal system zatrzymać reaktor gdy wszystkie pająki są skończone.

EDIT: A oto w jaki sposób można uruchomić wiele pająki w poleceniu niestandardowym:

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

Dziękuję, właśnie to próbowałem zrobić. – Blender

+0

Jak wyróżnić program? – user1787687

+0

Umieść kod w edytorze tekstu i zapisz jako 'mycoolcrawler.py'. W Linuksie prawdopodobnie możesz uruchomić 'python mycoolcrawler.py' z wiersza poleceń w katalogu, w którym go zapisałeś. W Windows możesz po prostu dwukrotnie kliknąć go w menedżerze plików. –

14

Dlaczego nie wystarczy użyć coś takiego:

scrapy list|xargs -n 1 scrapy crawl 

?

+1

Użyj opcji '-P 0' dla' xargs', aby uruchomić wszystkie pająki równolegle. – rgtk

4

odpowiedzią @Steven Almeroth będą zawiodły w Scrapy 1,0 i należy zmodyfikować skrypt tak:

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

Ten kod działa na moim wersji 1.3.3 jest scrapy (zapisz go w taki sam directory in 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() 
Powiązane problemy