python如何爬取m3u8(记一次m3u8列表和ts文件的爬虫小实战)
本想着这周给大家分享一下,如何制作恐怖片的屏幕跳字(Python模拟实现),结果在找原来看过的恐怖片视频素材的时候,发现网站并没有提供直接的下载渠道。
这部悬疑/侦探恐怖片《探灵档案》,是在 2014 年上映的网剧,非常好看,男主是陈冠希哥哥演的。但由于题材问题,许多正规视频平台把它下架了。
而如果想找到视频素材,必须从一些小型的盗版视频站,也正是因为小型盗版站没有提供直接的链接,给了这么一次视频爬取的练手机会。
PS:如果对恐怖片感兴趣,可以自行搜索看下~剧情很有意思。
好啦,话不多说,下面进入实战教程。
环境准备开始之前,先来介绍一下相关环境。
- Python3.7
- 系统 mac os
- 开发工具 Pycharm
关于网站的详情,这里不多做介绍,毕竟是盗版站,相关主站链接就不贴了,感兴趣的同学看图学思路就好。
打开浏览器,在视频播放的网站,开启浏览器开发者工具F12
可以看到,默认的视频文件并不是单一提供了 mp4 或者其它的视频格式文件。
而是由许多 ts 文件组成的。
在爬取之前,先要了解几个概念。
- 什么是 ts 文件?
ts是日本高清摄像机拍摄下进行的封装格式,全称为MPEG2-TS。ts即"Transport Stream"的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。百度百科
如果看了这段百度官方的解释,还是不懂的话,我用能理解的语言来解释下。
封装格式,在之前的 《用Python玩转视频剪辑,秀的飞起!》介绍过,回顾看下,你就会明白,其实 ts 格式文件类似 mp4 的文件。你可以理解为它是一小段的视频文件,也可以用播放器单独打开,就像下图这样:
这是我已经爬好的 ts 文件,大家可以看下,每个 ts 片段体积非常小,最大的文件体积不超过 1MB。
而一个网站的在线完整视频,则是由这些小碎片文件组合而成,当视频缓冲时,就会不断向网站服务端发送请求,得到接下来的 ts 小片段。
- 如何获取全部的 ts 文件?
伴随着 ts 文件,还存在一个资源集合文件,m3u8文件。
M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。wiki百科
看完这段 wiki 官方解释,其实说的就是我第一个问题最后标红的部分。所以,用通俗易懂的话再来解释下 m3u8 文件。
HLS 是新一代流媒体传输协议,它其实就是将一个大的媒体文件(.mp4等封装格式的文件)进行分片处理,并且同时会将分片文件的资源路径记录在 m3u8 文件里,用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。
- m3u8文件在哪里?
上面摸清了基础的概念,那 m3u8 文件究竟在哪里?来看下:
只需要在开发者工具中,搜索下 m3u8 过滤下,就能看到相关请求地址。接下来,只需要用谷歌浏览器请求下,便可以下载 m3u8 文件了。
里面的内容:
有许许多多的 ts 名称,这便是每个切割的小片段。
PS:当然,有的视频可能会遇到加密的情况,一般是有一个单独的 key 文件存在,而在 m3u8 文件中,也会存在一个 key 引用的内容。本次没有遇到,不过多赘述。
爬取实现思路大体讲下爬取的思路,代码具体实现不放出来了,后面会给出源码地址。
合并文件
- 首先,把 m3u8 文件下载下来。
- 读取 m3u8 文件中的内容,正则匹配出含有 .ts 文件的行。
- Python模拟浏览器发出请求,获取文件流。
- 写入到本地文件
- 合并 ts 文件,转为 mp4 文件。
这步分为两种情况,不同操作系统,合并方式也不同。
- windows
windows 的比较方便,cmd 中使用以下命令:
copy /b d:\xxx\download_ts\* d:\xxx\download_ts\new.mp4
这个命令我没有使用,windows的同学可以自行试下。
- mac os
mac os 的就需要下载 ffmeg 了(之前在Python玩转视频剪辑的文章中也提到过),不多赘述。
# cat命令合并文件 cat *.ts > final.ts # 转视频格式 ffmpeg -y -i final.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc 01.mp4
最后合成的成果图:
结语
本期内容就到这里啦,关于我自己写的这部分爬虫代码,如果有同学想借鉴的话,后台回复 m3 即可获得源码地址。
当然,这个小爬虫写的并不是很完善,只用了单线程在跑,要知道,如果想要速率,尤其是在 ts 文件居多的情况下,单线程跑是很慢的。
而我还在代码中加了延时函数,所以更慢了。。。
总之呢,因为我这些篇文章的时候是"多线程" 工作,程序下载 ts 跑着,我这边就先写着文章的分析部分,等分析部分写完了,ts文件也下载好了~
这不就是很通俗的一个多线程实例吗!
本篇略长,分析的基础理论很多,感兴趣的小伙伴可以耐心看完,那么下期再见啦!
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com