Skip to content

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 (推荐)

pytubefixpytube 的维护分支,专门修复了 403 错误问题:

  1. 安装替代库:

    bash
    pip install pytubefix
  2. 修改代码中的导入语句:

    python
    # 将原有导入
    from pytube import YouTube
    
    # 替换为
    from pytubefix import YouTube
  3. 原有代码逻辑无需改变:

    python
    yt = YouTube("https://www.youtube.com/watch?v=...")
    stream = yt.streams.get_audio_only()
    stream.download()

优势

  • 接口与旧版 pytube 完全兼容
  • 专门修复 YouTube 最近的认证变更
  • 最小化代码改动

方法二:使用 yt-dlp (功能更强大)

yt-dlpyoutube-dl 的增强版,支持更稳定的下载协议:

  1. 安装库:

    bash
    pip install yt-dlp
  2. 基础使用方法:

    python
    from 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 文件

  1. 在浏览器中使用 Get Cookies.txt 扩展导出 cookies
  2. 在代码中添加配置:
    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)

注意事项

  1. cookiesfrombrowser 参数要求浏览器必须保持关闭状态
  2. Cookie 需通过目标网站的登录认证(浏览器需登录 YouTube 账号)
  3. 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 修改临时测试★☆☆☆☆

推荐操作流程

  1. 优先尝试 pytubefix 方案(兼容性最佳)
  2. 如需下载会员内容/年龄限制视频,使用 yt-dlp + cookies
  3. 定期更新库版本(YouTube 会持续调整反爬策略)

所有方案均支持音频流专用下载:

python
# pytubefix 音频专用下载
yt.streams.filter(only_audio=True).first().download()

# yt-dlp 音频专用下载
ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
    }]
}