某度网盘的限速方法:
1.限制线程
2.限制带宽
利用多线程的破解
1.python下载原理
获取到url后利用request库获得数据,保存到文件。
2.多线程下载原理
将文件分成若干部分,由若干线程分别去下载,再按顺序将文件拼接到一起。
编程思路
1.获取文件大小
获得请求头后发现是一个json串,格式化后找到大小
res=requests.head(url)
size = int(res.headers['Content-Length'])
2.分割文件
n=5
spos = []
fpos = []
persize=size//n #每一份的大小
intsize=persize*n #整份的大小
for i in range(0,intsize,persize):
spos.append(i) #每一段的初值
fpos.append(i+persize-1) #每一段的终值
if(intsize<size):
fpos[n-1]=size #不能整除的剩余部分
3.下载并写入文件
try:
header={}
header["Range"] = "bytes={}-{}".format(spos,fpos) #截取一部分
result=requests.get(url,headers=header)
fp.seek(spos) #找到文件写到的指针位置,在后面续写
fp.write(result.content)
except Exception:
print(Exception)
4.对下载方法用多线程
import threading
for i in range(0,n):
t=threading.Thread(
target=load, #下载方法
args=(
url,spos[i],fpos[i],fp
)
)
t.setDaemon(True)
t.start()
tmp.append(t)
for i in tmp:
i.join()
5.测速
t0=time.time()
t1=time.time()
to=t1-t0
print("total_time:%.2f s"% to)
speed=float(size)/(1000*(to))
print("speed:%.2f KB/s"% speed)
6.全部代码
import json
import re
import requests
import threading
import time
def getsize(url):
res=requests.head(url)
json_data = re.sub('\'', '\"', str(res.headers))
head_dict = json.loads(json_data)
size = int(head_dict['Content-Length'])
return size
def splitfile(size,n):
print("total size: {}".format(size))
spos = []
fpos = []
persize=size//n
intsize=persize*n
for i in range(0,intsize,persize):
spos.append(i)
fpos.append(i+persize-1)
if(intsize<size):
fpos[n-1]=size
return spos,fpos
def load(url,spos,fpos,fp):
try:
header={}
header["Range"] = "bytes={}-{}".format(spos,fpos)
result=requests.get(url,headers=header)
fp.seek(spos)
fp.write(result.content)
except Exception:
print(Exception)
if __name__ == '__main__':
url="https://d11.baidupcs.com/file/bd0a41026b100e7bd6ac41552be76c29?bkt=en-26dcfdb4e5ee1a492285f08b356e99b9dedecfe67070088ad1b52a2bc0db98959235801e95129c68&xcode=ebbabd0db4a2d1789b9d718f92742b5bf4b8f1b72789f60615f0498f33409a88cf08526c2f5fa5d038419d9aef7544c1316128a2cdfcce4d&fid=3112470176-250528-195378425558798&time=1575886082&sign=FDTAXGERLQBHSKf-DCb740ccc5511e5e8fedcff06b081203-M%2FobTXKraU0ijHSOIDwAkWyA87M%3D&to=d11&size=21726712&sta_dx=21726712&sta_cs=10147&sta_ft=exe&sta_ct=6&sta_mt=6&fm2=MH%2CQingdao%2CAnywhere%2C%2Cliaoning%2Cct&ctime=1552611112&mtime=1552611112&resv0=cdnback&resv1=0&resv2=rlim&resv3=5&resv4=21726712&vuk=3632384261&iv=0&htype=&randtype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=en-6371f96dfbf8a85ab3cdd32080648d5a1d12c42da0b60b489135ccf4b4477c0421af8384b762e847&sl=76480590&expires=8h&rt=sh&r=370348492&vbdid=783673474&fin=%E6%9C%80%E5%A5%BD%E7%94%A8%E7%9A%84PDF%E9%98%85%E8%AF%BB%E5%99%A8.exe&fn=%E6%9C%80%E5%A5%BD%E7%94%A8%E7%9A%84PDF%E9%98%85%E8%AF%BB%E5%99%A8.exe&rtype=1&dp-logid=7949469657073374300&dp-callid=0.1&hps=1&tsl=80&csl=80&csign=sH2lfnhC87j5eNHKt%2BkObawrFR8%3D&so=0&ut=6&uter=4&serv=0&uc=472721675&ti=263f95a325333e235daa051da5a306d04df8968f4aff54da&reqlabel=250528_f_0e4f282de561936144a201cc2b4d52cc_-1_3d15124033ef119a5845e58abc2bb9cb&by=themis"
size=getsize(url)
n=30;
spos,fpos=splitfile(size,n)
filename=input()
path="E:/PyBaiDuLoad/"
fp=open(path+filename,"wb")
tmp=[]
print("start download")
t0=time.time()
for i in range(0,n):
t=threading.Thread(
target=load,
args=(
url,spos[i],fpos[i],fp
)
)
t.setDaemon(True)
t.start()
tmp.append(t)
for i in tmp:
i.join()
fp.close()
t1=time.time()
to=t1-t0
print("total_time:%.2f s"% to)
speed=float(size)/(1000*(to))
print("speed:%.2f KB/s"% speed)
7.测试结果
找到某度网盘下载地址(浏览器下载记录里有)
total size: 6975060
开2个线程:
total_time:42.45 s
speed:164.33 KB/s
开20个线程:
total_time:4.77 s
speed:1463.42 KB/s