本帖最后由 MyModHeaven 于 2022-5-3 13:22 编辑
- 使用
requests 多线程下载文件,下载完成后与实际文件大小不符,差距好几倍甚至十倍
- 前天在网上学着多线程下载一个文件,500多M的一个压缩包,下下来2G多,第二次3G多,昨天搞了一天,无果
- 今天再尝试,8M的一个apk文件,下下来80多M
- 请懂得的老哥帮帮忙,谢谢
import requests
from bs4 import BeautifulSoup
from threading import Thread
def req(url):
headersvalue = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44',}
r = requests.get(url, headers=headersvalue)
soup = BeautifulSoup(r.text, 'lxml')
return soup
url = 'https://anonfiles.com/rap9r5c9y9/_1.2.9_apk'
dl_link = req(url).find('a', id='download-url')['href']
name = dl_link.split('/')[-1]
filesize = int(requests.head(dl_link).headers['Content-Length'])
def dl(s_pos, e_pos):
headersvalue = {'Accept-Ranges': f'bytes={s_pos}-{e_pos}'}
with requests.get(dl_link, headers=headersvalue, stream=True) as r, open('d:/'+name, 'ab+') as f:
f.seek(s_pos)
for chunk in r.iter_content(chunk_size=256):
f.write(chunk)
l = list(range(0, filesize, filesize//7))
sections = [[l[i], l[i+1]] for i in range(len(l)-1)]
sections[-1][-1] = filesize
for s_pos, e_pos in sections:
Thread(target=dl, args=(s_pos, e_pos)).start()
总结一下,问题就如那位热心的吾友说的:请求头写错了,是range,不是accept-ranges。我写的这个错误的参数名是从响应头上抄来的,应该是当时脑子昏了,后来从网上看见别人写的都是range,当时竟然没意识到这个错误。也非常感谢那位说用 os.system() 调用aria2的吾友,没这样用过,长见识了。
|