这段代码实现了一个具有图形用户界面(GUI)的视频下载工具

这段代码实现了一个具有图形用户界面(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 版本中表现不同,需要进行充分的测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值