python全自动爬取m3u8网页视频(各类网站都通用)

        当前人工智能,大语言模型的火热,使得python这门编程语言的使用越来越广泛。最近也开始学习了python,发现它在自动化方面的确有得天独厚的优势。python的简单易用,丰富的开源库,完善的生态,使得它有可能成为大语言模型和物理世界连接的桥梁。就像人们使用linux shell操作linux系统,大模型可以使用python来执行它想要执行的能影响物理世界的指令。

        学习了python之后,发现可以做的事情很多,让我们操作计算机,数据的获取和处理变得简单了许多,特别是网络中的数据。我们可以使用python来做许多自动化的操作。为了熟悉使用这门语言,也开始试着写一些简单的爬虫,这些所见即所得的成果比起单纯研究技术和算法有趣的多。当然爬虫也是一门技术。下面就是分享一些视频爬取经验,仅供记录经验,技术分享交流使用。

1、M3U8介绍

        M3U8 是一种基于文本的播放列表文件格式,主要用于 ​​HTTP Live Streaming(HLS)流媒体协议​​,由苹果公司开发并广泛应用于在线视频和音频传输中。

        M3U8它实际上就是用一个文本文件(一般为.m3u8后缀)来定义视频和音频等流媒体的播放行为。我们在浏览器上看视频时,当一个完整的视频文件很大时,比如一个G,如果等网页把这1G的视频文件全部下载下来再播放显然很不现实。那么直接的解决方式就是把这1G的视频文件分成很多个一小段的视频文件(比如1个小视频文件能播放1分钟),边下边播,就不会让用户长时间的等待下载才能播放。M3U8文件就是定义这一个个小视频文件的。M3U8文件的格式类似如下:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-KEY:METHOD=AES-128,URI="https://aa.bb.com/videos4/0f07ef21ec282c96ac32bb73d221f90c/crypt.key?auth_key=1742691847-72-0-d8787a27fe2eef60b071ac643f875c1b",IV=0xba25433fa8984b5abb5e0f5cc41f1a60
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:5
#EXTINF:5.000,
https://aa.bb.com/videos4/0f07ef21ec282c96ac32bb73d221f90c/0f07ef21ec282c96ac32bb73d221f90c0.ts?auth_key=1742691847-72-0-0b996b02189a9b159cdca1b30a72bc39
#EXTINF:5.000,
https://aa.bb.com/videos4/0f07ef21ec282c96ac32bb73d221f90c/0f07ef21ec282c96ac32bb73d221f90c1.ts?auth_key=1742691847-72-0-bf3bd2faf0a60b57bf33a620c16533db

       比如文件中这样的一行:https://aa.bb.com/videos4/0f07ef21ec282c96ac32bb73d221f90c/0f07ef21ec282c96ac32bb73d221f90c0.ts?auth_key=1742691847-72-0-0b996b02189a9b159cdca1b30a72bc39  

就是一个单独的小视频文件的下载地址。我们一般只要拿到这个下载地址,就可以使用模拟浏览器请求获取到文件数据。当然如果视频数据需要保密,那么返回的数据就是加密后的视频数据,我们要解密后才能播放。

        那我怎么知道视频数据有没有加密?用什么加密方式?怎么解密?答案都在M3U8文件里。文件内容中METHOD=AES-128就是写明了加密方式,加密key的获取通过这个url去获取,URI="https://aa.bb.com/videos4/0f07ef21ec282c96ac32bb73d221f90c/crypt.key?auth_key=1742691847-72-0-d8787a27fe2eef60b071ac643f875c1b",还有IV向量为IV=0xba25433fa8984b5abb5e0f5cc41f1a60,有了这些信息我们就可以对文件数据进行解密了,AES加密模式一般都是用CBC模式,这里没有明确写出。如果没有加密我们下载下来可以直接用本地视频播放器播放了。

        上面的M3U8文件示例,只是一般形式,还有一些M3U8的文件中的ts文件只有一个ts文件名,并不是完整的URL下载链接,比如只有"12345.ts",此时我们需要把地址拼接完整,前面的地址就是用M3U8文件下载地址来拼接,比如M3U8文件的下载URL为:https://aa.b.com/video91/m3u8/2024/07/02/a6ea9246/index.m3u8,那么ts的下载地址拼接完后就是:https://aa.b.com/12345.ts

2、获取M3U8文件

        从上面的介绍中,我们知道只要获取到M3U8文件,基本上就能下载到视频文件。怎么获取呢?一般手动获取就是用我们浏览器的F12打开调试控制台,搜索网络请求,直接查找请求URL中包含关键字".m3u8"的请求,然后查看响应,复制出来就可以。如果手动查找,可以参考:Python爬取下载m3u8视频,原来这么简单!-CSDN博客

        但是不是每个小白都能那么顺利的找到M3U8文件,我们想要的就是全自动下载,python就是干自动化的工作的。我们能不能做成一个通用的视频下载脚本,自动获取分析网页,自动获取M3U8文件,自动下载ts视频文件,自动合并视频文件呢。当前可以的,python的开源库playwright,Selenium​等都是自动化模拟浏览器的。我们为了能做一个通用的m3u8视频抓取脚本,就不用一个个网站的去分析请求和逆向js。我们使用最简单的方式,就是启动一个浏览器去模拟浏览器访问包含m3u8视频的网页,然后监控网络请求,捕获到返回的m3u8文件就可以了。

3、解析M3U8文件

        只要了解了M3U8文件内容的构成,很容易解析出加密方式和获取ts文件下载链接

4、下载ts文件

        ts文件的下载,可以使用requests库直接请求,有的网站有一些反爬措施,需要加Referer和User-Agent请求头。可以使用requests+多线程池并行下载多个ts,下载的很快,取决于你的网速,当然要考虑网站的承受能力也不用开太多线程。也可以使用aiohttp+协程并行下载

5、ts文件数据解密

        前面提到ts文件数据可能被加密了,我们可以直接根据M3U8的内容获取到所有解密需要用的参数,一般目前都是用AES-128,CBC模式进行加密,还有的都是不加密的,不加密可以省略这个步骤

6、ts视频流合并

        ts视频文件是一个个小的视频文件,能单独播放,但是我们要合并成一整个视频文件才好用我们的本地播放器连续播放,此时就需要借助ffmpeg这个工具进行合并,这是一个独立的可执行程序,通过命令行合并。如果没有安装需要安装

7、python m3u8视频爬虫代码

        以下爬虫代码可以处理不加密的和AES-128 CBC加密的ts文件,目前我发现的视频网站都是这两种加密方式,如果有其他的加密方式可以很容易自行扩展。

        脚本支持下载当前页面所有的m3u8视频,视频文件名称从网页标题中提取,多个视频按xxx_1.mp4,xxx_2.mp4命名

(1)需要安装的python库

playwright(模拟浏览器) requests(http请求) pycryptodome(AES解密)

python版本要python3

(2)需要安装的工具

ffmpeg(用于ts视频合并)

mac安装:

brew install ffmpeg

Ubuntu/Debian安装:

sudo apt update  
sudo apt install ffmpeg

安装完测试一下: 

mypc$ ffmpeg -h
ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers
  built with Apple clang version 16.0.0 (clang-1600.0.26.6)
...

(3) 执行

需要给main.py函数加可执行权限:chmod +x main.py

./main.py https://aa.bb.com/1.html

或者

python main.py https://aa.bb.com/1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值