2016-12-31 14 views
7

Tôi đang cố gắng loại bỏ một loạt trang web nhưng tôi gặp lỗ hổng, đôi khi có vẻ như trang web không gửi được phản hồi html đúng cách. Điều này dẫn đến tệp đầu ra csv có dòng trống. Làm thế nào để làm lại để thử lại n lần yêu cầu và phân tích cú pháp khi bộ chọn xpath trên phản hồi rỗng? Lưu ý rằng tôi không có bất kỳ lỗi HTTP nào.Cách thử lại yêu cầu n lần khi một mục nhận được một trường trống?

Trả lời

11

bạn có thể làm điều này với một tuỳ chỉnh Thử lại Middleware, bạn chỉ cần ghi đè lên các phương pháp process_response của dòng điện Retry Middleware:

from scrapy.downloadermiddlewares.retry import RetryMiddleware 
from scrapy.utils.response import response_status_message 


class CustomRetryMiddleware(RetryMiddleware): 

    def process_response(self, request, response, spider): 
     if request.meta.get('dont_retry', False): 
      return response 
     if response.status in self.retry_http_codes: 
      reason = response_status_message(response.status) 
      return self._retry(request, reason, spider) or response 

     # this is your check 
     if response.status == 200 and response.xpath(spider.retry_xpath): 
      return self._retry(request, 'response got xpath "{}"'.format(spider.retry_xpath), spider) or response 
     return response 

Sau đó kích hoạt nó thay vì mặc định RetryMiddleware trong settings.py :

DOWNLOADER_MIDDLEWARES = { 
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None, 
    'myproject.middlewarefilepath.CustomRetryMiddleware': 550, 
} 

Bây giờ bạn có phần mềm trung gian nơi bạn có thể đồng nfigure các xpath để thử lại bên nhện của bạn với các thuộc tính retry_xpath:

class MySpider(Spider): 
    name = "myspidername" 

    retry_xpath = '//h2[@class="tadasdop-cat"]' 
    ... 

này sẽ không nhất thiết phải thử lại khi lĩnh vực của hàng của bạn là trống rỗng, nhưng bạn có thể chỉ định đường dẫn cùng một lĩnh vực mà trong retry_xpath thuộc tính này để làm cho nó công việc.

+0

Bạn có thể giải thích cho tôi 'self._retry', bài kiểm tra kiểm tra xem xpath có trống không và cũng là lý do tại sao tôi không phải cho' process_response' tên của con nhện của tôi cho đối số thứ ba của nó? Cảm ơn – ChiseledAbs

+0

Kiểm tra cách tạo [phần mềm trung gian tải xuống] của riêng bạn (https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#downloader-middleware). Về phương thức _retry và các lớp khác, hãy nhớ rằng chúng ta đang kế thừa từ RetryMiddleware, vì vậy chúng ta chỉ ghi đè các phương thức của nó (liên kết trong câu trả lời). Về lập luận của nhện, đó là cá thể nhện hiện tại, không cần tên. – eLRuLL

+0

Ok cảm ơn. Btw tôi thay thế 'nếu response.status == 200 và response.xpath (spider.retry_xpath)' với 'nếu len (response.xpath (spider.retry_xpath)) == 0' bất kỳ lý do nào bạn không làm điều đó thay thế? – ChiseledAbs

1

Bạn có thể đặt cài đặt RETRY_TIMES trong settings.py với số lần bạn muốn các trang được thử lại. Giá trị mặc định là 2 lần.

Xem more on RetryMiddleware

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