Baixar através de um proxy com Requests e iter_content
Consuma uma resposta do Requests de forma incremental, mantendo as verificações de status habituais, a limpeza e uma política deliberada para a saída parcial.
with session.get(url, stream=True, proxies=routes,
timeout=(5, 30)) as response:
response.raise_for_status()
with open(part_path, 'wb') as output:
for chunk in response.iter_content(chunk_size=64 * 1024):
if chunk:
output.write(chunk)
Use este padrão com a sessão Requests existente da aplicação, as rotas de proxy, o URL e o caminho de saída temporário. Para uma rota HTTP pública, a lista de proxies HTTP fornece endereços candidatos para o seu mapeamento de proxy. O padrão de streaming consome o corpo de forma incremental em vez de obter response.content e depois escrever um segundo objeto de tamanho completo.
Mantenha essa propriedade durante todo o download: stream=True adia o corpo, mas acessar response.content depois ainda pode reuni-lo todo na memória. O tamanho do bloco de iter_content é uma preferência de leitura, não um pedido de codificação de transferência HTTP em blocos no site ou no proxy.
O gestor de contexto da resposta fecha a resposta mesmo que uma escrita falhe ou a aplicação pare cedo. O par de tempos limite ilustrativo não é um prazo de relógio para toda a transferência; defina a política de vida do download separadamente conforme necessário.
Após o consumo bem-sucedido, verifique o artefacto esperado pela aplicação antes de publicar o nome final. Em caso de interrupção, mantenha o ficheiro parcial apenas sob uma política de retoma deliberada, com metadados que identifiquem a representação remota. Um ficheiro temporário não vazio não é um download bem-sucedido.