Python批量下载PPT模块并实现自动解压

日常工作中,我们总是找不到合适的PPT模板而烦恼。即使有免费的网站可以下载,但是一个一个地去下载,然后再批量解压进行查看也非常的麻烦,有没有更好方法呢?

今天,我们利用Python来爬取一个网站上的PPT,随机下载10个PPT的模板,然后进行批量解压缩,以方便查看,话不多说,直接开干。

一、设计原理

  1. 目标网站:确定要爬取的网站,分析其PPT模板所在的页面,然后观察下载的方法。

选择的网站地址

  1. 确定要使用的python模块。我们使用tkinter来设计软件的UI界面,利用requests发出请求,再用正而表达式找到下载地址,然后把获取的内容以二进制的形式写到本地,最后根据下载的文件类型,分别采用zipfile,rarfile来解压缩zip和rar格式的压缩包。

  2. 为了解压缩rar格式的文件,需要提前下载UnRAR.exe(需要去官方网站下载)这个文件备用。

二、编程实现

程序主要分获取ppt的网址,随机下载ppt并进行保存,再解压缩zip和rar文件。

注意下载ppt时,要用user-agent和cookie进行headers的伪装,以防止被网站封ip.编写的代码运行后界面如下:

PPT模板随机下载

最终的程序代码如下:

python 复制代码
import tkinter as tk
import requests
import re
import os
import random
import zipfile,rarfile
rarfile.UNRAR_TOOL = r"unrar\UnRAR.exe" #没有这个文件将无法解压缩rar格式的压缩包
class PPTDownloaderApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PPT模板批量下载-Gordon VX:psx6697")
        # 调整窗口大小
        self.root.geometry('400x250')  
        # 检查是否存在pptfiles,没有创建pptfiles文件夹
        if not os.path.exists('pptfiles'):
            os.makedirs('pptfiles')

        # 伪装请求头
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36 Edg/128.0.0.0',
            'cookie': 'Hm_lvt_45db753385e6d769706e10062e3d6453=1726380411; HMACCOUNT=0DD3BF0082D0C9BD; __gads=ID=2d1cebbb284d6815:T=1726380425:RT=1726380425:S=ALNI_MYiyzS75GnBK17xlSJkTc65KqRj5g; __gpi=UID=00000f0212907824:T=1726380425:RT=1726380425:S=ALNI_MYUPpCJhqzNgCLabrCzoEVp3Fus9A; Hm_lpvt_45db753385e6d769706e10062e3d6453=1726380712'
        }
        # 设置提醒标签
        remind_label = tk.Label(self.root, text="点击按钮下载,文件存于当前目录pptfiles下面", font=("宋体", 12))
        remind_label.pack(padx=1, pady=10)
        # 随机下载按钮
        random_button = tk.Button(self.root, text="随机下载10个PPT模板", font=("宋体", 18), command=self.random_download)
        random_button.pack(padx=20, pady=10)
        # 解压按钮
        extract_button = tk.Button(self.root, text="解压pptfiles中的文件", font=("宋体", 18), command=self.extract_files)
        extract_button.pack(padx=20, pady=10)

    # 获取PPT下载链接函数
    def get_ppt_links(self, url):
        urls = []
        res = requests.get(url, headers=self.headers)
        res.encoding = 'utf-8'
        id_list = re.findall('/article/.*/(.*?).html', res.text)
        for aid in id_list:
            url = f"https://www.ypppt.com/p/d.php?aid={aid}"
            urls.append(url)
        return urls

    # 下载PPT函数
    def download_ppt(self, ppt_link, ppt_name):
        try:
            # 请求下载页面
            resp = requests.get(ppt_link, headers=self.headers)
            # 从下载页面中提取下载链接
            down_link = re.search('<a href="(.*?)">下载地址1', resp.text)

            if not down_link:
                return f"{ppt_name} 下载链接未找到"

            download_url = down_link.group(1)
            # 请求下载地址
            res = requests.get(download_url)
            # 提取下载地址中的文件扩展名
            file_ext = os.path.splitext(download_url)[-1]  # 提取扩展名

            # 构造文件名,使用扩展名
            file_name = os.path.join('pptfiles', f"{ppt_name}{file_ext}")
            # 如果文件已存在,跳过
            if os.path.exists(file_name):
                return f"{ppt_name} 已存在,跳过下载"

            # 保存文件
            with open(file_name, 'wb') as f:
                f.write(res.content)
            return f"{ppt_name} 下载成功"
        except Exception as exc:
            return f"{ppt_name} 下载失败: {exc}"

    # 随机下载10个PPT
    def random_download(self):
        page = random.randint(1, 186)
        if page == 1:
            html_page = 'https://www.ypppt.com/moban/'
        else:
            html_page = f'https://www.ypppt.com/moban/list-{page}.html'

        ppt_links = self.get_ppt_links(html_page)
        unique_titles = set()  # 用于存储唯一的标题
        download_count = 0

        for link in ppt_links:
            if download_count >= 10:  # 如果已经下载了10个,停止
                break
            try:
                resp = requests.get(link, headers=self.headers)
                resp.encoding = 'utf-8'
                ppt_name = re.findall('<title>(.*?) - 下载页</title>', resp.text)

                if ppt_name and ppt_name[0] not in unique_titles:  # 检查是否重复
                    unique_titles.add(ppt_name[0])  # 添加到集合中
                    message = self.download_ppt(link, ppt_name[0])  # 调用下载方法
                    print(message)
                    download_count += 1
            except Exception as exc:
                print(f"错误: {exc}")

    def extract_files(self):
      #获取下载文件的扩展名#
        for file_name in os.listdir('pptfiles'):
            file_path = os.path.join('pptfiles', file_name)
            if file_name.endswith('.zip'):
                self.extract_zip(file_path)
            elif file_name.endswith('.rar'):
                 self.extract_rar(file_path)

    def extract_zip(self, zip_path):
        #获取zip文件的文件名
        base_name = os.path.splitext(os.path.basename(zip_path))[0]
        
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:
            for member in zip_ref.namelist():
                # Extract all files to a temporary directory
                zip_ref.extract(member, 'pptfiles')

                # Check if the extracted file is a .pptx file
                if member.endswith('.pptx'):
                    # 构建新的文件名
                    extracted_path = os.path.join('pptfiles', member)
                    new_file_name = f"{base_name}.pptx"
                    new_file_path = os.path.join('pptfiles', new_file_name)

                    # 重命名 .pptx file
                    os.rename(extracted_path, new_file_path)
                    print(f"Renamed {member} to {new_file_name}")

        print(f"解压 {zip_path} 完成")
        
    def extract_rar(self, rar_path):
        # 获取RAR文件的基本文件名
        base_name = os.path.splitext(os.path.basename(rar_path))[0]

        with rarfile.RarFile(rar_path, 'r') as rar_ref:
            for member in rar_ref.infolist():
                # 提取所有文件到pptfiles目录
                rar_ref.extract(member, 'pptfiles')

                # 检查是否为pptx文件
                if member.filename.endswith('.pptx'):
                    extracted_path = os.path.join('pptfiles', member.filename)
                    new_file_name = f"{base_name}.pptx"
                    new_file_path = os.path.join('pptfiles', new_file_name)

                    # 重命名pptx文件
                    os.rename(extracted_path, new_file_path)
                    print(f"Renamed {member.filename} to {new_file_name}")
        print(f"解压 {rar_path} 完成")

