Đóng câu trả lời của Joël, nhưng tôi muốn xây dựng nhiều hơn một chút so với ý kiến có thể. Nếu bạn nhìn vào số Crawler source code, bạn thấy rằng lớp CrawlerProcess
có một số start
, nhưng cũng có chức năng stop
. Chức năng này stop
sẽ chăm sóc làm sạch nội bộ của thu thập thông tin để hệ thống kết thúc ở trạng thái mà từ đó nó có thể bắt đầu lại.
Vì vậy, nếu bạn muốn khởi động lại thu thập dữ liệu mà không cần thoát khỏi quá trình của mình, hãy gọi crawler.stop()
vào thời điểm thích hợp. Sau đó, chỉ cần gọi lại crawler.start()
để tiếp tục hoạt động.
Chỉnh sửa: nhìn lại, điều này là không thể (do lò phản ứng xoắn, như được đề cập trong một câu trả lời khác); các stop
chỉ cần chăm sóc của một chấm dứt sạch sẽ. Nhìn lại mã của tôi, tôi tình cờ có một trình bao bọc cho các quy trình Trình thu thập thông tin. Dưới đây bạn có thể tìm thấy một số (redacted) mã để làm cho nó hoạt động bằng cách sử dụng mô-đun đa xử lý của Python. Bằng cách này, bạn có thể dễ dàng khởi động lại trình thu thập thông tin. (Lưu ý:. Tôi tìm thấy mã trực tuyến vào tháng trước, nhưng tôi đã không bao gồm các nguồn ... vì vậy nếu ai đó biết nó đến từ đâu, tôi sẽ cập nhật các khoản tín dụng cho các nguồ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
from multiprocessing import Process
class CrawlerWorker(Process):
def __init__(self, spider, results):
Process.__init__(self)
self.results = results
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.results.put(self.items)
# The part below can be called as often as you want
results = Queue()
crawler = CrawlerWorker(MySpider(myArgs), results)
crawler.start()
for item in results.get():
pass # Do something with item
thêm crawler.stop() ngay sau khi crawler.start() đã không giúp đỡ - làm thế nào để Tôi phát hiện ra "thời gian thích hợp"? – Trindaz
@Trindaz: Tôi không chính xác về cuộc gọi đó, vui lòng xem câu trả lời được cập nhật. – jro
Cảm ơn bạn đã cập nhật @jro. Tôi đã nhìn thấy đoạn mã này trước và nếu tôi đã giải thích chính xác, thì khái niệm là bạn có thể cạo bao nhiêu tùy ý bằng cách thêm nhện vào trình thu thập thông tin không bao giờ chết, thay vì cố gắng khởi động lại trình thu thập thông tin cho mọi nỗ lực bạn thực hiện tại "thực hiện" một con nhện. Tôi đã đánh dấu đây là giải pháp vì kỹ thuật giải quyết vấn đề của tôi nhưng không thể sử dụng được vì tôi không muốn dựa vào các đối tượng trình thu thập dữ liệu liên tục trong ứng dụng django mà tôi đang sử dụng. Tôi đã viết một giải pháp hoàn toàn dựa trên trên BeautifulSoup và urllib2. – Trindaz