使用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.
相关产品推荐
相关产品推荐

