Transmitir em fluxo um download por proxy para um ficheiro com Python urllib
Transmita em fluxo um download por proxy para um ficheiro temporário e publique o nome final do ficheiro só depois de a cópia terminar.
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)Substitua os URL e os nomes de ficheiro pelos da aplicação. Para um download permitido de um ficheiro público sem autenticação de proxy, a lista de proxies HTTP pode fornecer pontos finais candidatos para o URL do proxy. Este abridor urllib dedicado usa um proxy HTTP para um destino HTTPS com a verificação normal do certificado. Não instala um abridor global; a autenticação, se necessária, exige a sua configuração suportada.
copyfileobj copia em blocos. Sair do contexto do ficheiro fecha-o e liberta as escritas em memória intermédia antes de os.replace instalar o nome final.
Se o pedido ou a cópia gerar um erro, a renomeação é ignorada. Pode ficar um ficheiro parcial para a política de limpeza, e este fluxo deixa um ficheiro final existente intacto nessa falha. Em caso de sucesso, a substituição pode sobrescrever esse ficheiro final, por isso escolha a política deliberadamente.
Utilize nomes temporários únicos para trabalhos simultâneos. Objetos abridor separados não protegem trabalhos que partilham o mesmo caminho .part.
A definição de 20 segundos limita as operações de socket suportadas, não o tempo total de download. Um prazo para todo o trabalho requer um tratamento separado na aplicação. A conclusão da transferência também é separada da verificação do ficheiro transferido.