00-1010本周想和大家分享一下如何让恐怖片的画面跳越(Python模拟实现)。结果在找之前看过的恐怖片的视频素材时,发现网站并没有提供直接下载的渠道。
这部悬疑/侦探恐怖片《探灵档案》是2014年上映的网剧。它非常漂亮。男演员是陈冠希的哥哥。但是由于主题问题,很多正规视频平台都下架了。
如果你想找到视频资料,你必须从一些小的盗版视频站获得。正是因为小盗版视频站不提供直接链接,你才给出了这样一个视频爬行手机练习会。
PS:如果你对恐怖片感兴趣,可以自己搜索~剧情很有意思。
好了,我们不多说了。让我们去看实战教程。
前言
之前先介绍一下相关环境。
Python3.7系统mac os开发工具Pycharm
环境准备
关于网站的详细信息这里就不介绍了。毕竟是盗版网站,相关主站的链接不会贴。感兴趣的同学可以只看图学习思路。
打开浏览器,在播放视频的网站上打开浏览器开发者工具F12。
可以看出,默认的视频文件不仅仅提供mp4或者其他视频格式的文件。
它由许多ts文件组成。
在爬行之前,我们应该了解几个概念。
什么是ts文件?Ts是日本高清相机的一种封装格式,叫做MPEG2-TS。Ts是“传输流”的缩写。MPEG2-TS格式的特点是可以从视频流的任何片段中独立解码。百度百科
如果你还不明白百度官方的这个解释,我会用通俗易懂的语言来解释。
打包格式在之前的《用Python玩转视频剪辑,秀的飞起!》中引入。回头看,你会发现ts格式的文件和mp4文件很相似。可以理解为短视频文件,也可以用播放器单独打开,如下图所示:
这是我爬的ts文件。你可以看看。每个ts段都很小,最大文件大小不超过1MB。
另一方面,一个网站的在线完整视频就是由这些小片段组成的记录群。当视频被缓冲时,它会不断地向网站服务器发送请求,以获取下一个ts小片段。
如何获取所有ts文件?除了ts文件,还有一个资源收集文件m3u8文件。
M3U8是M3U的Unicode版本,用UTF-8编码。“M3U”和“M3U8”文件是苹果使用的HTTP Live Streaming(HLS)协议格式的基础,可以在iPhone和Macbook等设备上播放。HLS的工作原理是把整个流分成基于HTTP的小文件下载,一次只下载一些。当媒体流正在播放时,客户端可以选择以不同的速率从许多不同的备份源下载相同的资源,从而允许流媒体会话适应不同的数据速率。维基百科(一个基于wiki技术的多语言的百科全书协作计划也是一部用不同语言写成的网络百科全书 其目标及宗旨是为全人类提供自由的百科全书)开放性的百科全书
看完这个官方维基解释,我实际上说的是我第一个问题的最后一个红色部分。因此,用通俗易懂的话再解释一下m3u8文件。
HLS是新一代流媒体传输协议,实际上是将一个大的媒体文件(一个具有封装格式的文件,如。mp4)分割成块,同时将分割文件的资源路径记录在m3u8文件中提供给客户端。根据m3u8文件,客户端可以获取相应的媒体资源并播放。
m3u8文件在哪里?弄清了上面的基本概念,m3u8文件在哪里?让我们来看看:
只有在开发者工具中,在m3u8过滤器下搜索,才能看到相关的请求地址。接下来,你可以在谷歌浏览器的请求下下载m3u8文件。
里面是什么:
1262d591?from=pc”>
有许许多多的 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文件也下载好了~
这不就是很通俗的一个多线程实例吗!
本篇略长,分析的基础理论很多,感兴趣的小伙伴可以耐心看完,那么下期再见啦!