参考:
http://pycurl.sourceforge.net/doc/pycurl.html
如果想多线程下载,请关注下面url
http://groups.google.com/group/python-cn/msg/cdbe671b814fd3af
http://www.pythonclub.org/doku/index.php/python-network-application/pycurl
(个人粗略认为)原理:
把服务器上的文件分n“等份”,再在准备下载地址按等分一一填充到文件中。
当 下载 “等份数据” 时如果未能正常结束,从头下载次等份数据。正常结束后线程下载下一等分。
好比:
服务器文件(x): 1111111
待填充文件(y): 0000000
运行1:(2分钟)
文件(x):0101001
接着运行2:(1分钟,断点续传)
文件(x):1111001
最后:文件(x):1111111
需要技术:
1.按切割下载
2.本地创造与服务器文件一样大小空文件。
2.等份写入
技术1代码(按切割下载).
c.setopt(pycurl.RANGE, '%d-%d' % (500, 1000))
$ftp读取
http://pycurl.sourceforge.net/doc/pycurl.html
如果想多线程下载,请关注下面url
http://groups.google.com/group/python-cn/msg/cdbe671b814fd3af
http://www.pythonclub.org/doku/index.php/python-network-application/pycurl
(个人粗略认为)原理:
把服务器上的文件分n“等份”,再在准备下载地址按等分一一填充到文件中。
当 下载 “等份数据” 时如果未能正常结束,从头下载次等份数据。正常结束后线程下载下一等分。
好比:
服务器文件(x): 1111111
待填充文件(y): 0000000
运行1:(2分钟)
文件(x):0101001
接着运行2:(1分钟,断点续传)
文件(x):1111001
最后:文件(x):1111111
需要技术:
1.按切割下载
2.本地创造与服务器文件一样大小空文件。
2.等份写入
技术1代码(按切割下载).
c.setopt(pycurl.RANGE, '%d-%d' % (500, 1000))
import
pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, " http://www.python.org/ " )
c.setopt(pycurl.HTTPHEADER, [ " Accept: " ])
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1 )
c.setopt(pycurl.MAXREDIRS, 5 )
c.setopt(pycurl.RANGE, ' %d-%d ' % ( 500 , 1000 ))
c.perform()
print b.getvalue()
技术2(本地创造与服务器文件一样大小空文件)
c = pycurl.Curl()
c.setopt(pycurl.URL, " http://www.python.org/ " )
c.setopt(pycurl.HTTPHEADER, [ " Accept: " ])
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1 )
c.setopt(pycurl.MAXREDIRS, 5 )
c.setopt(pycurl.RANGE, ' %d-%d ' % ( 500 , 1000 ))
c.perform()
print b.getvalue()
def
allocate_space(self):
'''
预分配文件空间(通用?)
'''
afile = file(self.url_info[ ' file ' ], ' wb ' )
afile.truncate(self.url_info[ ' size ' ])#文件大小限定
afile.close()
技术3(等份写入 file.
seek
):
'''
预分配文件空间(通用?)
'''
afile = file(self.url_info[ ' file ' ], ' wb ' )
afile.truncate(self.url_info[ ' size ' ])#文件大小限定
afile.close()
#
----关键----
def write_cb(self, data):
if self.piece:
self.result.seek(self.piece[ 1 ] + self.piece_downloaded, 0)
self.result.write(data)
self.result.flush()
size = len(data)
self.link_downloaded += size
self.piece_downloaded += size
self.total_downloaded += size
if self.is_stop: return - 1
pycurl 学习笔记:
def write_cb(self, data):
if self.piece:
self.result.seek(self.piece[ 1 ] + self.piece_downloaded, 0)
self.result.write(data)
self.result.flush()
size = len(data)
self.link_downloaded += size
self.piece_downloaded += size
self.total_downloaded += size
if self.is_stop: return - 1
$ftp读取
import
pycurl
tfile = ' ftp://name:pass@218.200.***.***/tongbu/test.txt '
c = pycurl.Curl()
c.setopt(pycurl.URL, tfile)
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1 )
c.setopt(pycurl.MAXREDIRS, 5 )
# c.setopt(pycurl.RANGE, '%d-%d' % (2, 6))
c.perform()
print b.getvalue()
下载写入:
tfile = ' ftp://name:pass@218.200.***.***/tongbu/test.txt '
c = pycurl.Curl()
c.setopt(pycurl.URL, tfile)
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1 )
c.setopt(pycurl.MAXREDIRS, 5 )
# c.setopt(pycurl.RANGE, '%d-%d' % (2, 6))
c.perform()
print b.getvalue()
bean_
pycurl=pycurl.Curl()
...
bean_ pycurl .setopt(pycurl.WRITEFUNCTION, write_cb)
...
def write_cb(data):
file.write(data)
..
本文转自博客园刘凯毅的博客,原文链接:python 断点续传 (个人理解),如需转载请自行联系原博主。
...
bean_ pycurl .setopt(pycurl.WRITEFUNCTION, write_cb)
...
def write_cb(data):
file.write(data)
..