m3u8文件下载
首先打开该网站,按下F12开启审查模式,然后选中左上角出现的小三角,将鼠标移动到视频上接着点击鼠标左键。这个时候已经能够看到视频的链接了(如图一所示),然后直接双击这个链接鼠标右键 -> 转到该网址,在这个新出来的页面就可以下载了。
本以为接下来两集用这个简单的方法就可以了,但是后来发现最新出来的一集不能采用这个方法。它的链接前面加上了blob:
,如果直接访问会得到下面这个界面,而加上blob:
则直接出现一个空白页,这是因为blob:
表示后面的对象是一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,格式比较灵活,一方面适合实时加载(常常见于视频文件),一方面可以有一定反爬效果。但是当浏览器识别了blob
对象之后就会向服务器请求真实的文件地址,所以这个时候我们整点特殊手段就可以了。
还是老样子,先按下F12,但是发现这个时候视频无法播放了,还出现了已在调试程序中暂停
,这个直接点下面这个停用断点按钮就可以了。而且再检查呈现的信息,发现出现了m3u8.php
字样,经检查视频的格式果然为m3u8。那没什么好说的,按照经验应该还会存在一个m3u8文件,里面保存了对应的视频地址。于是打开网络选项,按照指示重新记录了一下网络活动,果然让我找到了一个ChainsawMan03.m3u8
文件
简单看一下文件的内容,发现给了很多链接而且均为png
格式,这个应该就是我们需要下载的视频片段。但是按照常理这些文件应该是ts
格式,这里猜测一下是该网站对视频片段进行了加密。果断把文件后缀名修改为ts
,发现下载下来的文件已经可以用播放器正常播放了。接下来要做的就是把所有的片段下载下来,然后再使用ffmpeg将片段拼接起来,组成一个完整的视频。但是在拼接的过程中,ffmpeg报错,error code = -3
,具体的原因是虽然强制修改了名称,但是其二进制文件并没有png
头,所以需要在视频片段中写入png
头
talk is cheap, show me code!
import re
import requests
import tqdm
import time
if __name__ == '__main__':
# 提取所有链接
with open(r"ChainsawMan03.m3u8", "r") as f:
text = f.read()
fragments = re.findall(r"https.*?png",text)
# 一些需要使用到的
error_list = []
error_num = []
headers = {
'User-Agent':"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
'Sec-Fetch-Mode':'cors',
'Sec-Fetch-Dest':'empty'
}
timeout = 30
base_dir = r"D:\ffmpeg\bin\m3u8\{}.ts"
# 获取视频片段并修改
for i in tqdm.tqdm(range(len(fragments))):
try:
r = requests.get(fragments[i], headers=headers,timeout=30)
frag_dir = base_dir.format(i)
with open(frag_dir, "wb") as f:
f.write(r.content)
f.seek(0x00)
f.write(b'\xff\xff\xff\xff')
f.flush()
except:
error_list.append(fragments[i])
error_num.append(i)
# 创建一个文本,用于后续使用ffmpeg拼接视频
file_dir = r"D:\ffmpeg\bin\videos.txt"
with open(file_dir, "w") as f:
for i in range(len(fragments)):
frag_dir = base_dir.format(i)
f.write("file " + "'" + frag_dir + "'" + "\n")
使用上述代码我们就可以下载下来所有的视频片段了,接下来到ffmpeg文件夹下(偷懒,并没有把ffmpeg放到环境变量,因此下载下来的文件都放在ffmpeg可执行文件同级目录下),在此处打开cmd,并输入如下指令就可以得到最终的视频了。ffmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,功能十分强大,很多视频播放软件都是ffmpeg的套壳,上面已经放了链接感兴趣可以看看。
ffmpeg.exe -f concat -safe 0 -i videos.txt -c copy out.ts