Ai đó có thể giải thích cho tôi về cách tính năng tạm dừng/tiếp tục trong Scrapy
hoạt động không?Phế liệu tạm dừng/tiếp tục hoạt động như thế nào?
Các phiên bản của scrapy
mà tôi đang sử dụng là 0.24.5
Các documentation không cung cấp nhiều chi tiết.
Tôi có nhện đơn giản sau đây:
class SampleSpider(Spider):
name = 'sample'
def start_requests(self):
yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1053')
yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1054')
yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1055')
def parse(self, response):
with open('responses.txt', 'a') as f:
f.write(response.url + '\n')
Tôi đang chạy nó bằng cách sử:
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from scrapyproject.spiders.sample_spider import SampleSpider
spider = SampleSpider()
settings = get_project_settings()
settings.set('JOBDIR', '/some/path/scrapy_cache')
settings.set('DOWNLOAD_DELAY', 10)
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run()
Như bạn thấy, tôi kích hoạt tùy chọn JOBDIR để tôi có thể lưu trạng thái của thu thập dữ liệu của tôi.
Tôi đặt DOWNLOAD_DELAY
thành 10 seconds
để tôi có thể ngăn chặn con nhện trước khi yêu cầu được xử lý. Tôi đã dự kiến rằng lần sau khi tôi chạy con nhện, các yêu cầu sẽ không được tái sinh. Đó không phải là tình huống.
Tôi thấy trong thư mục scrapy_cache của mình một thư mục có tên requests.queue. Tuy nhiên, điều đó luôn luôn trống.
Có vẻ như tệp requests.seen đang lưu các yêu cầu đã được phát hành (sử dụng băm SHA1
) rất tuyệt. Tuy nhiên, lần sau khi tôi chạy spider, các yêu cầu được tạo lại và các hash (01) trùng lặp SHA1
được thêm vào tệp. Tôi đã theo dõi vấn đề này trong mã Scrapy
và có vẻ như RFPDupeFilter
mở tệp requests.seen bằng cờ 'a +'. Vì vậy, nó sẽ luôn luôn loại bỏ các giá trị trước đó trong tập tin (ít nhất đó là hành vi trên Mac OS X của tôi).
Cuối cùng, về trạng thái của nhện, tôi có thể nhìn thấy từ mã số Scrapy
mà trạng thái của nhện được lưu khi nhện được đóng và được đọc lại khi được mở. Tuy nhiên, đó không phải là rất hữu ích nếu một ngoại lệ xảy ra (ví dụ, máy tắt). Tôi có phải tiết kiệm định kỳ không?
Câu hỏi chính tôi có ở đây là: Thực tiễn phổ biến để sử dụng Scrapy
trong khi hy vọng thu thập thông tin sẽ dừng/tiếp tục nhiều lần (ví dụ: khi thu thập dữ liệu một trang web rất lớn) là gì?
Dường như bạn chạy scrapy bên trong một kịch bản python. Bạn có thể ngừng lò phản ứng/phế liệu định kỳ không? Từ kinh nghiệm quá khứ của tôi, 'reactor.run()' luôn chặn kịch bản, vì vậy tôi không thể gọi là 'reactor.stop() '. Tôi nghĩ về chạy cào trong thread khác và gửi một tín hiệu chấm dứt cho thread đó, nhưng tôi đã không cố gắng. – Hieu