[Python]Python写的爬取视频
这是一个用于下载视频的GUI工具(视频只能作为测试所用)。让我来解释一下代码的功能。
首先,我们导入了必要的模块,包括tkinter用于构建GUI界面,yt_dlp用于下载视频,以及os用于处理文件路径和环境变量。
接下来,我们获取当前脚本所在的文件夹路径,并构建了ffmpeg库文件夹的完整路径。然后,我们将该路径添加到环境变量PATH中,以便能够正确执行ffmpeg命令。
然后,我们定义了一个名为progress_hook的函数,用于更新下载进度条。在下载过程中,我们通过计算已下载字节和总字节数的比例来更新进度条的值,并使用window.update()方法来刷新界面。
接下来,我们定义了download_video函数,用于处理视频下载的逻辑。我们首先获取用户输入的视频URL和下载路径。然后,我们使用yt_dlp库设置下载选项,并使用YoutubeDL对象进行视频下载。下载过程中,我们会调用progress_hook函数来更新进度条。最后,我们清空URL输入框和路径输入框,并在状态标签中显示下载完成的信息。
我们创建了GUI界面。界面包括一个URL输入框、一个下载路径输入框、一个下载按钮、一个下载进度条和一个状态标签。当用户点击下载按钮时,会调用download_video函数来开始下载视频。
运行整个GUI界面的逻辑是通过调用window.mainloop()实现的。
这个脚本需要以下几个库的支持:
tkinter:用于构建图形用户界面(GUI)。
yt_dlp:一个用于下载YouTube视频的库,是对youtube-dl的一个分支,提供了更多功能和选项。
os:用于处理文件路径和环境变量。
如果你还没有安装这些库,可以使用以下命令来安装它们:
pip install tkinter
pip install yt-dlp
请确保你的Python环境已经正确安装,并且可以使用pip来安装第三方库。
当然你还需要ffmpeg库的安装:
你可以去官网下载;具体你可以参照这个博文:
添加链接描述
你也可以把ffmpeg库放在根目录下。
源码如下:
import tkinter as tk
from tkinter import ttk
import yt_dlp
import os
#以下4行代码用来支持ffmpeg的库文件来自于本目录
# 获取当前脚本所在的文件夹路径
script_dir = os.path.dirname(os.path.abspath(__file__))
# 构建ffmpeg库文件夹的完整路径
ffmpeg_path = os.path.join(script_dir, "ffmpeg", "bin")
# 获取当前的环境变量PATH值
path_env = os.environ.get("PATH", "")
# 将本文件夹的路径添加到PATH环境变量中
os.environ["PATH"] = f"{ffmpeg_path};{path_env}"
def progress_hook(progress):
"""
下载进度回调函数,用于更新下载进度条
"""
if progress['status'] == 'downloading':
total_bytes = progress.get('total_bytes')
downloaded_bytes = progress.get('downloaded_bytes')
if total_bytes and downloaded_bytes:
percent = downloaded_bytes / total_bytes * 100
# 更新进度条的值
progress_bar['value'] = percent
# 更新界面
window.update()
def download_video():
"""
视频下载函数,处理视频下载的逻辑
"""
video_url = url_entry.get()
download_path = path_entry.get()
ydl_opts = {
'default_search': 'ytsearch',
'outtmpl': download_path + '/%(title)s.%(ext)s',
'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best',
'progress_hooks': [progress_hook],
'verbose': True
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(video_url, download=False)
author_name = info_dict.get('uploader', "未知作者")
video_name = info_dict.get('title', "未知视频")
ydl.download([video_url])
url_entry.delete(0, tk.END)
path_entry.delete(0, tk.END)
status_label.config(text=f"下载完成!作者:{author_name} 视频名称:{video_name}")
# 创建GUI界面
window = tk.Tk()
window.title("YouTube视频下载工具")
# URL输入框
url_label = tk.Label(window, text="视频URL:")
url_label.pack()
url_entry = tk.Entry(window, width=50)
url_entry.pack()
# 下载路径输入框
path_label = tk.Label(window, text="下载路径:")
path_label.pack()
path_entry = tk.Entry(window, width=50)
path_entry.pack()
# 下载按钮
download_button = tk.Button(window, text="下载视频", command=download_video)
download_button.pack()
# 下载进度条
progress_bar = ttk.Progressbar(window, orient=tk.HORIZONTAL, length=200, mode='determinate')
progress_bar.pack()
# 状态标签
status_label = tk.Label(window, text="")
status_label.pack()
# 运行GUI
window.mainloop()