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

使用pytube下载YouTube播放列表前10个视频时下载数量超标问题

解决Pytube下载播放列表前10个视频超出数量的问题

问题根源分析

  1. 嵌套循环逻辑错误:原代码中while嵌套for的写法会导致每次进入while都重新遍历整个播放列表,即使start计数到10,for循环仍会继续处理剩余视频,最终下载数量远超限制。
  2. 列表属性误用: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:12:43