当前位置: 首页 > 科技观察

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

时间:2023-03-18 19:52:19 科技观察

用Python搭建一个酷炫的下载器,可以批量下载视频,并可视化下载进度我们宅在家里最喜欢做的就是看剧,但有时候因为网络原因,可能会上不了网。那些好看的电视剧电影,这个时候自然是看不下去了。这一期,我们就来说说如何下载这些视频。[2。项目目标】使用Python程序批量下载你感兴趣的视频。最近刚看了一些不错的视频,因为想往Android方向走,但是太复杂了,重新学不好。有没有更简单的东西?之前好像有一些e4a,但是放弃了学习彝语,于是在茫茫网络上找到了一个小众的编程语言---豫语。好家伙,废话少说,赶紧下载,盘上来。[3.项目实现】使用sublimetext3编写程序,先看看效果:C:\Users\Administrator\Desktop\232.jpg接下来小编就为大家展示一下程序的具体实现步骤。[4.实施步骤】1、分析网页老结构,查看元素定位,如下图:C:\Users\Administrator\Desktop\1212.jpg发现所有的视频都在a标签里,因为这个页面有很多视频,所以我们继续分析页面,发现了一个神奇的东西。哈哈,原来所有的视频都在类videoDown的a标签里。有了这个重要信息,一切都好办了。#分析页面defparser():ab=[]rep=requests.get('http://v.u00.cn:93/iappce.htm#sp',timeout=5,headers=headers)rep.encoding='utf-8'soup=BeautifulSoup(rep.text,'html.parser')res=soup.find_all('a',class_='videoDown')#查找所有类为videoDown的a标签foryinres:ab.append('http://v.u00.cn:93'+y.attrs['href'])#将获取的视频url地址添加到列表中returnab#返回所有视频地址列表,方便获取页面全部视频地址怎么样,是不是超级简单。2、下载文件因为我们说的是批量下载,所以在此之前我们需要先了解一下单独下载。当然,单独下载比较费时间,系统资源利用率太低。我们来看看这个下载函数是如何实现的:#Downloadfunctiondefdown(y,x):print('------下载第一个',str(x),'lesson------')ss=str(y.split('.')[3:4])\#截取文件名sa=ss.replace('[','').replace(']','')\#替换文件名中的特殊符号ree=requests.get(y)withopen('%d.%s.mp4'%(x,sa),'wb')asf:f.write(ree.content)\#Saving文件无非是一些常用的字符串分离和文件操作无非就是这样,但是因为比较简单,下载多个文件是行不通的,所以一般只要不是大批量下载,这种方法足够。然后给他设置一个功能,简化他的启动路径。defmain():foryinrange(len(parser())):down(parser()[y],y)\#Downloadmain()最后调用main函数main即可轻松完成单个文件下载。3.获取文件大小并为下载的文件添加缓冲区。下载一个视频的时候,如果我们把所有的资源都取出来放到CPU里面读取,很快就会崩溃,所以我们需要设置一个缓冲区,等他缓冲区满了再取出来读取。听起来很抽象,我们来看看。C:\Users\Administrator\Desktop\4343.jpg图中显示了视频大小值和请求范围的值。1.获取视频大小defdownload(url,file_name):\#下载视频urllib3.disable_warnings()rep=requests.get(url,headers=headers)head=rep.headersrep=requests.get(url,headers=headers)head=rep.headers\#获取请求头字典length=head.get('Content-Length')\#获取视频的字节大小。如果要以MB为单位,需要除以21024file_size=int(length)\#视频大小转换为intifos.path.exists(file_name):\#判断文件名是否存在first_byte=os.path.getsize(file_name)\#获取文件名大小else:first_byte=0iffirst_byte\>=file_size:returnfile_size\#返回文件大小header={"Range":"bytes=%s-%s"%(first_byte,file_size),'user-agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36'}\#设置请求头,指明请求范围2.配置进度条pbar=tqdm(\#配置进度条模块,设置文件大小,文件字节数,文件进度total=file_size,initial=first_byte,unit='B',unit_scale=True,desc=url.split('/')[-1])#关于tqdm的具体用法,可以百度tqdm模块。3.添加缓冲区withclosing(requests.get(url,headers=header,stream=True))asreq:#closeconnectionwithopen(file_name,'wb')asf:\#openfileforchunkinreq.iter_content(chunk_size=1024\*2):\#设置缓冲区ifchunk:pbar.set_description("【正在下载视频%s】"%str(f.name))f.write(chunk)\#写入文件pbar.update(1024)\#更新当前进度barpbar.close()\#关闭进度条returnfile_size\#返回文件大小4.构建下载视频并显示进度条函数deffd():\#下载并显示进度条globalxx=1foryinparser():print('----下载',x,'类-----')ss=str(y.split('.')[3:4])sa=ss.replace('[','').replace(']','')\#文件名下载(y,"{}.{}.mp4".format(str(x),sa))\#下载打印('----完成下载',x,'课-----')x+=15。启动程序Fd()[5.总结】批量下载视频文件是个难得的技术,程序写得不好,比如程序没有加入多线程、多进程、协程,也没有异步操作,可能是我懒,哈哈哈.不过也挺简单的,多线程就是threading.Threadlock顺便Lock,也可以在多进程multiprocessing中使用Process或者进程池Pool,或者coroutinegenvent,或者asynchronousasync