使用pytube下载YouTube播放列表为MP3格式时遭遇AttributeError问题求助
pytube下载YouTube播放列表为MP3格式时遭遇AttributeError问题求助
嘿,我来帮你搞定这个问题!你碰到的AttributeError: 'Playlist' object has no attribute 'streams'其实是个很典型的逻辑小失误——Playlist对象本身根本没有streams属性,这个属性是属于单个YouTube视频(Video)对象的。你原代码里错误地直接去遍历播放列表的streams,但实际上得先遍历播放列表里的每一个视频,再对每个单独的视频去获取音频流。
另外你提到的“把MP4转成MP3”的需求,我也会在修正后的代码里加上这个功能,用moviepy来做格式转换(需要先安装这个库哦)。
错误代码的核心问题
你原代码里这行是出错的关键:
for video in p.streams:
这里的p是Playlist实例,它没有streams属性,你应该遍历播放列表里的每个视频项,再对每个视频进行操作。
修正后的完整代码
先确保你安装了必要的依赖:
pip install pytube moviepy
然后替换成下面的代码:
from pytube import Playlist, YouTube from moviepy.editor import AudioFileClip import os def download_playlist_as_mp3(): playlist_url = str(input(f"Playlist URL \n>>")) p = Playlist(playlist_url) # 保存路径设为脚本所在目录 save_dir = os.path.dirname(os.path.abspath(__file__)) print(f"准备下载播放列表中的 {len(p.video_urls)} 个音频...") for idx, video_url in enumerate(p.video_urls, 1): try: yt = YouTube(video_url) # 获取仅音频的最高质量流 audio_stream = yt.streams.filter(only_audio=True).first() print(f"正在下载第 {idx} 个: {yt.title}") # 下载MP4格式的音频文件 downloaded_file = audio_stream.download(output_path=save_dir) # 转换为MP3格式 mp3_filename = os.path.splitext(downloaded_file)[0] + ".mp3" with AudioFileClip(downloaded_file) as audio: audio.write_audiofile(mp3_filename) # 删除原MP4文件(可选,不需要保留的话就打开这行) os.remove(downloaded_file) print(f"第 {idx} 个转换完成: {mp3_filename}") except Exception as e: print(f"处理视频 {video_url} 时出错: {str(e)}") continue if __name__ == "__main__": download_playlist_as_mp3()
代码说明
- 正确遍历播放列表:通过
p.video_urls拿到播放列表里所有视频的URL,逐个处理每个视频 - 下载音频流:对每个视频创建YouTube对象,过滤出仅音频的流并下载,默认是MP4容器的AAC音频
- 格式转换:用
moviepy的AudioFileClip读取下载的MP4文件,导出成标准MP3格式 - 错误处理:加了异常捕获,避免单个视频出错导致整个脚本直接中断
额外小提示
- 如果碰到pytube无法访问视频的情况,可能是YouTube的反爬机制导致,你可以尝试给YouTube对象添加自己的cookie参数(需要从浏览器里导出你的YouTube cookie)
- 要是不想用
moviepy,也可以直接把下载的MP4文件后缀改成.mp3(因为里面的音频编码是AAC,大部分播放器都支持,但严格来说不是标准MP3格式)
备注:内容来源于stack exchange,提问作者iboixq
相关产品推荐
相关产品推荐

