文章转载于: https://blog.csdn.net/knighthood2001/article/details/120624571 为了自己方便学习,所有做个简单的总结。
先直接上代码:
from contextlib import closing
import requests, os
def download_video(download_url, download_path):
video_name = os.path.basename(download_path)
with closing(requests.get(download_url, timeout=10, verify=False, stream=True)) as response:
chunk_size = 1024 # 单次请求最大值
content_size = int(response.headers['content-length']) # 文件总大小
data_count = 0 # 当前已传输的大小
with open(download_path, "wb") as file:
for data in response.iter_content(chunk_size=chunk_size):
file.write(data)
done_block = int((data_count / content_size) * 50) # 已经下载的文件大小
data_count = data_count + len(data) # 实时进度条进度
now_jd = (data_count / content_size) * 100 # %% 表示%
print("\r %s [%s%s] %d%% " % (video_name+"---->", done_block * '█', ' ' * (50 - 1 - done_block), now_jd), end=" ")
if __name__ == '__main__':
url = "视频地址"
video_path = "测试.mp4"
download_video(url, video_path)
解释下:
1.with closing
我们在日常读取文件资源时,经常会用到with open() as f:的句子。
但是使用with语句的时候是需要条件的,任何对象,只要正确实现了上下文管理,就可以使用with语句,实现上下文管理是通过__enter__和__exit__这两个方法实现的。
2.文件流stream
文件流,它就好比你一边抽一边取,不用等池子满了再用, 所以对于一些大型文件(几个G的视频)一般会用到这个参数。(对小型文件也可以使用)
3.response.headers[‘content-length’]
这表示获取文件的总大小,但是它得到的结果的数据类型是str而不是int,因此需要进行数据类型转换。
4.response.iter_content()
该方法一般用于从网上下载文件和网页(需要用到requests.get(url) )
其中chunk_size 表示单次请求最大值。
5.\r和%
\r 表示回车(回到行首) % 是一种占位符 而对于%% ,第一个%起到了转义的作用,使结果输出为百分号%
效果如下:
|