2012-06-28 31 views
7

trong một tĩnh mạch tương tự như câu hỏi này: stackoverflow: running-multiple-spiders-in-scrapyxây dựng scrapy nhện vào chương trình của riêng tôi, tôi không muốn gọi scrapy từ dòng lệnh)

tôi tự hỏi, tôi có thể chạy một toàn bộ dự án scrapy từ bên trong một chương trình python khác? Cho phép chỉ nói rằng tôi muốn xây dựng một chương trình toàn bộ mà yêu cầu cạo một số trang web khác nhau, và tôi xây dựng toàn bộ dự án phế liệu cho mỗi trang web.

thay vì chạy từ dòng lệnh dưới dạng một trong, tôi muốn chạy các trình thu thập thông tin này và lấy thông tin từ chúng.

Tôi có thể sử dụng mongoDB trong python ok, và tôi đã có thể xây dựng các dự án có chứa các trình thu thập dữ liệu, nhưng bây giờ chỉ cần hợp nhất tất cả vào một ứng dụng.

Tôi muốn chạy các ứng dụng một lần, và có khả năng kiểm soát nhiều nhện từ chương trình của riêng tôi

Tại sao làm điều này? cũng ứng dụng này cũng có thể kết nối với các trang web khác bằng cách sử dụng API và cần phải so sánh kết quả từ trang API với trang web được cạo trong thời gian thực. Tôi không muốn phải gọi điện thoại từ dòng lệnh, tất cả đều có nghĩa là tự chứa.

(Tôi đã được hỏi rất nhiều câu hỏi về cào thời gian gần đây, bởi vì tôi đang cố gắng để tìm ra giải pháp phù hợp để xây dựng ở)

Cảm ơn :)

Trả lời

7

Yep, tất nhiên bạn có thể;)

The idea (inspired from this blog post) là tạo ra một công nhân và sau đó sử dụng nó trong kịch bản Python của riêng bạn:

from scrapy import project, signals 
from scrapy.conf import settings 
from scrapy.crawler import CrawlerProcess 
from scrapy.xlib.pydispatch import dispatcher 
from multiprocessing.queues import Queue 
import multiprocessing 

class CrawlerWorker(multiprocessing.Process): 

    def __init__(self, spider, result_queue): 
     multiprocessing.Process.__init__(self) 
     self.result_queue = result_queue 

     self.crawler = CrawlerProcess(settings) 
     if not hasattr(project, 'crawler'): 
      self.crawler.install() 
     self.crawler.configure() 

     self.items = [] 
     self.spider = spider 
     dispatcher.connect(self._item_passed, signals.item_passed) 

    def _item_passed(self, item): 
     self.items.append(item) 

    def run(self): 
     self.crawler.crawl(self.spider) 
     self.crawler.start() 
     self.crawler.stop() 
     self.result_queue.put(self.items) 

Ví dụ về sử dụng:

result_queue = Queue() 
crawler = CrawlerWorker(MySpider(myArgs), result_queue) 
crawler.start() 
for item in result_queue.get(): 
    yield item 

Một cách khác sẽ được thực hiện lệnh scrapy bò với system()

Các vấn đề liên quan