2013-06-08 42 views
6

Tôi có một tập lệnh có tên là algorithm.py và tôi muốn có thể gọi các trình thu thập dữ liệu trong suốt tập lệnh. Các scructure tập tin là:Cách gọi các trình thu thập dữ liệu cụ thể từ một tập lệnh Python khác

algorithm.py MySpiders/

nơi MySpiders là một thư mục có chứa một số dự án scrapy. Tôi muốn tạo các phương thức perform_spider1(), perform_spider2() ... mà tôi có thể gọi trong algorithm.py.

Tôi làm cách nào để tạo phương pháp này?

Tôi đã quản lý để gọi một con nhện bằng cách sử dụng mã sau đây, tuy nhiên, nó không phải là một phương pháp và nó chỉ hoạt động cho một con nhện. Tôi là người mới bắt đầu cần giúp đỡ!

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

Trả lời

5

Chỉ cần đi qua nhện của bạn và đặt chúng lên qua gọi configure, crawlstart, và chỉ sau đó gọi log.start()reactor.run(). Và cặn bã sẽ chạy nhiều nhện trong cùng một quá trình.

Để biết thêm thông tin, hãy xem documentationthis thread.

Ngoài ra, hãy xem xét chạy trình thu thập thông tin của bạn qua scrapyd.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn, alecxe! Làm thế nào tôi có thể dừng lò phản ứng sau con nhện cuối cùng? Hiện nay tôi đang sử dụng def stop_reactor(): reactor.stop() dispatcher.connect (stop_reactor, signal = signals.spider_closed) Tuy nhiên, điều này dừng lại sau khi nhện đầu tiên ... –

+0

Bạn được hoan nghênh. Câu hỏi hay! Làm thế nào về việc theo dõi các nhện được đóng lại trong 'stop_reactor' theo cách thủ công và dừng lò phản ứng nếu tất cả đã bị đóng? Btw, tôi đã chỉnh sửa câu trả lời và bao gồm liên kết đến một chủ đề có liên quan. – alecxe

+0

Cảm ơn, bạn đời. Tôi không có đủ danh tiếng để bỏ phiếu cho bạn nhưng tôi đạo đức ủng hộ bạn thay vì :) –

2

Dựa trên lời khuyên tốt từ alecxe, đây là giải pháp khả thi.

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.') 
Các vấn đề liên quan