2012-03-14 23 views
9

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ệnmộ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?

Trả lời

12

Bạn có thể raise a CloseSpider exception để đóng một con nhện. Tuy nhiên, tôi không nghĩ rằng điều này sẽ làm việc từ một đường ống.

EDIT: avaleske ghi chú trong phần nhận xét cho câu trả lời này rằng anh ta có thể tăng ngoại lệ CloseSpider từ đường ống. Khôn ngoan nhất sẽ được sử dụng này.

Một tình huống tương tự đã được mô tả trên nhóm người dùng Scrapy, in this thread.

Tôi xin trích dẫn:

Để đóng một con nhện đối với bất kỳ một phần của mã của bạn, bạn nên sử dụng engine.close_spider phương pháp. Xem phần mở rộng này cho một sử dụng dụ: https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/closespider.py#L61

Bạn có thể viết phần mở rộng của riêng mình, trong khi nhìn vào closespider.py làm ví dụ, mà sẽ đóng cửa một con nhện nếu một điều kiện nhất định đã được đáp ứng.

Một "hack" khác sẽ đặt cờ trên mạng nhện trong đường ống. Ví dụ:

đường ống:

def process_item(self, item, spider): 
    if some_flag: 
     spider.close_down = True 

nhện:

def parse(self, response): 
    if self.close_down: 
     raise CloseSpider(reason='API usage exceeded') 
+0

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

+0

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

+1

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. –

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