Python进度条tqdm结合requwets实现视频下载(超详细,纯干货)

1 篇文章 0 订阅
1 篇文章 0 订阅

前言:当初我学习tqdm的时候,找资源发现找不到,所以现在学会了,打算填补下这个空白。有不足之处敬请指正。

首先,tqdm库是第三方库,怎么下载我就不用说了,大家能来学这个肯定都知道。

学函数嘛,重要的还是看参数怎么填,tqdm的参数和方法我会结合示例介绍(且只介绍最浅的,因为这已经够我们这些小白用了。另外也期待大佬的抛砖引玉)。

OK,现在开始:
示例:

import tqdm
length=10#假设这个视频的大小是10MB
filename='测试视频'
progress_bar=tqdm.tqdm(colour='blue',total=length,unit='MB',desc=filename,initial=0,ncols=120)

运行下,我们可以得到:

 下面我介绍下实例中tqdm.tqdm()中的参数什么意义:
 

color     '''顾名思义,来设置进度条中条条的颜色(但不是框框的颜色)'''#填写形式为str
nuit      '''这个嘛,可以理解成单位。(自定义设计,按照自己的需要自己定制)填写形式为'''#填写形式为str
desc      '''description的缩写,描述嘛,就是进度条前的头文字。'''#填写形式为str
initial   '''顾名思义,开始点。默认值为0.'''#填写形式为int
ncols     '''进度条的长度'''#填写形式为int
total     '''预计的迭代次数'''#填写形式为int

(至于那个total的解释是‘’‘预计的迭代次数’‘’,可能是比较抽象的。没事,我最后会为你们梳理一下思路的。)

顺便再和你们介绍其他几个常用的tqdm.tqdm()的参数

dynamic_ncols   '''根据环境自适应调整进度条长度'''#布尔类型,默认为False
unit_scale      '''根据国际标准,自适应进项unit的更换'''#布尔类型,默认为False
leave           '''当任务完成后(进度条达到100%后),进度条是否继续保留显示,默认显示'''#布尔类型,默认为False 

然后,update()方法,用于刷新进度条。

结合起来就是

import tqdm
length=10#假设这个视频的大小是10MB
filename='测试视频'
progress_bar=tqdm.tqdm(colour='blue',total=length,unit='MB',desc=filename,initial=0,ncols=120,)

for i in range(10):#让这个循环循环十次
    progress_bar.update(1)
    '''根据length有10MB,我想要每’下载‘1MB才刷新一次进度条,因此如上写代码'''
    #注意,一次update()方法只会刷新一次进度条。着重理解这个for循环

OK,输出如下:

*********************OK,至此我们完成了第一步,模拟下载一个东西***********************

*****************************下一步,结合requests,示例下载视频******************************

在学之前,希望你知道requests的一个参数stream,以及他们的相关用法。如果你不知道,那我用最通俗易懂的话带你了解。

同样,为了防止大家一次面对太多代码容易头晕,所以我依旧采用分区顺序,为大家讲明白代码。

若想直接看全部代码,可直接传送至本章末尾部分。建议大家跟我的思路走起来,轻轻松松理解一切。

$$OK,我们开始

第一步(url和UA伪装,并获得响应头信息)

import requests
import tqdm

url='https://video.pearvideo.com/mp4/adshort/20210308/cont-1722616-15626115_adpkg-ad_hd.mp4'
headers={
        'user_agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.42'
    }
response=requests.get(url=url,headers=headers,timeout=10,stream=True)

如上,我们进行了UA伪装,并且利用get()方法获取了响应信息response。

顺便介绍一下stream的意义。

stream是为了防止响应文件过大,导致缓存不够用的情况,。且只有结合iter_content()方法才能真正实现下载(原理是将一个大文件按照iter_content()的大小片段进行切割,然后分段获取想要的信息) 。想象一下,如果你要下载一个5G的大电影,获取到请求信息后,这个信息就直接占用了你5G的内存,你气不气。所以,用stream参数。将响应信息按片段切割。如iter_content()           《注意,iter_content()方法填入值为int类型,且默认的单位是字节》

 

第二步 (获取视频大小+进度条设置)

length=round(int(response.headers['content-length'])/1024**2,2)#获得视频的大小,单位MB
filename='测试视频'
process_bar=tqdm.tqdm(colour='blue',total=length,unit='MB',desc=filename,initial=0)#进度条的设置

 第一行讲解:

1st:“response.headers”可得到响应头的信息,为字典类型:

 

2nd:“response.headers['content_length']”获得视频的大小,类型为str。内容是字节单位的大小,如下

 3rd:“int(response.headers['content_length'])”得到整形的数值,可用于计算了

4th:”int(response.headers['content_length'])/1024**2”按照字节与kb与mb的转换关系,可得单位为MB的大小的浮点数

5th:利用round(int(response.headers['content_length'])/1024**2,2)方法从而保留两位小数。

第二行讲解:
命名要下载的视频

第三行讲解:

设置tdqm进度条(也可以说process_bar是一个实例化的tqdm对象)

第三步(进行文件的存储)

for part in response.iter_content(1024**2):
    process_bar.update(1)
    #持久化存储
    with open(r'C:\Users\86136\OneDrive\桌面\video_content\\'+filename+'.mp4','wb') as file:
        file.write(part)

 第一步讲过的,利用iter_content()《再强调一遍,chunk_size参数只可填int类型,且单位是字节》方法进行切片操作。

第一行讲解:

将响应信息1MB 1MB的赋值给part

第二行讲解:

每循环一次,process_bar.update(1),更新1(MB)。

第四、五行讲解:
把 每次循环得到的片段(part)以二进制形式保存到video_content文件夹中,并给该视频取名为“测试视频.mp4”

***********************************************完结撒花***************************************************

纯享版:
 

import requests
import tqdm

url='https://video.pearvideo.com/mp4/adshort/20210308/cont-1722616-15626115_adpkg-ad_hd.mp4'
headers={
        'user_agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.42'
    }
response=requests.get(url=url,headers=headers,timeout=10,stream=True)


length=round(int(response.headers['content-length'])/1024**2,2)#获得视频的大小,单位MB
filename='测试视频'
process_bar=tqdm.tqdm(colour='blue',total=length,unit='MB',desc=filename,initial=0)#进度条的设置

for part in response.iter_content(1024**2):
    process_bar.update(1)
    #持久化存储
    with open(r'C:\Users\86136\OneDrive\桌面\video_content\\'+filename+'.mp4','wb') as file:
        file.write(part)
print(filename+'下载完成')

运行结果: 

( 这篇文章就写了3个半小时,但仍会有疏忽,望指正。本人第一次博客,望采纳支持,谢谢大家)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值