问题:
我一直在尝试使用Python的request模块制作一个简单的动画下载器。我正在使用progressbar2模块跟踪进度。在尝试下载时,我得到了0.x B/s的速度。我认为问题是基于这个问题选择chunk_size
。但是无论块大小如何,我都得到了相同微不足道的速度。
规格和信息:
- 我使用的是Windows 10,Python 3.5,最新的
requests
模块(2.18.4),并且拥有40Mbps的良好互联网速度。 - 我可以通过浏览器(Chrome)和Free Download Manager在约1分钟内从链接下载文件。
- 链接完全正常工作,我没有防火墙冲突。
代码:
import os
import requests
import progressbar
from progressbar import *
os.chdir('D:\\anime\\ongoing')
widgets = ['Downloading: ', Percentage(), ' ', Bar(marker='#',left='[',right=']'),
' ', ETA(), FileTransferSpeed()]
url = 'https://lh3.googleusercontent.com/AtkUe87GbrINzTJS_Fj4W08CGqlOg9anwEF7n5-eKXcyS1RsaB8LdzRVaXloiJwiaX2IX1xqUiA=m22?title=(720P%20-%20mp4)Net-juu%20no%20Susume%20Episode%207'
r = requests.get(url,stream=True)
remotesize = r.headers['content-length']
print("Downloading {}.mp4!\n\n".format(url.split('title=')[1]))
pbar = ProgressBar(max_value=int(remotesize),widgets=widgets).start()
i = 0
with open('./tempy/tempy_file.mp4', 'wb') as f:
for chunk in r.iter_content(chunk_size=5*1024*1024):
if chunk:
i = i + len(chunk)
f.write(chunk)
pbar.update(int(i/int(remotesize) * 100))
pbar.finish()
print("Successfully downloaded!\n\n")
截图:
期望解决方案:
不确定这个Github Issue是否已经解决。
- 最好在requests模块内找到解决方案,但我愿意接受任何在Python范围内能够帮助我提高下载速度的答案。
- 我想要分块下载,因为我想通过进度条查看进度。所以
shutil.copyfileobj(r.raw)
不符合我的要求。 - 我尝试过使用多线程,但只是让事情变得更加复杂,并没有帮助解决问题。我认为问题出在将块写入缓冲区本身上,将这个任务分别交给不同的线程并不能帮助解决问题。
编辑:
根据建议,我尝试通过包含随机用户代理来解决问题,如下所示:
desktop_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0']
def random_headers():
return {'User-Agent': choice(desktop_agents),'Accept':'text/html,video/mp4,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
并且使用以下头部信息发送请求:r = requests.get(url,stream=True,headers=random_headers())
然而,这没有任何区别。 :(
第二次编辑:
尝试使用来自“http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_5mb.mp4”的示例视频。问题仍然存在。 :/