Descargar archivo usando urllib en Python con la característica wget -c
Pregunta
Estoy programando un software en Python HTTP para descargar PDF a partir de una base de datos. A veces, la descarga se detiene con este mensaje:
retrieval incomplete: got only 3617232 out of 10689634 bytes
¿Cómo puedo pedir a la descarga para reiniciar donde se detiene mediante la función de 206 Partial Content
HTTP?
Puedo hacerlo usando wget -c
y funciona bastante bien, pero me gustaría aplicar directamente en el software de Python.
¿Alguna idea?
Gracias
Solución
Puede solicitar una descarga parcial mediante el envío de un GET con la cabecera Range
:
import urllib2
req = urllib2.Request('http://www.python.org/')
#
# Here we request that bytes 18000--19000 be downloaded.
# The range is inclusive, and starts at 0.
#
req.headers['Range'] = 'bytes=%s-%s' % (18000, 19000)
f = urllib2.urlopen(req)
# This shows you the *actual* bytes that have been downloaded.
range=f.headers.get('Content-Range')
print(range)
# bytes 18000-18030/18031
print(repr(f.read()))
# ' </div>\n</body>\n</html>\n\n\n\n\n\n\n'
Tenga cuidado de comprobar la Content-Range
para aprender lo que realmente bytes se han descargado, ya que su rango puede estar fuera de límites, y / o no todos los servidores parecen respetar la cabecera Range
.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow