用Python打造批量下载视频并能可视化下载进度的炫酷下载器

时间:2022-03-24 06:33:07

 

用Python打造批量下载视频并能可视化下载进度的炫酷下载器

大家好,我是Python进阶者,今天给大家整点好玩的,一起来看看吧~

【一、项目背景】

平时宅在家的我们最爱做的事莫过于追剧了,但是有时候了,网络原因,可能会让你无网可上,这个时候那些好看的电视剧和电影自然是无法观看了,本期我们要讲的就是怎样下载这些视频。

【二、项目目标】

通过Python程序对所感兴趣的视频进行批量下载,正好小编近期看到一些不错的视频,因为想往安卓方向走,但又苦于重新学习太复杂,有没有简单点的,之前好像有什么e4a但是要学易语言就放弃了,于是乎在茫茫网络发现了一个小众的编程语言---裕语言。好家伙,不说了,赶紧下载,盘它。

【三、项目实施】

采用sublime text 3 编写程序,先看看效果:

用Python打造批量下载视频并能可视化下载进度的炫酷下载器

用Python打造批量下载视频并能可视化下载进度的炫酷下载器

C:\Users\Administrator\Desktop\232.jpg

接下来,由小编我为大家展现程序的具体实现步骤。

【四、实现步骤】

1.分析网页结构

老样子,审查元素定位,如下图:

用Python打造批量下载视频并能可视化下载进度的炫酷下载器

C:\Users\Administrator\Desktop\1212.jpg

发现视频全都在a标签里面,因为这个页面的视频比较多,所以我们继续分析页面,发现一个神奇的事情。哈哈,原来所有的视频都在class为videoDown的a标签里,有了这个重要的信息就什么都好办了。

  1. #解析页面 
  2.  
  3. def parser(): 
  4.  
  5. ab=[] 
  6.  
  7. rep=requests.get('http://v.u00.cn:93/iappce.htm#sp',timeout=5,headers=headers) 
  8.  
  9. rep.encoding='utf-8' 
  10.  
  11. soup=BeautifulSoup(rep.text,'html.parser'
  12.  
  13. res=soup.find_all('a',class_='videoDown')#寻找所有class为videoDown的a标签 
  14.  
  15. for y in res: 
  16.  
  17.         ab.append('http://v.u00.cn:93'+y.attrs['href']) 
  18.         #将获取到的视频URL地址添加到列表中 
  19.  
  20.         return ab #返回所有视频地址的列表 

这样就轻轻松松拿到了页面所有的视频地址,怎么样,是不是超级简单了。

2.下载文件

因为我们讲的是批量下载,所以在此之前需要先了解单个下载,当然,单个下载是很耗费时间,而且系统资源利用率太低。

我们来看看这个下载函数如何实现:

  1. #下载函数 
  2.  
  3. def down(y,x): 
  4.  
  5. print('------下载第',str(x),'课-------'
  6.  
  7. ss=str(y.split('.')[3:4]) \#截取文件名 
  8.  
  9. sa=ss.replace('[','').replace(']','')\#替换文件名中的特殊符号 
  10.  
  11. ree=requests.get(y) 
  12.  
  13. with open('%d.%s.mp4'%(x,sa),'wb'as f: 
  14.  
  15.         f.write(ree.content) \#保存文件 

无非就是一些常用的字符串分隔以及文件操作罢了,不过此种因为比较单一,下载多个文件就行不通了,所以一般只要不是大批量下载,这种方法就够了。

然后在给他套一个函数用来简化他的启动之路。

  1. def main(): 
  2.  
  3. for y in range(len(parser())): 
  4.  
  5. down(parser()[y],y) \#下载 
  6.  
  7. main() 

最后调用主函数main,轻轻松松完成单个文件下载。

3.获取文件大小并给下载文件添加缓冲

在下载视频的时候如果我们一下子把所有的资源你都拿出来放进CPU读取,那么很快就会崩溃,所以我们需要设置一个缓冲,等他缓冲区满了然后拿出来读取,听起来好像挺抽象,让我们一起来看一下吧。

用Python打造批量下载视频并能可视化下载进度的炫酷下载器

C:\Users\Administrator\Desktop\4343.jpg

图中所示即为视频大小值和请求范围的值。

1.获取视频大小

  1. def download(url, file_name): \#下载视频 
  2.  
  3. urllib3.disable_warnings() 
  4.  
  5. rep=requests.get(url,headers=headers) 
  6.  
  7. head=rep.headers 
  8.  
  9. rep=requests.get(url,headers=headers) 
  10.  
  11. head=rep.headers \#获取请求头字典 
  12.  
  13. length=head.get('Content-Length') \#获取到视频的大小,单位是字节 
  14. 若想让他以MB为单位,则需除以两个1024 
  15.  
  16. file_size = int(length) \#视频大小用int转换 
  17.  
  18. if os.path.exists(file_name): \#判断文件名是否存在 
  19.  
  20.         first_byte = os.path.getsize(file_name) \#获取文件名大小 
  21.  
  22. else
  23.  
  24.         first_byte = 0 
  25.  
  26. if first_byte \>= file_size: 
  27.  
  28.         return file_size \#返回文件大小 
  29.  
  30. header = {"Range""bytes=%s-%s" % (first_byte, file_size), 
  31.  
  32.         'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 
  33. (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' 
  34.  
  35.  } \#设置请求头,标明请求范围 

2.配置进度条

  1. pbar = tqdm( \#配置进度条模块,设置文件大小,文件字节数,文件的进度 
  2.  
  3. total=file_size, initial=first_byte, 
  4.  
  5. unit='B', unit_scale=Truedesc=url.split('/')[-1]) 
  6.  
  7. #关于tqdm 具体用法大家可以百度tqdm模块。 

3.添加缓冲

  1. with closing(requests.get(url, headers=header, stream=True)) as req: 
  2. #关闭连接 
  3.  
  4. with open(file_name,'wb'as f: \#打开文件 
  5.  
  6.         for chunk in req.iter_content(chunk_size=1024\*2): \#设置缓冲 
  7.  
  8.             if chunk: 
  9.  
  10.                 pbar.set_description("【正在下载视频 %s】"%str(f.name)) 
  11.  
  12.                 f.write(chunk) \#写入文件 
  13.  
  14.                 pbar.update(1024) \#更新当前进度条 
  15.  
  16.             pbar.close() \#关闭进度条 
  17.  
  18.         return file_size \#返回文件大小 

4.构建下载视频并显示进度条函数

  1. def fd(): \#下载并显示进度条 
  2.  
  3. global x 
  4.  
  5. x=1 
  6.  
  7. for y in parser(): 
  8.  
  9.         print('----正在下载',x,'课-----'
  10.  
  11.         ss=str(y.split('.')[3:4]) 
  12.  
  13.         sa=ss.replace('[','').replace(']','') \#文件名 
  14.  
  15.         download(y, "{}.{}.mp4".format(str(x),sa)) \#下载 
  16.  
  17.         print('----完成下载',x,'课-----'
  18.  
  19.         x+=1 

5.启动程序

  1. Fd() 

【五.总结】

批量下载视频文件是一个不可多得的技术,程序写的并不够好,比如程序没有添加多线程,多进程,协程,也没有异步操作,可能是因为自己比较懒吧,哈哈哈。

不过也挺简单,多线程就是threading.Thread 顺便加锁 Lock,也可以用多进程multiprocessing中的Process或者进程池Pool,或者协程genvent,或者异步asynic

原文地址:https://mp.weixin.qq.com/s/t25QgSgU_KoTbbDFCICqog