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视频,可以用requestsm3u8库解析播放列表,再用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

回到顶部