Descargar archivo usando descarga parcial (HTTP)

¿Hay una manera de descargar archivos enormes y en crecimiento a través de HTTP usando la función de descarga parcial?

Parece que este código descarga el archivo desde cero cada vez que se ejecuta:

import urllib urllib.urlretrieve ("http://www.example.com/huge-growing-file", "huge-growing-file") 

Me gustaría:

  1. Para obtener solo los datos recién escritos
  2. Descargue desde cero solo si el archivo de origen se vuelve más pequeño (por ejemplo, se ha girado).

Related of "Descargar archivo usando descarga parcial (HTTP)"

Es posible realizar una descarga parcial utilizando el encabezado de rango, lo siguiente solicitará un rango de bytes seleccionado:

 req = urllib2.Request('http://www.python.org/') req.headers['Range'] = 'bytes=%s-%s' % (start, end) f = urllib2.urlopen(req) 

Por ejemplo:

 >>> req = urllib2.Request('http://www.python.org/') >>> req.headers['Range'] = 'bytes=%s-%s' % (100, 150) >>> f = urllib2.urlopen(req) >>> f.read() 'l1-transitional.dtd">\n\n\n
		      	

Esto es bastante fácil de hacer usando sockets TCP y HTTP en bruto. El encabezado de solicitud relevante es “Rango”.

Una solicitud de ejemplo podría verse como:

 mysock = connect(("www.example.com", 80)) mysock.write( "GET /huge-growing-file HTTP/1.1\r\n"+\ "Host: www.example.com\r\n"+\ "Range: bytes=XXXX-\r\n"+\ "Connection: close\r\n\r\n") 

Donde XXXX representa el número de bytes que ya ha recuperado. Luego puede leer los encabezados de respuesta y cualquier contenido del servidor. Si el servidor devuelve un encabezado como:

 Content-Length: 0 

Sabes que tienes todo el archivo.

Si desea ser particularmente bueno como cliente HTTP, puede consultar “Conexión: mantener vivo”. Quizás haya una biblioteca de python que haga todo lo que he descrito (¡quizás incluso urllib2 lo haga!) Pero no estoy familiarizado con una.

Si entiendo su pregunta correctamente, el archivo no cambia durante la descarga, pero se actualiza periódicamente. Si esa es la pregunta, rsync es la respuesta.

Si el archivo se actualiza continuamente, incluso durante la descarga, deberá modificar rsync o un progtwig bittorrent. Dividen los archivos en partes separadas y descargan o actualizan las partes de forma independiente. Cuando llegue al final del archivo de la primera iteración, repita para obtener el fragmento adjunto; continuar según sea necesario. Con menos eficiencia, uno podría simplemente rsync repetidamente.