本文共 1896 字,大约阅读时间需要 6 分钟。
参考: 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(本地创造与服务器文件一样大小空文件) def allocate_space(self): ''' 预分配文件空间(通用?) ''' afile = file(self.url_info[ ' file ' ], ' wb ' ) afile.truncate(self.url_info[ ' size ' ])#文件大小限定 afile.close() 技术3(等份写入 file. seek ): # ----关键---- 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 学习笔记: $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() 下载写入: bean_ pycurl=pycurl.Curl()
...
bean_ pycurl .setopt(pycurl.WRITEFUNCTION, write_cb) ... def write_cb(data): file.write(data) .. 本文转自博客园刘凯毅的博客,原文链接:,如需转载请自行联系原博主。