使用部分下载(HTTP)下载文件
有没有办法使用部分下载function通过HTTP下载大量且仍在增长的文件?
看来这个代码每次从头开始下载文件:
import urllib urllib.urlretrieve ("http://www.example.com/huge-growing-file", "huge-growing-file")
我想要:
- 只取得新写入的数据
- 只要源文件变小(例如旋转),就从头开始下载。
可以使用范围头部进行部分下载,以下将请求选定的字节范围:
req = urllib2.Request('http://www.python.org/') req.headers['Range'] = 'bytes=%s-%s' % (start, end) f = urllib2.urlopen(req)
例如:
>>> 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<html xmlns="http://www.w3.'
使用这个标题你可以恢复部分下载。 在你的情况下,你所要做的就是跟踪已经下载的尺寸,并要求一个新的范围。
请记住,服务器需要接受这个头才能工作。
使用TCP套接字和原始HTTP很容易。 相关的请求头是“范围”。
示例请求可能如下所示:
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")
其中XXXX代表您已经检索的字节数。 然后你可以读取服务器的响应头和任何内容。 如果服务器返回一个标题,如:
Content-Length: 0
你知道你有整个文件。
如果你想作为一个HTTP客户端特别好,你可以看看“连接:保持活着”。 也许有一个python库,可以完成我所描述的任何事情(也许甚至是urllib2都行)!但是我不熟悉它。
如果我正确理解您的问题,则下载过程中文件不会更改,但会定期更新。 如果这是问题, rsync是答案。
如果文件正在不断更新(包括在下载过程中),则需要修改rsync或者一个bittorrent程序。 他们将文件拆分成独立的块,并独立下载或更新块。 当你从第一次迭代到达文件的末尾时,重复获得附加的块; 必要时继续。 效率较低,可以反复rsync。