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

使用Python下载YouTube播放列表为MP3时触发KeyError问题求助

问题

尝试使用pytube、moviepy和re库下载个人YouTube视频播放列表并转换为MP3格式,多数情况运行正常,但处理到某一视频时程序停止并抛出KeyError: 'streamingData'错误。

实现代码:

from pytube import YouTube
from pytube import Playlist
import os
import moviepy.editor as mp #to convert the mp4 to wav then mp3
import re

playlist = Playlist("https://www.youtube.com/playlist?list=PLb2p41g_hNVOeBy3OjGTdXKgscedya9f_")

for url in playlist:
    print(url)
for vid in playlist.videos:
    print(vid)
for url in playlist:
    YouTube(url).streams.filter(only_audio=True).first().download("./Downloads/Music_2")
folder = "./Downloads/Music_2"
for file in os.listdir(folder):
    if re.search('mp4', file):
        print("Converting: " + file)
        mp4_path = os.path.join(folder,file)
        mp3_path = os.path.join(folder,os.path.splitext(file)[0]+'.mp3')
        new_file = mp.AudioFileClip(mp4_path)
        new_file.write_audiofile(mp3_path)
        os.removed(mp4_path)

报错信息:

Traceback (most recent call last):
  File "C:\\Users\\user\\Downloads\\Projects\\Python\\main.py", line 14, in <module>
    YouTube(url).streams.filter(only_audio=True).first().download("./Downloads/Music_3")
    ^^^^^^^^^^^^^^^^^^^^
  File "C:\\Users\\user\\Downloads\\Projects\\Python\\venv\\Lib\\site-packages\\pytube\\__main__.py", line 296, in streams
    return StreamQuery(self.fmt_streams)
                       ^^^^^^^^^^^^^^^^
  File "C:\\Users\\user\\Downloads\\Projects\\Python\\venv\\Lib\\site-packages\\pytube\\__main__.py", line 176, in fmt_streams
    stream_manifest = extract.apply_descrambler(self.streaming_data)
                                                ^^^^^^^^^^^^^^^^^^^
  File "C:\\Users\\user\\Downloads\\Projects\\Python\\venv\\Lib\\site-packages\\pytube\\__main__.py", line 161, in streaming_data
    return self.vid_info['streamingData']
           ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'streamingData'

Process finished with exit code 1
解决方案

KeyError: 'streamingData'通常是视频无法被pytube正常解析导致,原因包括视频权限限制、区域封锁或pytube版本兼容问题,以下是具体修复方案:

1. 升级pytube到最新版本

pytube需频繁更新适配YouTube的API变化,旧版本易出现解析失败,执行命令升级:

pip install --upgrade pytube

2. 增加异常捕获机制

在下载和转换环节加入try-except块,跳过异常视频,避免程序整体崩溃,同时记录错误信息方便排查。

3. 修正代码笔误

原代码中os.removed(mp4_path)是拼写错误,应改为os.remove(mp4_path)。

修改后的完整代码

from pytube import YouTube
from pytube import Playlist
import os
import moviepy.editor as mp
import re

playlist = Playlist("https://www.youtube.com/playlist?list=PLb2p41g_hNVOeBy3OjGTdXKgscedya9f_")
download_folder = "./Downloads/Music_2"

# 确保下载目录存在,不存在则创建
os.makedirs(download_folder, exist_ok=True)

# 批量下载播放列表音频
for url in playlist:
    print(f"正在处理: {url}")
    try:
        yt = YouTube(url)
        # 按比特率降序筛选,优先下载高质量音频流
        audio_stream = yt.streams.filter(only_audio=True).order_by('abr').desc().first()
        if audio_stream:
            audio_stream.download(output_path=download_folder)
            print(f"成功下载: {yt.title}")
        else:
            print(f"未找到可用音频流: {url}")
    except Exception as e:
        print(f"处理视频失败 {url}: {str(e)}")
        continue

# 批量转换MP4到MP3
for file in os.listdir(download_folder):
    # 精准匹配mp4后缀
    if re.search(r'\.mp4$', file):
        print(f"正在转换: {file}")
        mp4_path = os.path.join(download_folder, file)
        mp3_path = os.path.join(download_folder, os.path.splitext(file)[0] + '.mp3')
        try:
            # 使用with语句自动管理音频文件资源
            with mp.AudioFileClip(mp4_path) as audio_clip:
                audio_clip.write_audiofile(mp3_path)
            # 删除原MP4文件
            os.remove(mp4_path)
            print(f"转换完成: {mp3_path}")
        except Exception as e:
            print(f"转换失败 {file}: {str(e)}")

额外优化说明

  • 新增目录创建逻辑,避免因目录不存在报错
  • 筛选音频流时优先选择高比特率版本
  • 转换环节用with语句自动释放资源,防止内存泄漏
  • 全流程异常捕获,保证程序能继续处理后续视频

内容的提问来源于stack exchange,提问作者Mert K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:20:33