这段代码实现了一个具有图形用户界面(GUI)的视频下载工具
1用户在输入框中输入一个网址。
2点击“开始下载”按钮,程序从该网址爬取包含MP4视频链接的锚点(标签)。
3程序将找到的视频链接保存到一个名为video_links.txt的文件中。
4程序依次下载这些视频文件,并将其保存到名为downloaded_videos的文件夹中。
5下载过程中,程序会实时显示下载进度和速度。
6视频下载完成后,程序会弹出一个提示框通知用户。
7此外,代码还添加了日志记录功能,以便在出现问题时查看详细的错误信息。
download_videos 函数:
负责从输入的网址获取网页内容。
解析网页,提取出所有可能的 MP4 格式的视频链接。
将视频链接保存到一个名为 video_links.txt 的文件中。
创建一个文件夹用于保存下载的视频。
逐个下载视频文件,并实时计算和显示下载进度与速度。
on_click 函数:
获取用户在输入框中输入的网址。
如果网址有效,调用 download_videos 函数下载视频。
整个程序通过 tkinter 构建了一个简单的图形用户界面,用户输入网址后点击“开始下载”按钮即可启动下载流程。
引用库
import requests
from bs4 import BeautifulSoup
import re
import logging
import os
import time
from tkinter import Tk, Entry, Button, Label, messagebox
设置日志记录
# 设置日志记录
logging.basicConfig(level=logging.INFO)
使用 BeautifulSoup 解析网页内容
# 使用 BeautifulSoup 解析网页内容
try:
soup = BeautifulSoup(html, 'html.parser')
except Exception as e:
logging.error(f"解析网页内容时出错: {e}")
messagebox.showerror("错误", f"解析网页内容时出错: {e}")
return
等等…
完成代码如下:
import requests
from bs4 import BeautifulSoup
import re
import logging
import os
import time
from tkinter import Tk, Entry, Button, Label, messagebox
# 设置日志记录
logging.basicConfig(level=logging.INFO)
def download_videos(url):
# 发送 HTTP 请求并获取网页内容
try:
response = requests.get(url)
response.raise_for_status()
html = response.text
except requests.exceptions.RequestException as e:
logging.error(f"请求网页时出错: {e}")
messagebox.showerror("错误", f"请求网页时出错: {e}")
return
# 使用 BeautifulSoup 解析网页内容
try:
soup = BeautifulSoup(html, 'html.parser')
except Exception as e:
logging.error(f"解析网页内容时出错: {e}")
messagebox.showerror("错误", f"解析网页内容时出错: {e}")
return
# 找到所有视频链接*?\.mp4
video_links = []
try:
for link in soup.find_all('a', href=True):
href = link['href']
if re.match(r'.*?\.mp4', href):
video_links.append(href)
except Exception as e:
logging.error(f"查找视频链接时出错: {e}")
messagebox.showerror("错误", f"查找视频链接时出错: {e}")
return
# 创建保存视频链接的文件video_links.txt
save_file = "video_links.txt"
try:
with open(save_file, 'w') as f:
for link in video_links:
f.write(link + '\n')
except IOError as e:
logging.error(f"保存视频链接到文件时出错: {e}")
messagebox.showerror("错误", f"保存视频链接到文件时出错: {e}")
return
# 下载视频件文video_{idx}.mp4
download_folder = "downloaded_videos"
if not os.path.exists(download_folder):
os.makedirs(download_folder)
for idx, link in enumerate(video_links):
try:
video_name = os.path.join(download_folder, f'video_{idx}.mp4')
video_response = requests.get(link, stream=True, timeout=10)
video_response.raise_for_status()
total_size = int(video_response.headers.get('content-length', 0))
block_size = 1024 # 单次写入的块大小
downloaded_size = 0
start_time = time.time()
with open(video_name, 'wb') as f:
for data in video_response.iter_content(block_size):
downloaded_size += len(data)
f.write(data)
progress = downloaded_size / total_size * 100
elapsed_time = max(time.time() - start_time, 1e-6) # 避免除数为零的情况
speed = downloaded_size / elapsed_time / 1024 # 计算下载速度(KB/s)
logging.info(f"下载进度: {progress:.2f}% 速度: {speed:.2f} KB/s")
except requests.exceptions.RequestException as e:
logging.error(f"下载视频 {link} 时出错: {e}")
continue # 遇到错误时跳过此视频,继续下载下一个
logging.info("视频下载完成,并已保存下载地址至 video_links.txt 文件。")
messagebox.showinfo("完成", "视频下载完成,并已保存下载地址。")
def on_click():
url = entry.get()
if url:
download_videos(url)
else:
messagebox.showerror("错误", "请输入有效的网址")
# 创建GUI窗口(只是个网址输入框哦)
root = Tk()
root.title("视频下载工具")
Label(root, text="请输入网址:").pack()
entry = Entry(root)
entry.pack()
Button(root, text="开始下载", command=on_click).pack()
root.mainloop()
注意事项:
1法律合规性:爬取和下载未经授权的视频可能涉及侵犯版权和违反法律法规,务必确保您有合法的权利和授权来进行这样的操作。
2网站许可:某些网站明确禁止爬取行为,您需要查看并遵守目标网站的使用条款,请勿使用下载器做违法事情。
3错误处理:虽然代码对一些常见的错误进行了处理和提示,但可能无法涵盖所有可能的错误情况。
4视频来源准确性:通过网页解析获取的视频链接可能不准确或不完整,导致下载失败或下载到错误的内容。
5稳定性和性能:大量的视频下载请求可能会导致网络阻塞、程序崩溃或下载速度缓慢。
用户输入验证:目前仅检查了用户输入是否为空,可能需要更完善的网址格式验证以确保输入的有效性和合法性。
6兼容性:此代码可能在某些特定的网络环境、操作系统或 Python 版本中表现不同,需要进行充分的测试。