赞
踩
在这个数字时代,我们经常在网页上遇到各种精彩的视频,但往往只能观看而无法下载。今天,我将向大家介绍如何使用 Python 自动下载网页中的 M3U8 链接,并将其转换为 MP4 格式,让你轻松保存喜欢的视频!
首先,确保你已经安装了 ffmpeg
。如果还没有安装,可以通过以参考这里安装:https://wizops.net/archives/202404/323.html
- import os
- import urllib3
- import requests
- import subprocess
- from m3u8 import M3U8
- from tenacity import retry, wait_random, stop_after_attempt
- from gevent.pool import Pool
- urllib3.disable_warnings()
-
- pool = Pool(10)
-
- @retry(stop=stop_after_attempt(3), wait=wait_random(2, 5))
- def request(url):
- """发送请求"""
- try:
- res = requests.get(url, verify=False, timeout=5)
- return res
- except Exception as e:
- print(url, e)
- raise e
-
-
- def download_segment(url, path):
- """下载ts文件"""
- filename = url.split("/")[-1]
- file = os.path.join(path, filename)
- if os.path.exists(file):
- return
-
- res = request(url)
- with open(file, "wb")as f:
- f.write(res.content)
-
-
- def convert_mp4(path, output):
- # 使用FFmpeg将local.m3u8转换为一个MP4文件 ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy xxx.mp4
- # m3u8文件中有key需要带参数-allowed_extensions ALL
- subprocess.call(['ffmpeg', '-allowed_extensions', 'ALL', '-i', 'local.m3u8', '-c', 'copy', output], cwd=path)
-
- def download_m3u8(url, path, output):
- """
- 下载单个m3u8主程序
- url: m3u8链接url
- path: 单个m3u8目录
- output: 转换输出文件路径名
- """
- base_url = url.rsplit("/", 1)[0]
- # 创建目录
- segment_dir = os.path.join(path, "index")
- if not os.path.exists(segment_dir):
- os.makedirs(segment_dir)
-
- # 下载M3U8文件
- m3u8_file_name = os.path.join(path, "index.m3u8")
- res = request(url)
- with open(m3u8_file_name, "w", encoding="utf-8")as f:
- f.write(res.text)
-
- # 解析M3U8文件
- m3u8_obj = M3U8(res.text)
-
- print(m3u8_obj.keys)
- # 下载key文件
- for item in m3u8_obj.keys:
- if item:
- key_url = item.uri if item.uri.startwith("http") else f"{base_url}/{item.uri}"
- key_file_name = os.path.join(path, item.uri)
- res = request(key_url)
- with open(key_file_name, "w", encoding="utf-8")as f:
- f.write(res.text)
-
- segments = []
- # 生成新的本地M3U8文件内容
- for segment in m3u8_obj.segments:
- segments.append(segment.uri)
- segment.uri = "index/" + segment.uri.split("/")[-1]
-
- # 保存M3U8文件
- local_file_name = os.path.join(path, "local.m3u8")
- with open(local_file_name, 'w') as f:
- f.write(m3u8_obj.dumps())
-
- # 下载ts文件
- for url in segments:
- pool.spawn(download_segment, url, segment_dir)
- pool.join()
-
- # ts文件下载完成, 转换成mp4文件
- if len(segments) == len(os.listdir(segment_dir)):
- convert_mp4(path, output)
-
- if __name__ == "__main__":
- url = "https://v3.mstopq.com/202302/26/E92zcVVNkT1/video/1000k_0X720_64k_25/hls/index.m3u8"
- cur_path = os.path.abspath(os.path.dirname(__file__))
- path = os.path.join(cur_path, "终结者创世纪_tmp")
- output = os.path.join(cur_path, "终结者创世纪.mp4")
- download_m3u8(url, path, output)

三、注意事项
通过这个简单的示例,你可以使用 Python 自动下载网页中的 M3U8 链接并将其转换为 MP4 格式。现在,你可以轻松保存喜欢的视频,随时随地观看啦!希望这个技巧对你有所帮助。如果有任何问题或建议,欢迎在评论中留言!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。