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.

Bài viết liên quan