Pytube HTTP 403 Forbidden 错误
问题描述
近期许多用户在使用 Python 库 Pytube
(版本 15.0.0)下载 YouTube 内容时,遇到 HTTP 403 Forbidden 错误。此问题通常发生在尝试获取音视频流时,控制台返回错误信息:
http.client.HTTPException: HTTP Error 403: Forbidden
该问题从2024年11月下旬开始出现,主要原因在于 YouTube 更新了其反爬虫机制,导致 Pytube
默认配置失效。常见症状包括:
- 之前正常运行的下载脚本突然失败
- 修改 User-Agent 或使用不同客户端参数无效
- 重新安装 Pytube 无法解决问题
解决方案
方法一:使用 pytubefix (推荐)
pytubefix
是 pytube
的维护分支,专门修复了 403 错误问题:
安装替代库:
bashpip install pytubefix
修改代码中的导入语句:
python# 将原有导入 from pytube import YouTube # 替换为 from pytubefix import YouTube
原有代码逻辑无需改变:
pythonyt = YouTube("https://www.youtube.com/watch?v=...") stream = yt.streams.get_audio_only() stream.download()
优势
- 接口与旧版
pytube
完全兼容 - 专门修复 YouTube 最近的认证变更
- 最小化代码改动
方法二:使用 yt-dlp (功能更强大)
yt-dlp
是 youtube-dl
的增强版,支持更稳定的下载协议:
安装库:
bashpip install yt-dlp
基础使用方法:
pythonfrom yt_dlp import YoutubeDL URLS = ["https://www.youtube.com/watch?v=..."] with YoutubeDL() as ydl: ydl.download(URLS)
处理机器人验证问题
当遇到 "Sign in to confirm you’re not a bot" 错误时,需添加 cookie 认证:
方案一:使用 cookies.txt 文件
- 在浏览器中使用 Get Cookies.txt 扩展导出 cookies
- 在代码中添加配置:python
ydl_opts = { 'outtmpl': '%(title)s.%(ext)s', 'cookiefile': 'cookies.txt' # 指定导出的cookie文件 } with YoutubeDL(ydl_opts) as ydl: ydl.download(URLS)
方案二:直接从浏览器读取 cookies
python
ydl_opts = {
'outtmpl': '%(title)s.%(ext)s',
'cookiesfrombrowser': ('chrome',) # 支持 chrome/firefox/edge
}
with YoutubeDL(ydl_opts) as ydl:
ydl.download(URLS)
注意事项
cookiesfrombrowser
参数要求浏览器必须保持关闭状态- Cookie 需通过目标网站的登录认证(浏览器需登录 YouTube 账号)
- Windows 系统可能需要额外安装
browsercookie
包
备选方案:临时修改 Headers(不稳定)
若坚持使用老版 Pytube,可尝试修改底层 headers(效果有限):
python
from pytube import request
# 在初始化请求前覆盖默认headers
request.default_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/125.0.0.0 Safari/537.36',
'Accept-Language': 'en-US,en;q=0.9'
}
yt = YouTube(url)
...
注意
此方法仅作为临时应对方案,YouTube随时可能使该配置失效
总结建议
方案 | 推荐场景 | 可持续性 |
---|---|---|
pytubefix | 需最小化代码修改 | ★★★★☆ |
yt-dlp + cookies | 处理复杂下载需求 | ★★★★★ |
Header 修改 | 临时测试 | ★☆☆☆☆ |
推荐操作流程:
- 优先尝试
pytubefix
方案(兼容性最佳) - 如需下载会员内容/年龄限制视频,使用
yt-dlp + cookies
- 定期更新库版本(YouTube 会持续调整反爬策略)
所有方案均支持音频流专用下载:
python
# pytubefix 音频专用下载
yt.streams.filter(only_audio=True).first().download()
# yt-dlp 音频专用下载
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
}]
}