Thử lại một GET của Scrapy qua proxy khác
Dùng trình trợ giúp thử lại của Scrapy để lên lịch một yêu cầu mới với proxy mới, đồng thời tôn trọng ngân sách thử lại.
Thay đổi response.request.meta sẽ thay đổi một đối tượng Python. Để tải xuống lần nữa, phải cấp cho Scrapy một Request khác để lên lịch.
Với một GET mà callback của bạn quyết định thử lại một cách rõ ràng, trình trợ giúp thử lại công khai của Scrapy có thể giữ việc tính số lần thử lại cùng với yêu cầu mới:
from scrapy.downloadermiddlewares.retry import get_retry_request
def retry_through(self, response, proxy_url):
retry = get_retry_request(
response.request,
spider=self,
reason='choose_another_proxy',
)
if retry is None:
return None
retry.meta['proxy'] = proxy_url
retry.headers.pop('Proxy-Authorization', None)
return retry
Đây là một trợ giúp của spider. Bên gọi phải trả về hoặc yield Request thu được khi có sẵn. None nghĩa là trợ giúp đã từ chối một lần thử lại nữa trong giới hạn áp dụng.
Trợ giúp thử lại sao chép yêu cầu, cập nhật số lần thử lại và cung cấp hành vi bộ lập lịch phù hợp cho một lần thử lại. Chỉ yield cùng URL như một yêu cầu mới thông thường có thể thay vào đó gặp phải việc lọc trùng lặp.
Dùng một URL proxy được HttpProxyMiddleware đang bật hỗ trợ. Đối với việc thử lại các yêu cầu GET công khai được phép, một ứng viên HTTP không xác thực từ danh sách proxy HTTP có thể cung cấp proxy_url. Xóa trường proxy-authorization đã gắn trước đó giúp tránh mang tiêu đề của một trung gian cũ vào lựa chọn này; hãy để middleware suy ra tài khoản mới từ URL proxy mới khi thích hợp.
Giữ lựa chọn ở cấp callback này tách biệt khỏi việc RetryMiddleware tự động xử lý các lỗi đã cấu hình của nó. Quyết định lớp nào sở hữu việc thử lại để thao tác không tiêu hai ngân sách độc lập. Ví dụ liên quan đến công việc GET có thể phát lại, không phải lời hứa rằng lặp lại một giao dịch đã gửi tùy ý là an toàn.