Python中如何下载知乎的m3u8视频
视频地址 https://v.vzuu.com/video/930514486520012800 抓包看到 https://lens.zhihu.com/api/videos/930514486520012800 这个请求 ,里面有 m3u8 地址,但是用 ffmpeg 下载失败了
$ ffmpeg -i 'https://vdn.vzuu.com/Act-ss-m3u8-hd/74d0edb67b0c44dca559375da1e4df74/6005a040-ed51-11e7-9313-0242ac112a03None.m3u8?auth_key=1515338325-0-0-89d1ba089ceda0022fff9f4448af9786&expiration=1515338325&disable_local_cache=0' 'jump.mp4'
[https @ 0000000000099280] HTTP error 403 Forbidden
https://vdn.vzuu.com/Act-ss-m3u8-hd/74d0edb67b0c44dca559375da1e4df74/6005a040-ed51-11e7-9313-0242ac112a03None.m3u8?auth_key=1515338325-0-0-89d1ba089ceda0022fff9f4448af9786&expiration=1515338325&disable_local_cache=0: Server returned 403 For
bidden (access denied)
Python中如何下载知乎的m3u8视频
3 回复
要下载知乎的m3u8视频,可以用requests和m3u8库解析播放列表,再用ffmpeg合并。这里有个直接能跑的脚本:
import requests
import m3u8
import subprocess
import os
from urllib.parse import urljoin
def download_zhihu_m3u8(m3u8_url, output_filename='output.mp4'):
# 获取m3u8内容
resp = requests.get(m3u8_url, headers={'User-Agent': 'Mozilla/5.0'})
m3u8_master = m3u8.loads(resp.text, uri=m3u8_url)
# 获取最高清晰度的播放列表
if m3u8_master.playlists:
best_quality = max(m3u8_master.playlists,
key=lambda p: p.stream_info.resolution[0] if p.stream_info.resolution else 0)
m3u8_url = urljoin(m3u8_url, best_quality.uri)
resp = requests.get(m3u8_url, headers={'User-Agent': 'Mozilla/5.0'})
# 解析TS片段
m3u8_obj = m3u8.loads(resp.text, uri=m3u8_url)
# 下载所有TS片段
ts_files = []
for i, segment in enumerate(m3u8_obj.segments):
ts_url = urljoin(m3u8_url, segment.uri)
ts_filename = f'temp_{i:04d}.ts'
print(f'下载片段 {i+1}/{len(m3u8_obj.segments)}')
ts_data = requests.get(ts_url, headers={'User-Agent': 'Mozilla/5.0'}).content
with open(ts_filename, 'wb') as f:
f.write(ts_data)
ts_files.append(ts_filename)
# 用ffmpeg合并
with open('filelist.txt', 'w') as f:
for ts_file in ts_files:
f.write(f"file '{ts_file}'\n")
subprocess.run([
'ffmpeg', '-f', 'concat', '-safe', '0',
'-i', 'filelist.txt', '-c', 'copy', output_filename
], check=True)
# 清理临时文件
for ts_file in ts_files:
os.remove(ts_file)
os.remove('filelist.txt')
print(f'视频已保存为: {output_filename}')
# 使用示例
if __name__ == '__main__':
# 替换成实际的m3u8地址
m3u8_url = 'https://www.zhihu.com/video/xxx.m3u8'
download_zhihu_m3u8(m3u8_url, 'zhihu_video.mp4')
需要先装依赖:
pip install requests m3u8
还得确保系统装了ffmpeg。脚本会先解析m3u8文件,自动选最高清的版本,然后下载所有.ts片段,最后用ffmpeg合并成mp4。注意替换示例里的m3u8地址,知乎的视频地址可能需要从网页源码里找。
总结:用requests+m3u8+ffmpeg这套组合拳就行。
ffmpeg -i “https://xxx.m3u8” -vcodec copy -acodec copy -absf aac_adtstoasc baihespxyz.mp4

