response.request.meta를 바꾸면 Python 객체가 바뀝니다. 한 번 더 다운로드하려면 예약할 다른 Request를 Scrapy에 넘겨야 합니다.

콜백이 명시적으로 재시도하기로 결정한 GET이라면, Scrapy의 공개 재시도 도우미가 재시도 계산을 새 요청과 함께 유지할 수 있습니다:

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

이것은 spider 도우미입니다. 호출자는 결과 Request가 준비되면 반환하거나 yield해야 합니다. None은 적용되는 한도 안에서 도우미가 추가 재시도를 거절했다는 뜻입니다.

재시도 도우미는 요청을 복사하고 재시도 횟수를 갱신하며 재시도에 맞는 스케줄러 동작을 제공합니다. 같은 URL을 평범한 새 요청으로 yield하면 대신 중복 필터링에 걸릴 수 있습니다.

활성화된 HttpProxyMiddleware가 지원하는 프록시 URL을 사용하세요. 허용된 공개 GET 요청의 재시도에는 HTTP 프록시 목록의 인증 없는 HTTP 후보가 proxy_url을 제공할 수 있습니다. 이전에 붙인 proxy-authorization 필드를 지우면 옛 중간자의 헤더가 이 선택으로 넘어오지 않습니다. 해당되는 경우 미들웨어가 새 프록시 URL에서 새 계정을 도출하게 하세요.

이 콜백 수준의 선택은 RetryMiddleware가 설정된 실패를 자동 처리하는 것과 분리하세요. 어느 계층이 재시도를 맡는지 정해 작업이 두 개의 독립 예산을 쓰지 않게 합니다. 예시는 다시 실행할 수 있는 GET 작업에 관한 것이며, 임의로 제출된 트랜잭션을 반복하는 것이 안전하다는 약속이 아닙니다.

관련 글