1. 实例
# -*- coding:utf-8 -*-
import sys
import requests
import os
# 屏蔽warning信息,因为下面verify=False会报警告信息
requests.packages.urllib3.disable_warnings()
def download(url, file_path):
# verify=False 这一句是为了有的网站证书问题,为True会报错
# stream = True,表示采用流下载
r = requests.get(url, stream=True, verify=False)
# 既然要实现下载进度,那就要知道你文件大小啊,下面这句就是得到总大小
total_size = int(r.headers['Content-Length'])
temp_size = 0
with open(file_path, "w") as f:
# iter_content()函数就是得到文件的内容,
# 有些人下载文件很大怎么办,内存都装不下怎么办?
# 那就要指定chunk_size=1024,大小自己设置,
# 意思是下载一点写一点到磁盘。
for chunk in r.iter_content(chunk_size=1024):
if chunk:
temp_size += len(chunk)
f.write(chunk)
f.flush()
#############花哨的下载进度部分###############
done = int(50 * temp_size / total_size)
# 调用标准输出刷新命令行,看到\r回车符了吧
# 相当于把每一行重新刷新一遍
sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
sys.stdout.flush()
print() # 避免上面\r 回车符,执行完后需要换行了,不然都在一行显示
if __name__ == '__main__':
# path是下载文件保存的路径
path = r'alias.txt.gz'
# url是文件网址链接
url = "https://stringdb-static.org/download/protein.aliases.v11.0/9606.protein.aliases.v11.0.txt.gz"
# 调用上面下载函数即可
download(url, path)
2. 解释
-
requests库函数:调用requests库函数时,默认verify=True。但当你的浏览器和网站SSL不匹配时,会报错。此时,可将verify=False。
-
下载进度:一般网页的Content-Length 包含下载文件总大小,temp_size += len(chunk) 可获得每次本地已经下载的文件大小,实现下载进度(百分比)。
-
实时刷新:调用标准输出刷新命令行,其中 \r 回车符,相当于每次循环回车到命令行首,把每一行重新刷新一遍,实现动态下载进度条。
-
下载文件过大:
- 流下载:当流下载时,用Response.iter_content或许更方便些。requests.get(url)默认是下载在内存中的,下载完成才存到硬盘上,可以用Response.iter_content来边下载边存硬盘
- 边下载边保存:可指定chunk_size = 1024,具体大小可以自己设置, 意思是下载一点chunk 就写一点到磁盘(避免文件过大,内存崩溃)。