Transmitir en flujo una descarga a través de un proxy a un archivo con Python urllib
Transmita en flujo una descarga a través de un proxy a un archivo temporal y publique el nombre final del archivo solo cuando la copia haya terminado.
import os
import shutil
from urllib.request import ProxyHandler, build_opener
proxy = 'http://proxy.example.net:8080'
opener = build_opener(ProxyHandler({
'http': proxy,
'https': proxy,
}))
temporary = 'archive.zip.part'
destination = 'archive.zip'
with opener.open('https://downloads.example.net/archive.zip',
timeout=20) as response:
with open(temporary, 'wb') as output:
shutil.copyfileobj(response, output)
os.replace(temporary, destination)Sustituya las URL y los nombres de archivo por los de la aplicación. Para una descarga permitida de un archivo público sin autenticación de proxy, la lista de proxies HTTP puede proporcionar puntos de conexión candidatos para la URL del proxy. Este abridor de urllib dedicado usa un proxy HTTP para un destino HTTPS con la verificación normal del certificado. No instala un abridor global; la autenticación, si hace falta, requiere su configuración admitida.
copyfileobj copia por bloques. Salir del contexto del archivo lo cierra y vacía las escrituras en búfer antes de que os.replace instale el nombre final.
Si la solicitud o la copia genera un error, se omite el cambio de nombre. Puede quedar un archivo parcial según la política de limpieza, y este flujo deja intacto un archivo final existente en ese fallo. Si tiene éxito, la sustitución puede sobrescribir ese archivo final, así que elija la política a propósito.
Use nombres temporales únicos para trabajos simultáneos. Los objetos abridores separados no protegen los trabajos que comparten la misma ruta .part.
El ajuste de 20 segundos limita las operaciones de socket admitidas, no el tiempo total de descarga. Un plazo para todo el trabajo necesita un manejo aparte en la aplicación. La finalización de la transferencia también es independiente de la verificación del archivo descargado.