2015-03-04 14 views
6

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ì?

+0

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

Trả lời

1

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ì?

Nếu bạn không muốn sử dụng tạm dừng/tiếp tục của Scrapy, bạn luôn có thể sắp xếp các yêu cầu của mình. Nếu bạn thu thập thông tin 10000 URL trước và sau đó xóa 10.000 URL này trong trình thu thập thông tin mới bằng cách yêu cầu liên tục, bạn có thể chỉ cần tuần tự hóa các URL này dựa trên một số quy tắc và nhập csv vào con nhện:

file = open('your10000_urls.csv', 'r') 
data = csv.reader(file) 
urls = list(data) 
url = [''] 
for i in urls: 
    url.append(i[0]) 
start_urls = url[1:] 
file.close() 

Và sau đó, bạn có thể theo dõi những yêu cầu này bằng cách thả những người mà đã được yêu cầu. Hơn nữa, bạn có thể muốn lưu trữ dữ liệu trong một cơ sở dữ liệu, nó làm cho cuộc sống dễ dàng hơn nhiều.

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

4

Đối với việc có thể tạm dừng và tiếp tục tìm kiếm scrapy, bạn có thể chạy lệnh này để bắt đầu tìm kiếm:

scrapy crawl somespider --set JOBDIR=crawl1 

cho dừng việc tìm kiếm bạn nên chạy control-C, nhưng bạn phải chạy nó chỉ một lần và chờ đợi để dừng lại, nếu bạn chạy control-C hai lần nó sẽ không hoạt động đúng cách.

sau đó bạn có thể tiếp tục tìm kiếm của bạn bằng cách chạy lệnh này một lần nữa:

scrapy crawl somespider --set JOBDIR=crawl1 
1

Các phiên bản của scrapy mà tôi đang sử dụng là 1.1.0

bạn cần phải đặt đúng JOBDIR trong settings.py

JOBDIR = 'PROJECT_DIR' 

Sau khi ngừng nhện bằng control+c, bạn có thể chạy s pider để tiếp tục cạo phần còn lại một lần nữa.

Nó sẽ làm việc sau đó

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