You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python pytube3的YouTube下载器部分视频无法下载,报KeyError: 'url'与'cipher'

解决pytube3下载YouTube视频时的KeyError问题

这个问题我之前也碰到过,本质是YouTube一直在更新视频链接的加密和解析机制,而你使用的pytube3版本已经过时,没法适配这些新变化,所以才会在解析时抛出KeyError: 'url'和后续的KeyError: 'cipher'错误。下面是几个靠谱的解决思路:

1. 升级到官方最新版的pytube

首先要明确,现在官方维护的包是pytube,而不是pytube3了。旧的pytube3已经停止更新,自然没法应对YouTube的新机制。你可以执行以下命令替换掉旧版本:

pip uninstall pytube3
pip install --upgrade pytube

新版本修复了大量YouTube API变更带来的兼容性问题,绝大多数情况下,升级后就能正常下载那些之前失败的视频。

2. 手动修改pytube的extract.py文件(应急方案)

如果升级后还是遇到类似问题,或者暂时没法升级,可以手动修改报错的extract.py文件,过滤掉那些无法解析的格式项:

  1. 找到你报错里的文件路径,比如C:\Users\tarun\PycharmProjects\YTDownloader\venv\lib\site-packages\pytube\extract.py
  2. 打开文件,找到apply_descrambler函数
  3. 修改函数内的格式处理逻辑,添加过滤步骤:
def apply_descrambler(stream_data, fmt):
    formats = stream_data["formats"]
    # 先过滤掉没有url或cipher字段的无效格式项
    valid_formats = [f for f in formats if ("url" in f or "cipher" in f)]
    for format_item in valid_formats:
        if "url" in format_item:
            # 原有的url处理逻辑
            format_item["url"] = format_item["url"] + "&signature=" + format_item["s"]
        else:
            # 原有的cipher处理逻辑
            cipher_url = parse_qs(format_item["cipher"])
            format_item["url"] = cipher_url["url"][0] + "&signature=" + cipher_url["s"][0]
    stream_data["formats"] = valid_formats

这样处理后,程序会自动跳过那些无法解析的格式,避免抛出KeyError。

3. 尝试社区维护的fork版本

如果官方版暂时还没适配最新的YouTube变化,可以试试一些社区维护的fork版本,比如pytube-fixed(注意选择正规的PyPI包):

pip install pytube-fixed

这些fork版本通常会更快跟进YouTube的更新,解决一些官方版还没修复的问题。

额外注意事项

  • YouTube的反爬和加密机制会频繁更新,建议定期检查并更新pytube库,避免再次遇到类似问题。
  • 有些视频可能因为版权限制、区域封锁或者设置了禁止下载,这种情况下即使解决了KeyError也无法下载,需要先确认视频的可下载权限。

内容的提问来源于stack exchange,提问作者Tarun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:37:57