2014-07-04 25 views
5

Trong khi thu thập dữ liệu, một số trang không thành công do chuyển hướng không mong muốn và không có phản hồi nào được trả lại. Làm thế nào tôi có thể nắm bắt loại lỗi này và lên lịch lại yêu cầu với url gốc, không phải với url được chuyển hướng?Phế liệu: cách bắt lỗi tải xuống và thử tải xuống lại lần nữa

Trước khi tôi hỏi tại đây, tôi thực hiện rất nhiều tìm kiếm với Google. Có hai cách để khắc phục sự cố này. một là bắt ngoại lệ trong một phần mềm trung gian tải về, người kia là để xử lý ngoại lệ tải về trong errback trong yêu cầu của nhện. Đối với hai câu hỏi này, tôi có một số câu hỏi.

  • Đối với phương pháp 1, tôi không biết cách chuyển url gốc sang hàm process_exception. Dưới đây là mã ví dụ mà tôi đã thử.
class ProxyMiddleware(object): 

    def process_request(self, request, spider): 
     request.meta['proxy'] = "http://192.168.10.10" 
     log.msg('>>>> Proxy %s'%(request.meta['proxy'] if request.meta['proxy'] else ""), level=log.DEBUG) 
    def process_exception(self, request, exception, spider): 
     log_msg('Failed to request url %s with proxy %s with exception %s' % (request.url, proxy if proxy else 'nil', str(exception))) 
     #retry again. 
     return request 
  • Đối với phương pháp 2, tôi không biết làm thế nào để vượt qua thông số bên ngoài để errback chức năng trong nhện. Tôi không biết cách truy xuất url gốc từ hàm errback này để sắp xếp lại yêu cầu.

    Dưới đây là ví dụ tôi đã cố gắng với phương pháp 2:

class ProxytestSpider(Spider): 

    name = "proxytest" 
    allowed_domains = ["baidu.com"] 
    start_urls = (
     'http://www.baidu.com/', 
     ) 
    def make_requests_from_url(self, url): 
     starturl = url 
     request = Request(url, dont_filter=True,callback = self.parse, errback = self.download_errback) 
     print "make requests" 
     return request 
    def parse(self, response): 
     pass 
     print "in parse function"   
    def download_errback(self, e): 
     print type(e), repr(e) 
     print repr(e.value) 
     print "in downloaderror_callback" 

Bất kỳ gợi ý cho vấn đề thu thập lại thông này được đánh giá cao. Cảm ơn trước.

Trân

Bing

+0

@ dabling1205, cho chúng ta thấy những gì bạn đã cố gắng –

+0

Các bài trông một lứa lộn xộn, tôi mới đến đây và không quen thuộc với các định dạng chỉnh sửa, :) – dabing1205

Trả lời

1

Bạn có thể vượt qua một lambda như một errback:

request = Request(url, dont_filter=True,callback = self.parse, errback = lambda x: self.download_errback(x, url)) 

cách mà bạn sẽ có quyền truy cập vào địa chỉ bên trong hàm errback:

def download_errback(self, e, url): 
    print url 
+0

Cảm ơn câu trả lời của bạn, điều này hoạt động tốt. Cảm ơn một lần nữa. – dabing1205

0

bạn có thể ghi đè RETRY_HTTP_CODES trong settings.py

Đây là các thiết lập tôi sử dụng cho các lỗi proxy:

RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408] 
+1

bạn tình, Cảm ơn bạn đã trả lời. Nhận xét của bạn hoạt động tốt trong trường hợp khi tải xuống có phản hồi được trả về với trạng thái. :), không phải cho lỗi tải xuống xảy ra. – dabing1205

+0

cảm ơn vì đã bình luận @ dabing1205. Bạn có nhớ chia sẻ trường hợp bạn gặp lỗi hoặc loại ngoại lệ không? –

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