2013-03-22 41 views
10

Có cách nào để chạy tất cả các trình thu thập dữ liệu trong một dự án Scrapy mà không sử dụng daemon Scrapy không? Đã từng có một cách để chạy nhiều nhện với scrapy crawl, nhưng cú pháp đó đã bị xóa và mã của Scrapy thay đổi khá nhiều.Chạy cục bộ tất cả các trình thu thập dữ liệu trong Scrapy

tôi đã cố gắng tạo lệnh của riêng tôi:

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

Nhưng khi một con nhện được đăng ký với self.crawler.crawl(), tôi nhận được lỗi khẳng định cho tất cả các nhện khác:

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' 

Có cách nào để làm cái này? Tôi không muốn bắt đầu phân lớp các thành phần cốt lõi của Scrapy chỉ để chạy tất cả các trình thu thập dữ liệu của tôi như thế này.

+0

Bạn đang sử dụng phiên bản nào? '$ scrapy version -v' –

+0

Bạn có biết về [' scrapyd'] (http://doc.scrapy.org/en/latest/topics/scrapyd.html) không? –

+0

'0.16.4'. Tôi biết về Scrapyd, nhưng tôi đang thử nghiệm những con nhện ở địa phương, vì vậy tôi không muốn sử dụng nó. – Blender

Trả lời

16

Dưới đây là một ví dụ mà không chạy bên trong một lệnh tùy chỉnh, nhưng chạy lò phản ứng bằng tay và tạo ra một Crawler mới 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() 

Bạn sẽ phải thiết kế some signal system để ngăn chặn các lò phản ứng khi tất cả nhện là đã kết thúc.

EDIT: Và đây là cách bạn có thể chạy nhiều nhện trong một lệnh tùy chỉnh:

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

Cảm ơn bạn, đây chính là điều tôi đang cố gắng làm. – Blender

+0

Tôi làm cách nào để gắn dấu sao chương trình? – user1787687

+0

Đặt mã trong trình soạn thảo văn bản và lưu thành 'mycoolcrawler.py'. Trong Linux, bạn có thể chạy 'python mycoolcrawler.py' từ dòng lệnh trong thư mục bạn đã lưu nó. Trong Windows có thể bạn chỉ cần kích đúp vào nó từ trình quản lý tập tin. –

14

Tại sao anh không chỉ cần sử dụng một cái gì đó như:

scrapy list|xargs -n 1 scrapy crawl 

?

+1

Sử dụng tùy chọn '-P 0' cho' xargs' để chạy tất cả các trình thu thập song song. – rgtk

4

câu trả lời của @Steven Almeroth sẽ thất bại trong Scrapy 1.0, và bạn nên chỉnh sửa kịch bản như thế này:

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

mã này là công trình trên phiên bản scrapy của tôi là 1.3.3 (lưu nó trong cùng một trong 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() 
Các vấn đề liên quan