博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 断点续传 (个人理解)
阅读量:5771 次
发布时间:2019-06-18

本文共 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' % (5001000))

import
 pycurl
=
 pycurl.Curl()
c.setopt(pycurl.URL, 
"
http://www.python.org/
"
)
c.setopt(pycurl.HTTPHEADER, [
"
Accept:
"
])
import
 StringIO
=
 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
'
=
 pycurl.Curl()
c.setopt(pycurl.URL, tfile)
import
 StringIO
=
 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)
        ..
本文转自博客园刘凯毅的博客,原文链接:,如需转载请自行联系原博主。



   



你可能感兴趣的文章
java入门第二季--封装--什么是java中的封装
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>
机器学习实战_一个完整的程序(一)
查看>>
Web框架的常用架构模式(JavaScript语言)
查看>>
如何用UPA优化性能?先读懂这份报告!
查看>>
这些Java面试题必须会-----鲁迅
查看>>
Linux 常用命令
查看>>
NodeJS 工程师必备的 8 个工具
查看>>
CSS盒模型
查看>>
ng2路由延时加载模块
查看>>
使用GitHub的十个最佳实践
查看>>
Elasticsearch 7.0中引入的新集群协调子系统如何使用?
查看>>
全面了解大数据“三驾马车”的开源实现
查看>>
使用nginx capture的注意事项
查看>>
PHPStorm.WebStrom等系列官方开发工具配置本地项目与运程服务器同步
查看>>
Node.js 8.9 LTS版本发布
查看>>
脱离“体验”和“安全”谈盈利的游戏运营 都是耍流氓
查看>>
慎用!BLEU评价NLP文本输出质量存在严重问题
查看>>
Facebook Sonar:一款可视化及交互式移动应用调试工具
查看>>