使用pytube下载YouTube播放列表前10个视频时下载数量超标问题
解决Pytube下载播放列表前10个视频超出数量的问题
问题根源分析
- 嵌套循环逻辑错误:原代码中
while嵌套for的写法会导致每次进入while都重新遍历整个播放列表,即使start计数到10,for循环仍会继续处理剩余视频,最终下载数量远超限制。 - 列表属性误用:
playlist.video_urls[:10]返回的是URL字符串列表,并非Playlist对象,自然没有.videos属性,因此触发AttributeError。
简洁高效的解决方案
方案一:直接截取播放列表的前10个视频对象
from pytube import Playlist playlist_link = "https://www.youtube.com/playlist?list=PLI1yx5Z0Lrv77D_g1tvF9u3FVqnrNbCRL" max_videos = 10 # 初始化播放列表并截取前10个视频对象 playlist = Playlist(playlist_link) target_videos = playlist.videos[:max_videos] for idx, video in enumerate(target_videos, 1): print(f"尝试下载第 {idx}/{max_videos} 个视频") try: # 选择带音频的最高分辨率MP4流(可按需调整) video.streams.filter(progressive=True, file_extension='mp4')\ .order_by('resolution').desc().first().download() print(f"第 {idx} 个视频下载完成") except Exception as e: print(f"第 {idx} 个视频下载失败:{str(e)}")
方案二:通过URL列表逐个创建YouTube对象
如果需要单独处理视频URL,可使用此方式:
from pytube import Playlist, YouTube playlist_link = "https://www.youtube.com/playlist?list=PLI1yx5Z0Lrv77D_g1tvF9u3FVqnrNbCRL" max_videos = 10 playlist = Playlist(playlist_link) target_urls = playlist.video_urls[:max_videos] for idx, url in enumerate(target_urls, 1): print(f"尝试下载第 {idx}/{max_videos} 个视频") try: video = YouTube(url) video.streams.filter(progressive=True, file_extension='mp4')\ .order_by('resolution').desc().first().download() print(f"第 {idx} 个视频下载完成") except Exception as e: print(f"第 {idx} 个视频下载失败:{str(e)}")
关键优化点
- 直接对
playlist.videos或playlist.video_urls做切片操作,精准限制处理的视频数量。 - 使用
enumerate直观显示下载进度,提升可读性。 - 替换了已被弃用的
streams.first(),改用明确的流过滤逻辑,适配Pytube新版本。 - 捕获具体异常并输出错误信息,便于排查问题(如年龄限制、网络错误等)。
内容的提问来源于stack exchange,提问作者aloo_q
相关产品推荐
相关产品推荐

