Chúng tôi có một hệ thống được viết bằng cào để thu thập dữ liệu một vài trang web. Có một số nhện và một số đường ống xếp chồng cho tất cả các mục được tất cả các trình thu thập thông qua. Một trong các thành phần của đường dẫn truy vấn các máy chủ google google để mã hóa địa chỉ. Google áp đặt giới hạn 2500 yêu cầu mỗi ngày cho mỗi địa chỉ IP và đe doạ cấm địa chỉ IP nếu nó tiếp tục truy vấn google ngay cả sau khi google đã trả lời bằng thông điệp cảnh báo: 'OVER_QUERY_LIMIT'.Làm cách nào để dừng tất cả trình thu thập thông tin và công cụ ngay lập tức sau khi điều kiện trong đường ống được đáp ứng?
Do đó, tôi muốn biết về bất kỳ cơ chế nào mà tôi có thể gọi từ bên trong đường ống sẽ hoàn toàn và ngay lập tức dừng tất cả thu thập thông tin/xử lý tất cả trình thu thập thông tin và cũng là công cụ chính.
Tôi đã kiểm tra các câu hỏi tương tự khác và câu trả lời của họ chưa từng làm việc:
from scrapy.project import crawler crawler._signal_shutdown(9,0) #Run this if the cnxn fails.
này không làm việc vì nó cần có thời gian cho các cô gái nhỏ để ngăn chặn thực hiện và do đó nhiều yêu cầu khác được thực hiện cho google (có khả năng có thể cấm địa chỉ IP của tôi)
import sys sys.exit("SHUT DOWN EVERYTHING!")
này không làm việc ở tất cả; mặt hàng tiếp tục nhận được tạo ra và truyền cho các đường ống dẫn, mặc dù log nôn sys.exit() -> exceptions.SystemExit tăng (hoặc không có hiệu lực thi hành)
crawler.engine.close_spider(self, 'log message')
điều này có cùng một vấn đề như trường hợp đầu tiên được đề cập ở trên.
tôi đã cố gắng:
scrapy.project.crawler.engine.stop()
Để vô ích
EDIT: Nếu tôi làm trong các đường ống:
từ nhập khẩu scrapy.contrib.closespider CloseSpider
Tôi nên chuyển đối số nào làm đối số 'trình thu thập thông tin' cho số init() của CloseSpider từ phạm vi đường ống của tôi?
cám ơn cho bài viết. Tôi hình này sẽ đóng con nhện giống như ví dụ đầu tiên được hiển thị ở trên nhưng phải mất thời gian và một vài mục từ mỗi con nhện theo lịch trình sẽ vẫn đi qua các đường ống. Điều đó có nghĩa là 100 truy vấn sẽ vẫn được thực hiện cho google sau khi nhận được cảnh báo ... Làm thế nào để Giết toàn bộ thứ ??? Nếu không thể có một cách nào cả, tôi sẽ sử dụng "hack"! Cảm ơn rất nhiều!!! – aniketd
Ngoài ra, lớp CloseSpider cũng lấy đối số 'trình thu thập thông tin'. Trong đường ống của tôi và phạm vi của nó những gì đối tượng nên được thông qua? – aniketd
Tôi không thực sự chắc chắn những gì bạn đang đề cập đến; nhưng tài liệu này về tiện ích có thể giúp: http://doc.scrapy.org/en/latest/topics/extensions.html và tài liệu về đường ống: http://doc.scrapy.org/en/latest/topics/item -pipeline.html. Tôi sẽ vượt qua con nhện trên đường ống, đặt cờ ở đó và nâng cao ngoại lệ CloseSpider trong chính con nhện. –