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

基于pytube与custom tkinter的YouTube下载器报错排查

问题

我用pytube和custom tkinter写了一个Python版YouTube视频下载器,但粘贴YouTube链接尝试下载时,程序总是触发自定义的“Download Error”提示。

完整代码如下:

import tkinter
import customtkinter
from pytube import YouTube

# Youtube/Pytube Library

def startDownload():
    try:
        ytLink = link.get()
        ytObject = YouTube(ytLink, on_progress_callback=on_progress)
        video = ytObject.streams.get_highest_resolution()
        title.configure(text=ytObject.title, text_color="white")
        video.download()
        finishLabel.configure(text="Downloaded!")
    except:        
        finishLabel.configure(text="Download Error", text_color="red")

def on_progress(stream, chunk, bytes_remaining):
    total_size = stream.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage = bytes_downloaded / total_size * 100
    per = str(int(percentage))
    progress.configure(text=per + '%')
    progress.update()

    progressbar.set(float(percentage) / 100)

#system settings

customtkinter.set_appearance_mode("System")
customtkinter.set_default_color_theme("blue")

#Framework

app = customtkinter.CTk()
app.geometry("720x480")
app.title("DerpyStudios Downloader")

#UI Elements Basics
title = customtkinter.CTkLabel(app, text="Insert Youtube Link Here")
title.pack(padx=50, pady=50)

#Input

url_var = tkinter.StringVar()
link = customtkinter.CTkEntry(app, width=350, height=40, textvariable=url_var)
link.pack()

#Download

download = customtkinter.CTkButton(app, text="Download", command=startDownload)
download.pack(padx=10, pady=10)

#Progress

progress = customtkinter.CTkLabel(app, text="0%")
progress.pack()

progressbar = customtkinter.CTkProgressBar(app, width=400)
progressbar.set(0)
progressbar.pack(padx=10, pady=10)

#Post Download

finishLabel = customtkinter.CTkLabel(app, text="")
finishLabel.pack()

#loop
app.mainloop()

程序为常规.py文件,GUI会显示下载错误提示。


解决方案

1. 先捕获具体错误信息

当前代码的except块未捕获具体异常,无法定位问题根源。修改startDownload函数,打印错误详情到控制台:

def startDownload():
    try:
        ytLink = link.get()
        ytObject = YouTube(ytLink, on_progress_callback=on_progress)
        video = ytObject.streams.get_highest_resolution()
        title.configure(text=ytObject.title, text_color="white")
        video.download()
        finishLabel.configure(text="Downloaded!")
    except Exception as e:        
        finishLabel.configure(text="Download Error", text_color="red")
        print(f"具体错误:{str(e)}")  # 控制台输出错误详情

运行后查看控制台信息,能精准定位问题类型。

2. 针对pytube常见问题的修复方法

  • 更新pytube到最新版本:YouTube会频繁更新,旧版pytube容易失效。执行命令升级:
    pip install --upgrade pytube
    
  • 添加OAuth授权:部分网络/地区环境下,pytube的签名验证会失败。初始化YouTube对象时添加授权参数:
    ytObject = YouTube(ytLink, on_progress_callback=on_progress, use_oauth=True, allow_oauth_cache=True)
    
    首次运行会弹出浏览器窗口要求登录YouTube授权,之后会缓存授权信息。
  • 检查网络与视频权限:确保网络可正常访问YouTube,部分视频有地区限制,可换一个公开无限制的视频链接测试。
  • 替换分辨率获取方式:部分视频的最高分辨率流可能无法直接下载,改用兼容性更好的筛选方式:
    video = ytObject.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
    
    该方式会选择带音频的MP4格式最高分辨率流,避免单独下载视频流无声音的问题。

内容的提问来源于stack exchange,提问作者DaDerpyBoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:50:13