Confirmação de sucesso HTTP Download in Python
Pergunta
Existe uma maneira fácil e confiável para confirmar que um download web concluída com êxito fazer o download usando Python ou WGET [para arquivos grandes]? Eu quero ter certeza que o arquivo baixado em sua totalidade antes de realizar outra ação.
Solução
Dada muitos (a maioria na prática, creio eu) HTTP / 1.1 seções de cabeçalho, você pode obter uma expectativa sobre quanto tempo o corpo da entidade é. Se você tem essa expectativa, você pode decidir se você tem todos os dados da entidade. Consulte 2616 secção RFC 4,4 para detalhes completos, mas essencialmente:
- às vezes o
content-length
reflete com precisão o comprimento do corpo da entidade - , por vezes, não pode haver corpo da entidade, dependendo do código de resposta ou se a resposta está respondendo a um pedido
HEAD
- , por vezes, o pedido é a transferência codificado; e há algum marcador nos dados HTTP que diz 'Eu sou feito agora' (
Transfer-Encoding: chunked
) - e, por vezes, a mensagem é feito oficialmente quando os fecha a conexão (no caso, você não pode diferenciar entre começar a coisa toda e ser cortado cedo)
Em todos os casos, mas o último, você pode dizer se você tem a coisa toda ou não. Eu não sei se qualquer ferramenta em particular (wget ou uma biblioteca python existente) dá-lhe um sinal facilmente interpretável que a sua resposta foi ou não foi truncado.
Outras dicas
HTTP não fornece uma maneira de verificar isso.
A forma usada ao distribuir arquivos grandes é, após o download, calcular o md5sum do arquivo e compará-lo com o md5sum fornecida pelo servidor.
Exemplo, que é como ubuntu faz para distribuir e verificar seus downloads CD. https://help.ubuntu.com/community/HowToMD5SUM