作为一个小白,很久以前就有过这样一种想法,就是写一个爬虫把自己喜欢的视频全爬下来,丢到服务器上,自己想看的时候就去里面找,可惜技术有限这么久也没有把自己的想法变为现实,研究了一段时间,写出来免得以后忘记了,以后技术积淀得多了,再完善。
1、chrome - F12的NetWork
发现视频文件都是一个个的ts文件
![6914313ecc29d114accee5df3c34e610.png](https://img-blog.csdnimg.cn/img_convert/6914313ecc29d114accee5df3c34e610.png)
那就自然而然的产生了把这一个个ts文件都下载下来,然后合起来的想法
2、利用cmd的copy /b指令合并
我把ts文件都下载下来了,百度了合并的方法
![37ac406c6a6940105043613400066bd6.png](https://img-blog.csdnimg.cn/img_convert/37ac406c6a6940105043613400066bd6.png)
ps:不选定文件,在空白处,按住Shift+鼠标右键打开cmd
输入:copy /b *.ts out.ts
然后,我发现我太年轻了
![3e71d62b68e29ebe34f7e75c6d186064.png](https://img-blog.csdnimg.cn/img_convert/3e71d62b68e29ebe34f7e75c6d186064.png)
可以看见排序和我的想法产生了偏差,于是继续百度,发现了一段bat
@echo
![48cc683a952dd24ae65d54d88f645414.png](https://img-blog.csdnimg.cn/img_convert/48cc683a952dd24ae65d54d88f645414.png)
到这里基本满足了我的需求,可也产生以下几个问题:
①如果视频太大,ts文件繁多,一个一个下载显然不现实
②如果ts的文件名不是按数字命名的,那么用这个批处理也合并不了。(非数字命名,可以直接用copy /b *.ts out.ts合并,可能不存在排序问题)
③只适用于ts文件可以播放,未加密的情况
3、python根据m3u8文件来下载合并
在百度合并视频文件的过程中,了解到m3u8文件,可以在浏览器F12的NetWork中拿到
![222c5d1721b0c7cf8fc8576df9b7dd89.png](https://img-blog.csdnimg.cn/img_convert/222c5d1721b0c7cf8fc8576df9b7dd89.png)
因为,播放的视频文件是根据m3u8来拼接播放的,于是,想到用python将m3u8中的0.ts,1.ts,2.ts,3.ts......都拿出来,拼成链接,请求,写入文件,合并,就不用自己一个一个去下载了
![da2ef1f6cfd9dc2980e21d417710fcc4.png](https://img-blog.csdnimg.cn/img_convert/da2ef1f6cfd9dc2980e21d417710fcc4.png)
![a40f97396ceee96adc1caa19f3361b65.png](https://img-blog.csdnimg.cn/img_convert/a40f97396ceee96adc1caa19f3361b65.png)
代码辣眼睛,作者小白,理解一下。
在下载中,下载的文件大小可能与源文件大小产生偏差,用如下代码进行判断
response = requests.get(xjj_url, timeout=timeoutt)
filesize = response.headers["Content-Length"]
data = response.content
if not filesize == str(len(data)):
print("滚回去重新下载!")
将m3u8中的0.ts,1.ts,2.ts,3.ts......替换为本地路径
![826a0c27d8f4785dccc5a625fa5a43dd.png](https://img-blog.csdnimg.cn/img_convert/826a0c27d8f4785dccc5a625fa5a43dd.png)
利用python调用FFmpeg来合并
from ffmpy3 import FFmpeg
with open(os.getcwd() + "index1.m3u8", "w") as f:
f.write(m3u8_file)
ff = FFmpeg(inputs={os.getcwd() + r'index1.m3u8': ''},
outputs={filename: '-c copy'})
print(ff.cmd)
ff.run()
到这里我解决了前面说的第①、②个问题,可是又产生了另一个问题:
④如果控制台中没有m3u8文件呢?我又该去哪里找链接呢?而且这种情况普遍存在
4、chrome扩展:猫抓
源码下载地址:https://github.com/xifangczy/cat-catch
![98a6e84b861b43be31cf31cad92112c4.png](https://img-blog.csdnimg.cn/img_convert/98a6e84b861b43be31cf31cad92112c4.png)
偶然发现了猫抓扩展,但是,和我想要的还是有差别,于是我对它进行了修改
![2d25feb970edfa7ab106319d24661ca4.png](https://img-blog.csdnimg.cn/img_convert/2d25feb970edfa7ab106319d24661ca4.png)
我Ctrl+C,Ctrl+V,对这些链接去重,校验,然后下载下来,合并,大功告成。
链接: https://pan.baidu.com/s/1WIQXZzNc-i5Ss1304WqSvA 提取码: ppmr
5、加密的ts文件
![6fa5e287c5b7ebf25cf8f880e1b2609f.png](https://img-blog.csdnimg.cn/img_convert/6fa5e287c5b7ebf25cf8f880e1b2609f.png)
![b8b0e11bf1ea88a7e92d1d69edc2625e.png](https://img-blog.csdnimg.cn/img_convert/b8b0e11bf1ea88a7e92d1d69edc2625e.png)
如果遇到这种情况,需要将key.key文件下载下来
![6e21bde8c392f0d4af2cd356feaaf7f3.png](https://img-blog.csdnimg.cn/img_convert/6e21bde8c392f0d4af2cd356feaaf7f3.png)
将m3u8文件中的URI="key.key"修改为URI="C:/Users/Administrator/Desktop/key.key",注意斜杠的方向
with
6、未解决的问题
1)、虽然,猫抓可以拿到链接,但是,却需要等待视频缓存完毕,依然不是一个好的解决方案,问题④只解决了部分
2)、如果,没有m3u8文件来合并ts,比如将ts列表放入txt里,用FFmpeg来合并,或者用copy /b来合并,合并后视频的连接处有卡顿的现象(copy /b比放入txt的ffmpeg合并效果更好)。这时需要自己生成一个m3u8文件来合并,可是,m3u8文件需要每一个ts视频的总时长(例:#EXTINF:14.4,)。比如下面的ts链接,我们可以通过end-start来得到这个ts的总时长,但是,并不是所有网站都是这样格式的链接
012_n0032mibckr.321004.1.ts?index=12&start=120000&end=132000&brs=31244848&bre=33063935&ver=4
3)、如果ts是使用SAMPLE-AES等方式加密的,FFmpeg并不支持解密,问题③只解决了部分
------------------------------------------------------------------------------
第一次写这种玩意,写的不好,望见谅。当然you-get可以很好的解决这些问题,有时间去研究一下,说不定会有一些收获。
技术积累有限,希望可以抛砖引玉。
本文谨用于学习交流,如果涉及侵权,请@我删除。