公司头条

推广运维推广运维
关注: 0贴子:13 排名: 4 
0 回复贴,24 次查看
<返回列表

python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2018-11-6 14:12:29
百度云盘限速阐发

1. 关于限速,我揣测有两种情况:


  • 限制下载资源的带宽
  • 限制下载资源时的线程或者进程数目
如果限速是第一种,多线程下载也无法提速。但如果是第二种限速,多线程下载理应能够显着提升下载速度,在一定范畴内,提速的程度与下载的线程数目成正相关关系。即,下载的线程越多,下载总速度越快。2. 多线程下载的具体思路以下:


  • 获得待下载文件的大小 size
  • 将待下载文件分成 n 块,第 i 块大小为 subi ,n 个 subi 之和等于 size
  • 在下载进程中开启 n 个线程,每一个线程负责下载一个 sub
  • 所有线程下载的资源根据原有顺序写入文件,完成后,该文件即为下载后的文件
百度云盘多线程加速下载,具体实现以下

1. 获得待下载文件的 size

以下载 python 2.7 为例,下载链接:点我下载,点击该链接时,应该会直接弹出下载窗口。通常,文件大小,文件名等信息都在请求 headers 里,python 可用以下代码获得该文件 headers:
import requestsurl = "http://sw.bos.百度.com/sw-search-sp/software/f4373126dba59/python_2.7.13150.msi"res = requests.head(url)print res.headers输出结果是一个 json 数据,花样化显示以下:
python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
显然,该文件大小为 19161088 字节。
2. 将下载文件分为 n 个小块

这一步其实就是简单的数学题了,下面直接上代码,以 n=5 等分为例,以下:
size = int(res.headers["Content-Length"])print "total size: %d" % sizen = 5     spos = []fpos = []persize = int(size/n)intsize = persize * n  # 整除部分for i in range(0, intsize, persize):    spos.append(i)    fpos.append(i+persize-1)if intsize < size:     # size 不一定 n 等分,将不能等分余下的部分添加到最后一个 sub 里    fpos[n-1] = sizeprint sposprint fpos输出结果以下:
python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
可见,文件被 5 等分了,因为 size 不能被 5 整除,所以最后一段比之前 4 段都长一些。
3. python下载文件的指定区间

这里先提供一个 python 下载文件的简单代码作为参考,毕竟越简单,越容易理解:
res = requests.get(url)   # url 为待下载文件的下载链接fp = open(filename, "wb")fp.write(res.content)      # 将下载文件保存到 filename 里fp.close()假定文件大小为 100 个字节,上面这几行代码是下载整个文件的,那末,如何才能够下载指定区间的文件呢?比如我想下载 20-40 字节段的文件,怎样实现呢?要领以下,还是直接上代码:
header = {}header["Range"] = "bytes=20-40"           # 指定下载的字节段res = requests.get(url, headers=header)   # 将 header 添加到请求中fp = open(filename, "wb")fp.write(res.content)      # 将下载文件保存到 filename 里fp.close()上面几行代码下载的文件即为原文件的 20-40 字节段。
4. python 将内容写到文件指定位置处

第 3 节中提供的代码,实际上是将下载的 20-40 字节段写到 filename 的 0-20 位置了。这样一来,虽然内容被下载了,然则却没有放在文件正确的位置处,最终即使所有字节都下载了,文件也是无法打开的。那末,如何将 20-40 字节段内容写到 filename 的 20-40 位置呢?其实只需要添加一行 seek 代码,指定一下写文件的肇端位置即可,以下:
header = {}header["Range"] = "bytes=20-40"           # 指定下载的字节段res = requests.get(url, headers=header)   # 将 header 添加到请求中fp = open(filename, "wb")fp.seek(20)                # 指定写文件的位置 fp.write(res.content)      # 将下载文件保存到 filename 里fp.close()5. python 多线程高速下载

在第 3、4 节基础上,写下以下函数:
def downloadFile(url, spos, fpos, fp):    try:        header = {}        header["Range"] = "bytes=%d-%d" % (spos, fpos)        res = requests.get(url, headers=header)        fp.seek(spos)        fp.write(res.content)    except Exception, e:        print "downloadFile error: ", e该函数将从 url 下载 spos-fpos 段的内容,写到 fp 的指定位置处。结合第 1、2 节,开 n 个线程下载 python 2.7,具体代码以下,直接采用了 threading 库:
import threadingfp = open("test.msi", "wb")fp.close()fp = open("test.msi", "rb+")tmp = []start_time = time.time()    # 计时肇端点,为了计算平均速度for i in range(0, n):    t = threading.Thread(target=downloadFile, args=(url,  spos, fpos, fp))    t.setDaemon(True)       # 主进程结束时,线程也随之结束    t.start()    tmp.append(t)for i in tmp:    i.join()                # 等待线程结束fp.close()finish_time = time.time()   # 计时终点,为了计算平均速度speed = float(size)/( 1000.0*(finish_time-start_time))print "spend time: %0.2f s" % float(finish_time-start_time)print "finished... average speed: %0.2f KB/s" % speed打印结果以下:
python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
可见,该程序很快的将文件下载了,速度达到 9M/s 以上。文件也可以正常打开,以下图:
python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
6. 测试下载被限速的百度云盘,视察是不是提速成功

第 5 节提供的下载 python 2.7 文件没有被限速,不能体现本贴程序的提速机能。接下来,测试下载被恶心限速的 xx 云盘的文件,采用的下载链接可以自行从自己的云盘里提取:
python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
我的url是 http://nj01ct01.百度pcs.com/file/&#8230;
直接采用浏览器下载时,速度最快达到 18KB/s,且经常泛起速度为 0 的情况,下载 3m 多点的文件用了 好几分钟,以下图:

python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
采用本帖下载时,输出以下,用时 65 秒,速度 51 KB/s:
python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
速度提升了 5 倍,我们增加线程数,即增大加速倍数,再试。将线程数目增加到 30,即 令 n=30 时,同样下载该链接,输出以下,用时 12s, 速度 279 KB/s,速度提升了 30 倍:

python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 ...
可见,采用本帖提供的 python 多线程下载百度网盘,的确可以显着提升下载速度。

写在最后

当然,这里只是提供了一种加速下载的方案,代码都是demo级的,可能会有bug,有机会的话,我会把它完善成一个下载东西。
回复

使用道具 举报

快速回帖 使用高级回帖 (可批量传图、还有插入视频等功能哦!)

您需要登录后才可以回帖 登录 | 立即注册

  • 发布信息免费
  • 发贴彩色标题
  • 签到额外经验值

如何快速提升等级,查看[积分规则]

活动中心

查看更多>>
最新热版
会员排行
©2001-2018 公司头条 https://www.ewxf.com中国互联网举报中心沪ICP备14046342号-13 本站内容均来自网络转载或网友提供,如有侵权请及时联系我们,Cxy@izhiben.CN 公安网备|网站地图 企业map 产品map 新闻map 其他map
Archiver手机版小黑屋广告合作QQ:864633495
发帖 客服 微信 手机版 举报