Descargar a través de un proxy con Requests e iter_content
Consume una respuesta de Requests de forma incremental manteniendo las comprobaciones de estado habituales, la limpieza y una política deliberada para la salida 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 con la sesión de Requests existente de la aplicación, las rutas de proxy, la URL y la ruta de salida temporal. Para una ruta HTTP pública, la lista de proxies HTTP proporciona direcciones candidatas para tu asignación de proxy. El patrón de transmisión consume el cuerpo de forma incremental en lugar de obtener response.content y luego escribir un segundo objeto de tamaño completo.
Mantén esa propiedad durante toda la descarga: stream=True aplaza el cuerpo, pero acceder a response.content después aún puede reunirlo todo en memoria. El tamaño de fragmento de iter_content es una preferencia de lectura, no una solicitud de codificación de transferencia HTTP por fragmentos en el sitio web o el proxy.
El gestor de contexto de la respuesta cierra la respuesta incluso si una escritura falla o la aplicación se detiene antes de tiempo. El par de tiempos de espera ilustrativo no es una fecha límite de reloj de pared para toda la transferencia; establece la política de vida de la descarga por separado según sea necesario.
Tras un consumo correcto, comprueba el artefacto que espera la aplicación antes de publicar su nombre final. Si se interrumpe, conserva el archivo parcial solo bajo una política de reanudación deliberada, con metadatos que identifiquen la representación remota. Un archivo temporal no vacío no es una descarga correcta.