python pycurl模块断点续传下载文件

发布时间:2020-07-25编辑:脚本学堂
python pycurl模块实现断点续传与文件下载的例子,切割下载,等份写入,pycurl模块断点续传多种解决方法。

python 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))

例子:
 

复制代码 代码示例:

#!/usr/bin/env python

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)
   ..