Transmitir en fluxo unha descarga a través dun proxy a un ficheiro con Python urllib
Transmita en fluxo unha descarga a través dun proxy a un ficheiro temporal e publique o nome final do ficheiro só cando a copia remate.
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)Substitúa os URL e os nomes de ficheiro polos da aplicación. Para unha descarga permitida dun ficheiro público sen autenticación de proxy, a lista de proxies HTTP pode fornecer puntos finais candidatos para o URL do proxy. Este abridor de urllib dedicado usa un proxy HTTP para un destino HTTPS coa verificación normal do certificado. Non instala un abridor global; a autenticación, se fai falta, require a súa configuración admitida.
copyfileobj copia por bloques. Saír do contexto do ficheiro péchao e baleira as escrituras almacenadas antes de que os.replace instale o nome final.
Se a solicitude ou a copia xera un erro, omítese o cambio de nome. Pode quedar un ficheiro parcial segundo a política de limpeza, e este fluxo deixa intacto un ficheiro final existente nese fallo. Se ten éxito, a substitución pode sobrescribir ese ficheiro final, así que escolla a política a propósito.
Use nomes temporais únicos para traballos simultáneos. Os obxectos abridor separados non protexen os traballos que comparten a mesma ruta .part.
O axuste de 20 segundos limita as operacións de socket admitidas, non o tempo total de descarga. Un prazo para todo o traballo necesita un tratamento aparte na aplicación. A finalización da transferencia tamén é independente da verificación do ficheiro descargado.