Descargar a través dun proxy con Requests e iter_content
Consome unha resposta de Requests de xeito incremental mantendo as comprobacións de estado habituais, a limpeza e unha 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)
Usa este patrón coa sesión de Requests existente da aplicación, as rutas de proxy, a URL e a ruta de saída temporal. Para unha ruta HTTP pública, a lista de proxies HTTP fornece enderezos candidatos para a túa asignación de proxy. O patrón de transmisión consome o corpo de xeito incremental en lugar de obter response.content e despois escribir un segundo obxecto de tamaño completo.
Mantén esa propiedade durante toda a descarga: stream=True apraza o corpo, pero acceder a response.content despois aínda pode recompilalo todo na memoria. O tamaño de fragmento de iter_content é unha preferencia de lectura, non unha solicitude de codificación de transferencia HTTP por fragmentos no sitio web ou no proxy.
O xestor de contexto da resposta pecha a resposta mesmo se unha escritura falla ou a aplicación se detén cedo. O par de tempos de espera ilustrativo non é un prazo de reloxo para toda a transferencia; establece a política de vida da descarga por separado segundo sexa necesario.
Tras un consumo correcto, comproba o artefacto que espera a aplicación antes de publicar o seu nome final. Nunha interrupción, conserva o ficheiro parcial só baixo unha política de reanudación deliberada, con metadatos que identifiquen a representación remota. Un ficheiro temporal non baleiro non é unha descarga correcta.