使用浏览器开发者工具获取index.m3u8文件,直接复制访问路径进行请求即可下载相应的m3u8文件,文件里是ts视频的路径,一般长这样:
每一个.ts路径都是一段流视频访问地址,拼接主域名可以直接下载到相应的视频片段
执行步骤:
1、下载好.m3u8文件
2、使用代码将.m3u8文件内容进行下载、合并成mp4文件
下载代码如下:
# 将m3u8地址文件下载、合成为mp4文件
import requests
import re
import os
def download_ts(path: str, headers: dict, main_url: str, dir_ts: str):
"""
:param dir_ts: 用于保存ts视频文件
:param path: .m3u8文件路径
:param headers: 配置的浏览器请求头
:param main_url: 域名主地址
:return: 返回ts文件下载的文件夹
"""
# 在当前路径下创建一个与m3u8文件同名的文件夹用来保存所下载的.ts文件
if not os.path.exists(dir_ts):
os.mkdir(dir_ts)
# 提取m3u8文件中的ts文件请求地址
with open(path, mode="r") as file:
all_url = file.read()
all_url = re.findall(r"(.*?)ts", all_url)
num = 1
for url in all_url:
url = main_url + url + "ts" # 拼接成完整的请求路径
response = requests.get(url=url, headers=headers)
with open(f"./{dir_ts}/{num}.ts", "wb") as file1: # 请求后直接将ts视频写入到文件中,文件命名为自增数字.ts,方便后续拼接
file1.write(response.content)
num += 1
return dir_ts
def to_mp4(file_path):
"""
:param file_path: ts文件所在的文件夹路径
"""
ts_all = sorted(os.listdir(f"./{file_path}"), key=lambda x: int(x.replace(".ts", ""))) # 列出文件夹内所有的ts文件并排序
print(ts_all)
with open(f"./{file_path}/{file_path}.mp4", "wb+") as mpf: # 以追加形式创建mp4文件
for ts in ts_all:
with open(f"./{file_path}/{ts}", "rb") as tsb: # 循环遍历读取ts文件并写入mp4文件(合并ts到mp4中)
mpf.write(tsb.read())
# os.system(f"rm ./{dir_ts}/*.ts") # 删除冗余的ts视频文件
if __name__ == "__main__":
main_url = "主域名,m3u8文件中一般只有相关的路径参数,没有主域名"
headers = {"配置相关的": "浏览器请求头"}
path = ".m3u8文件路径"
dir_ts = "保存ts文件的路径"
to_mp4(file_path=download_ts(path=path, headers=headers, main_url=main_url, dir_ts=dir_ts))
代码只是将视频片段进行简单拼接