运行pytube代码报HTTP Error 404: Not Found错误如何解决?
问题根因分析
- 代码存在拼写错误:下载方法
download被误写为downlaod,会导致调用失败。 - 硬编码itag风险:不是所有YouTube视频都有对应itag为313的4K流,当视频不存在该分辨率的流时,
get_by_itag(313)会返回None,调用方法时会触发异常,部分情况会被封装为404错误返回。 - pytube解析逻辑滞后:YouTube会不定期更新流媒体地址的签名加密规则,就算是10.9.3版本的pytube也可能存在签名解密逻辑不匹配的问题,导致解析出来的流地址无效,返回404错误。
修复方案
第一步:修正代码逻辑
先替换为以下带异常校验的代码,解决拼写和硬编码的问题:
from pytube import YouTube import time url = input("Paste URL:") try: urll = YouTube(url) except Exception as e: print(f"视频地址解析失败:{e}") exit() # 先枚举所有可用的视频流 available_streams = {} for stream in urll.streams.filter(file_extension='mp4', only_video=True).order_by('resolution').desc(): res = stream.resolution if res == '2160p': available_streams['4K'] = stream.itag elif res == '1080p': available_streams['FHD'] = stream.itag elif res == '720p': available_streams['HD'] = stream.itag elif res == '480p': available_streams['480p'] = stream.itag print("当前视频可用选项:", list(available_streams.keys())) choose = input('Choose: 4K , FHD , HD , 480p') def D4k(): if choose not in available_streams: return f"当前视频没有{choose}分辨率资源" itag = available_streams[choose] stream = urll.streams.get_by_itag(itag) if not stream: return "获取对应分辨率流失败" try: # 加1秒延迟避免触发反爬 time.sleep(1) stream.download() return "下载完成" except Exception as e: return f"下载失败:{e}" print(D4k())
第二步:修复pytube签名解析逻辑
如果修正代码后还是报404错误,手动更新cipher.py的匹配规则:
- 打开Python安装目录下的
site-packages/pytube/cipher.py文件 - 找到
get_throttling_function_name函数内的正则匹配规则,将原有function_patterns列表替换为以下内容:
function_patterns = [ r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&\s*\([a-z]\s*=\s*([a-zA-Z0-9$]+)(\[\d+\])?\([a-z]\)', ]
- 保存文件后重新运行代码即可。
后续避免报错的方法
- 每次出现404错误时先检查pytube是否有更新,执行
pip install --upgrade pytube升级到最新修复版本 - 不要硬编码itag值,每次下载前先枚举当前视频的可用流,从可用资源中选择分辨率
- 代码中增加异常捕获逻辑,对地址解析、流获取、下载三个阶段分别做异常处理,避免直接崩溃
- 下载时增加1-2秒的请求延迟,避免触发YouTube的反爬机制返回404
内容的提问来源于stack exchange,提问作者LastFox
相关产品推荐
相关产品推荐

