Python爬虫:爬取ts视频文件并合成为mp4格式
介绍:
在自学爬虫时,一开始就是爬取一些文字(比如小说之类的),再后来变成了图片,再后来变成了视频…
其中最简单的就是对文字的爬取了,从文字过渡到图片也只是多了几行代码而已,但是: 从图片过渡到视频就要 分情况了。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤
QQ群:623406465
分情况解释:
第一种情况: 链接明确是以 mp4、mkv、rmvb 这类视频格式后缀为结尾的链接,这种下载很简单,和图片下载的方法一样,就是视频文件要比图片大而已。
第二种情况: 另一种,链接是以 m3u8 这类以多个 ts 文件组成的链接。
ts文件 ? 链接: 百度知道。
然而,在进行爬取的过程中,你会发现:第二种情况又有两种呈现方式:
第一种: 网页源码中的链接直接以 m3u8 结尾,这类的链接,推荐使用 FFmpeg 进行下载。(注意该工具下载成功后需要配置环境变量才可以使用。)
使用方法:
FFmpeg 可以帮你下载 m3u8 格式的视频,而且还能帮你自动转换为 mp4 的格式,并且不会出现拼接 ts 文件时乱序的情况。
第二种: 也是我今天着重说的一种情况。网页源码中并没有以 m3u8 格式结尾的链接。而是由在网页中直接请求并解析 ts 文件。
比如以下的视频网站:
分析及爬取:
我们就在当前网站爬取一个前段时间热播的动漫:《天气之子》 来演示用最为基础的 with open() 来爬取 ts 文件并合成为 mp4 格式的方法。
进入 天气之子 的主页,通过控制台我们需要构建一点简单的头文件来防止反爬: (主链接被我修改了,怕被和谐,这里主要分享的是方法。)
由于我曾经被拉进过网站的黑名单: 所以还是默默的写个代理 IP 吧。
不会写 IP代理 ? 链接: Python爬虫,自建IP地址池.
通过点击每一个 ts 文件,我们发现,对于每一个 ts 文件的请求地址都差不多:具体为:
https://*****/20200508/19312_c9d456ff/1000k/hls/d3276cb180400(****).ts
括号中的 * 代表数字,如: 0001、0002、0003…9999
通过拉动进度条可以快速地查看,最大的数字为 1613。
我们来试着请求 一下某段 ts 文件:
于是我们就得到了第一个 ts 文件:
但是: 一波未平一波又起,下载时,有些片段会秒下载,而有些片段则会下载的特别慢,甚至有些片段直接下载失败!!!!!
如果没有某个片段,剧情不就会跳着走吗?这可咋整,刚进入剧情,正为男女主角捏把汗的时候,一下就给我踢出来了,满头黑人问号,气得我直接口吐芬芳。
结果如下:
ts 文件的合并与转换为 mp4 格式:
经过小小的等待,现在,我们已经下载完成了所有的 ts 文件。
下载完成,有人会说:诶~, ts 文件都是可以播放的,直接用播放器顺序播放不久行了嘛。
但是: 我还没发现有哪款视频播放器能做到完全无卡顿感的切换这么多的视频,每几秒钟就 “ 卡顿 ” 一下,观影效果大打折扣。
所以还是乖乖的把它们都合并了吧。至于怎么合并,且听我慢慢道来:
第一步:我们先定义一个用于合并 ts 文件的函数:def get_video():
第二步:利用 files = os.listdir( path ) 拿到所有的文件名,所有的 ts 文件都是从小到大排列的,所以我们拿到的文件名也是有顺序的。
第三步:遍历每一个文件名, 通过 with open() 以二进制的方式打开并读取该文件(f1),接着再使用一个 with open()打开目标文件(f2),将从 f1 中读取出来的二进制文件以二进制追加写的方式写入到 f2 中 。
遍历时用 tqdm 库进行显示进度条。结果因为转换的速度太快,根本看不到进度条时怎么走的,几乎是秒转换,所以:我是为了什么加的进度条来着?
原文地址:https://www.cnblogs.com/sn8888/p/13846160.html