Alterar response.request.meta altera um objeto Python. Para fazer outro download, é preciso dar ao Scrapy outro Request para agendar.

Para um GET que seu callback decide explicitamente repetir, o auxiliar público de nova tentativa do Scrapy pode manter a contabilização das tentativas com o novo pedido:

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

Este é um auxiliar de spider. Quem chama deve devolver ou fazer yield do Request resultante quando houver um disponível. None significa que o auxiliar recusou outra tentativa dentro do limite aplicável.

O auxiliar de nova tentativa copia o pedido, atualiza sua contagem de tentativas e fornece o comportamento de agendador adequado para uma nova tentativa. Fazer yield da mesma URL como um pedido novo comum pode, em vez disso, encontrar a filtragem de duplicados.

Use um URL de proxy compatível com o HttpProxyMiddleware ativo. Para novas tentativas de pedidos GET públicos permitidos, um candidato HTTP sem autenticação da lista de proxies HTTP pode fornecer proxy_url. Limpar um campo proxy-authorization anexado anteriormente evita levar o cabeçalho de um intermediário antigo para esta seleção; deixe o middleware derivar a nova conta do novo URL de proxy quando aplicável.

Mantenha esta escolha no nível do callback separada do tratamento automático do RetryMiddleware das suas falhas configuradas. Decida qual camada é dona da nova tentativa para que a operação não consuma dois orçamentos independentes. O exemplo trata de trabalho GET reexecutável, não de uma promessa de que repetir uma transação enviada arbitrária seja seguro.

Artigos relacionados