python实战 多线程下载破解某度网盘下载限速

某度网盘的限速方法:

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

结论:

多线程下载成功破解某度限速!

猜你喜欢

转载自blog.csdn.net/skylibiao/article/details/103465446