note: 在python中使用requests库从网上下载资源时出现如下图中的问题,资源无法成功下载。
这个问题遇到的概率还挺大的,因为本身能否work就受网络因素的影响。
我大致总结了几个可能出现的原因:
- 网络原因,文件资源比较大,重试的次数比较多,超出阈值,导致不能报错不能成功下载,这个时候可以考虑设置一下修改参数,增大重试次数,超时时间等参数。还不行的话,就直接从网上下载吧 。不是自己代码的问题,不要为难自己 😆😆
- 使用了科学上网,关一下代理。 ps: 这个问题在使用pip命令下载包时,可能也会出现,前提就是你已经设置了下载的时候选择从国内的镜像源上下载,如清华镜像,这个时候再使用pip下载包可能下载不成功。至于本文这里为什么要关代理,我不是很清楚,我这里的情况时关闭代理能够work
- 建立的连接数过多,程序请求次数过快。
ps:关了代理发现不报错了,但是下了一下空文件,难搞><,100多kb的文件也没能成功下下来,换了一个requests库下载大文件的代码,终于成功。。
这里贴一下参考的博客: requests下载大文件
原来的下载代码:
SPEECH_URL = "https://pytorch-tutorial-assets.s3.amazonaws.com/VOiCES_devkit/source-16k/train/sp0307/Lab41-SRI-VOiCES-src-sp0307-ch127535-sg0042.wav" # noqa: E501
SPEECH_FILE = "_assets/speech.wav"
if not os.path.exists(SPEECH_FILE):
os.makedirs("_assets", exist_ok=True)
with open(SPEECH_FILE, "wb") as file:
file.write(requests.get(SPEECH_URL).content)
找了一份新的下载代码:
import sys
import requests
import os
class Downloader(object):
def __init__(self, url, file_path):
self.url = url
self.file_path = file_path
def start(self):
res_length = requests.get(self.url, stream=True)
total_size = int(res_length.headers['Content-Length'])
print(res_length.headers)
print(res_length)
if os.path.exists(self.file_path):
temp_size = os.path.getsize(self.file_path)
print("当前:%d 字节, 总:%d 字节, 已下载:%2.2f%% " % (temp_size, total_size, 100 * temp_size / total_size))
else:
temp_size = 0
print("总:%d 字节,开始下载..." % (total_size,))
headers = {'Range': 'bytes=%d-' % temp_size,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"}
res_left = requests.get(self.url, stream=True, headers=headers)
with open(self.file_path, "ab") as f:
for chunk in res_left.iter_content(chunk_size=1024):
temp_size += len(chunk)
f.write(chunk)
f.flush()
done = int(50 * temp_size / total_size)
sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
sys.stdout.flush()
if __name__ == '__main__':
SPEECH_URL = "https://pytorch-tutorial-assets.s3.amazonaws.com/VOiCES_devkit/source-16k/train/sp0307/Lab41-SRI-VOiCES-src-sp0307-ch127535-sg0042.wav" # noqa: E501
SPEECH_FILE = "_assets/speech.wav"
if not os.path.exists(SPEECH_FILE):
os.makedirs("_assets", exist_ok=True)
downloader = Downloader(SPEECH_URL, SPEECH_FILE)
downloader.start()
注: 写这篇文章主要记录一下科学上网、代理的问题,不止一次出现过。要把代理关了才能work,背后的原因不尽相同吧。还有requests库下载文件这东西,这次下了一个空文件,吸取了教训。大文件分块,断点续传要考虑的东西多的去了。