# 创建Tkinter窗口并运行程序
if __name__ == "__main__":
    root = tk.Tk()
    app = PPTDownloaderApp(root)
    root.mainloop()

三、代码视频演示

用Python批量下载PPT模板

四、学后总结

  1. 为了防止ip被网站封锁,程序设定了下载的间隔时间。

下载ppt模板

  1. 下载过程与批量解压缩程序分两个按钮设计,所有下载文件都会放置在当前目录下的pptfiles这个目录里。
相关推荐
No0d1es3 分钟前
2024年12月青少年软件编程(C语言/C++)等级考试试卷(三级)
c语言·开发语言·青少年编程·电子学会·三级
犬余8 分钟前
《Java源力物语》-4.集合府邸的新秀
java·开发语言
yuanbenshidiaos8 分钟前
QT-------认识QT
开发语言·qt
海螺姑娘的小魏15 分钟前
Effective C++ 条款 16:成对使用 `new` 和 `delete` 时要采取相同形式
开发语言·c++
neter.asia34 分钟前
C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)
开发语言·c#
Stara051134 分钟前
基于YOLOV5+Flask安全帽RTSP视频流实时目标检测
python·yolo·目标检测·flask
重整旗鼓~38 分钟前
2.flask中使用装饰器统一验证用户登录
后端·python·flask
杜小白也想的美1 小时前
FlaskAPI-路径参数、查询参数
python·fastapi
EterNity_TiMe_1 小时前
【论文复现】农作物病害分类(Web端实现)
前端·人工智能·python·机器学习·分类·数据挖掘
2301_809177471 小时前
sqoop,flume草稿
开发语言