Repetir um GET do Scrapy através de outro proxy
Use o auxiliar de nova tentativa do Scrapy para agendar um novo pedido com um novo proxy, respeitando o orçamento de novas tentativas.
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.