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?
7
A
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.
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.
Các vấn đề liên quan
- 1. Trường trống php yêu cầu
- 2. Thay đổi số lần yêu cầu thử lại tại boto3
- 3. Đẩy dữ liệu một lần một URL được yêu cầu
- 4. Django - Lặp lại một trường mẫu n lần theo một dạng
- 5. Swift "thử lại" logic theo yêu cầu
- 6. Bắt buộc một trường không được yêu cầu
- 7. Mock một yêu cầu HTTP rằng lần ra với HTTPretty
- 8. Cách yêu cầu lần thứ hai
- 9. "Yêu cầu không thành công với một phản hồi trống" khi gọi một dịch vụ web
- 10. AFNetworking - Cách thiết lập các yêu cầu được thử lại trong trường hợp hết thời gian chờ?
- 11. Python - ConnectionError: lần thử lại Max vượt
- 12. ServletFileUpload # parseRequest (yêu cầu) trả về một danh sách trống
- 13. Cách yêu cầu() hoạt động khi yêu cầu cùng một mô-đun trong node.js
- 14. Lấy số lần một mục được lặp lại trong C#
- 15. Tại sao thiết lập một trường nhiều lần chậm hơn so với nhận được một trường?
- 16. Thanh tra Firefox bị trống sau một vài yêu cầu
- 17. Cách nhận dữ liệu nhận được trong yêu cầu Flask
- 18. Nhận URL yêu cầu trong một servlet
- 19. Emacs chuỗi lặp lại n lần
- 20. Kiểm tra Node.js, thử và thử nghiệm một mô-đun đã được yêu cầu?
- 21. Tránh ChunkedEncodingError cho một đoạn trống với Yêu cầu 2.3.0
- 22. Lặp lại data.frame N lần
- 23. Nhận bài yêu cầu nguyên liệu trong một ApiController
- 24. Làm cách nào để lặp lại một ký tự n lần trong một chuỗi?
- 25. là một ModelChoiceField luôn được yêu cầu?
- 26. Cách nhận tổng số lần lặp lại trong một foreach
- 27. Fancybox quay lại "Không thể tải nội dung được yêu cầu. Vui lòng thử lại sau."
- 28. Làm thế nào để thử một yêu cầu AJAX?
- 29. Chỉ chấp nhận một số yêu cầu ajax từ người dùng đã được xác thực
- 30. Cách GitHub tạo một yêu cầu kéo
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
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
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