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

波多野吉衣年轻的护士百度云盘下载,python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载

互联网 2020-10-20 16:38:33

原帖:向日葵智能

计划做这样的多线程下载是因为百度云盘限速厉害,到了恶心的地步,我想试试用多线程下载百度云盘的资源是否能够实现加速。

百度云盘限速分析1. 关于限速,我揣测有两种情况:限制下载资源的带宽限制下载资源时的线程或者进程数目如果限速是第一种,多线程下载也无法提速。但如果是第二种限速,多线程下载理应能够显著提升下载速度,在一定范围内,提速的程度与下载的线程数目成正相关关系。即,下载的线程越多,下载总速度越快。2. 多线程下载的具体思路如下:获取待下载文件的大小 size将待下载文件分成 n 块,第 i 块大小为 subi ,n 个 subi 之和等于 size在下载进程中开启 n 个线程,每个线程负责下载一个 sub所有线程下载的资源按照原有顺序写入文件,完成后,该文件即为下载后的文件百度云盘多线程加速下载,具体实现如下1. 获取待下载文件的 size

以下载 python 2.7 为例,下载链接:点我下载,点击该链接时,应该会直接弹出下载窗口。通常,文件大小,文件名等信息都在请求 headers 里,python 可用如下代码获取该文件 headers:

import requestsurl = "http://sw.bos.baidu.com/sw-search-sp/software/f4373126dba59/python_2.7.13150.msi"res = requests.head(url)print res.headers Python Copy

输出结果是一个 json 数据,格式化显示如下:

输出的 json 数据

显然,该文件大小为 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 }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() Python Copy 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 Python Copy

该函数将从 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[i], fpos[i], 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 Copy

打印结果如下:

下载速度

可见,该程序很快的将文件下载了,速度达到 9M/s 以上。文件也可以正常打开,如下图:

下载的文件

6. 测试下载被限速的百度云盘,观察是否提速成功

第 5 节提供的下载 python 2.7 文件没有被限速,不能体现本贴程序的提速性能。接下来,测试下载被恶心限速的 xx 云盘的文件,采用的下载链接可以自行从自己的云盘里提取:

提取下载链接

我的url是 https://nj01ct01.baidupcs.com/file/…

直接采用浏览器下载时,速度最快达到 18KB/s,且经常出现速度为 0 的情况,下载 3m 多点的文件用了 好几分钟,如下图:

浏览器低速下载

采用本帖下载时,输出如下,用时 65 秒,速度 51 KB/s:

5倍速下载

速度提升了 5 倍,我们增加线程数,即增大加速倍数,再试。将线程数目增加到 30,即 令 n=30 时,同样下载该链接,输出如下,用时 12s, 速度 279 KB/s,速度提升了 30 倍:

30 倍速下载

可见,采用本帖提供的 python 多线程下载百度网盘,的确可以显著提升下载速度。

转载自:https://www.xrkzn.cn/python-projects/python-project-multi-threads-download-baidu-cloud-files-in-high-speed/

免责声明:非本网注明原创的信息,皆为程序自动获取自互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件24小时内删除。

相关阅读