百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

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

ninehua 2025-02-19 13:21 34 浏览

来源:Python爬虫与数据挖掘

作者:Python进阶者

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

【一、项目背景】

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

【二、项目目标】

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

【三、项目实施】

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

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

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

 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?【四、实现步骤】

1.分析网页结构

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

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

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

#解析页面


def parser():


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')#寻找所有class为videoDown的a标签

for y in res:

 ? ? ? ?ab.append('http://v.u00.cn:93'+y.attrs['href'])
 ? ? ? ?#将获取到的视频URL地址添加到列表中


 ? ? ? ?return ab #返回所有视频地址的列表

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

2.下载文件

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

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

#下载函数


def down(y,x):


print('------下载第',str(x),'课-------')


ss=str(y.split('.')[3:4]) \#截取文件名


sa=ss.replace('[','').replace(']','')\#替换文件名中的特殊符号


ree=requests.get(y)


with open('%d.%s.mp4'%(x,sa),'wb') as f:


 ? ? ? ?f.write(ree.content) \#保存文件

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

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

def main():


for y in range(len(parser())):


down(parser()[y],y) \#下载


main()

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

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

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

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

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

1.获取视频大小


def download(url, file_name): \#下载视频


urllib3.disable_warnings()


rep=requests.get(url,headers=headers)


head=rep.headers


rep=requests.get(url,headers=headers)


head=rep.headers \#获取请求头字典


length=head.get('Content-Length') \#获取到视频的大小,单位是字节
若想让他以MB为单位,则需除以两个1024


file_size = int(length) \#视频大小用int转换


if os.path.exists(file_name): \#判断文件名是否存在


 ? ? ? ?first_byte = os.path.getsize(file_name) \#获取文件名大小


else:


 ? ? ? ?first_byte = 0


if first_byte \>= file_size:


 ? ? ? ?return file_size \#返回文件大小


header = {"Range": "bytes=%s-%s" % (first_byte, file_size),


 ? ? ? ?'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'


 } \#设置请求头,标明请求范围

2.配置进度条


pbar = tqdm( \#配置进度条模块,设置文件大小,文件字节数,文件的进度


total=file_size, initial=first_byte,


unit='B', unit_scale=True, desc=url.split('/')[-1])


#关于tqdm 具体用法大家可以百度tqdm模块。

3.添加缓冲


with closing(requests.get(url, headers=header, stream=True)) as req:
#关闭连接


with open(file_name,'wb') as f: \#打开文件


 ? ? ? ?for chunk in req.iter_content(chunk_size=1024\*2): \#设置缓冲


 ? ? ? ? ? ?if chunk:


 ? ? ? ? ? ? ? ?pbar.set_description("【正在下载视频 %s】"%str(f.name))


 ? ? ? ? ? ? ? ?f.write(chunk) \#写入文件


 ? ? ? ? ? ? ? ?pbar.update(1024) \#更新当前进度条


 ? ? ? ? ? ?pbar.close() \#关闭进度条


 ? ? ? ?return file_size \#返回文件大小

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


def fd(): \#下载并显示进度条


global x


x=1


for y in parser():


 ? ? ? ?print('----正在下载',x,'课-----')


 ? ? ? ?ss=str(y.split('.')[3:4])


 ? ? ? ?sa=ss.replace('[','').replace(']','') \#文件名


 ? ? ? ?download(y, "{}.{}.mp4".format(str(x),sa)) \#下载


 ? ? ? ?print('----完成下载',x,'课-----')


 ? ? ? ?x+=1

5.启动程序


Fd()

【五.总结】

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

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




相关推荐

不要随便给别人的iPhone刷机,否则后果会很严重

一网友称自己也算一个果粉,并且也使用iPhone多年,最近虽然看到网上有很多人给iPhone刷机的时候导致错误代码,变成白苹果,但是还是肆无忌惮的帮老板娘给iPhone刷机了!心想一部好好的iPhon...

iphone6白苹果重启、刷机报错4005维修实记

【机器型号】:iPhone6【故障现象】:刷机报错4005【客户描述】:机器摔过后开机白苹果重启,刷机报错4005【维修过程】:客户发过来的是单板,硬盘已经焊过,码片位置也飞过线。如图:接上外壳刷机,...

iPhone、iPad刷机报错是什么原因?详见苹果刷机报错代码大全

无论是借助iTunes或其它工具给iPhone、iPad刷机,都可能遇到失败报错的情况,失败报错会有代码提示。如下图中的“发生未知错误(9)”,9是指什么意思?是属于什么原因?对于专业维修人员可能很清...

技术文:iPhone 刷机报错 53 详解及维修方法

指纹电路关联的各个模块:1:指纹模块(也就是HOME键排线):上面有指纹识别块(HOME键蓝宝石玻璃)、排线、指纹处理芯片。2:指纹连接排线:连接指纹模块到主板的接口3:指纹接口4:指纹验证码片:就是...

闲鱼22元入手WiFi6无线网卡,20厘米长天线+双频900M

我自用的小主机是攒出来的,机箱是2012年买的立人NC2007B,随后十多年只换主板不换机箱,目前是H110M主板+I7-6700处理器,一直都使用USB外置无线网卡。上周我在狗东7.9元买了WiFi...

IObit Driver Booster Pro 专业驱动软件

软件介绍DriverBooster是一款针对Windows操作系统的电脑的驱动程序更新工具。更新驱动可以有效地提升电脑硬件性能,减少系统崩溃降低硬件冲突。该驱动加速器软件可以通过智能的检测引擎有效识...

制作Win10系统安装盘和Win系统的安装

制作Win10系统安装盘和Win系统的安装重要提示:操作之前准备工作必须看一下1.准备8G或8G以上U盘(32G以内)。制作系统U盘会格式化U盘内所有文件,建议准备一个新U盘,或者U盘文件拷贝到其他文...

Win10专业版无线网络老是掉线的问题

有一位电脑基地的用户,使用win10专业版系统笔记本电脑的时候,总是出现无线网卡掉线的问题,这该怎么办呢?接下来,技术员小编就来分享具体的解决方法。Win10专业版下无线总是掉线,可能是由电源管理设...

ESXI安装OpenWRT+群晖NAS+Win,打造AIO,附硬盘+网卡直通教程

开篇碎碎念Hi,大家好,今天来打造一个全能小主机,通过ESXI虚拟机为底层,在此基础上安装OpenWRT软路由+群晖NAS+Windows/linux系统,软路由负责上网,NAS负责文件存储,Wind...

如何在Windows上安装.NET Framework 详细教程分享

.NETFramework是Microsoft推出的一套开发平台,主要用于Windows操作系统上的应用程序开发和运行。许多软件和游戏需要安装特定版本的.NETFramework才能正常运行。...

Win10不和无线网卡好好玩耍!部分Win7/Win8.1用户很忧伤

IT之家讯硬件兼容问题一直困扰着一些Win7/Win8.1用户,因为这很影响他们和Win10好好玩耍。尤其是一些关键硬件,比如显卡和网卡如果有问题,基本上就意味着堵死了升级的道路,除非有合适的驱动更...

直接安装Windows 10 v20H2原版纯净系统教程(附下载地址)

软件简介:软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法!想要无痛升级您的电脑系统至Windows10吗?我们提供了一个简便的解决方案,适合能正常开机的电脑,无需制作启动U盘。此方案...

电脑网卡坏了怎么修复(电脑网卡坏了怎么修复win7系统)

当电脑网卡出现故障时,无论是有线网络还是无线网络,都可能无法正常连接。下面从软件、硬件等方面,分步骤为你介绍排查与修复的解决方案。一、初步排查:锁定问题源头检查网络环境将手机、平板等其他设备连接至同一...

自已封装的Windows10(仅供学习)(自己封装系统)

前段时间封装一个纯净版的Window10LTSC,除了带Office2016、极点输入法和万能五笔外,无任何其它三方软件,也没有浏览器主页挟持,真正意义上的纯净版系统。(春节后会出系统封装专题)这...

如何安装设置无线网卡(非免驱版)?

使用无线网卡,可以将您的台式机连接到无线网络,就像笔记本、手机一样,无需使用网线连接。本文介绍无线网卡的安装及使用方法。安装网卡之前,请确认电脑光盘驱动可以正常使用,同时准备好网卡安装光盘。注意:若无...