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

news2024/11/20 1:25:28

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

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

一、设计原理

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

选择的网站地址

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

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

二、编程实现

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

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

PPT模板随机下载

最终的程序代码如下:

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模板

2. 下载过程与批量解压缩程序分两个按钮设计,所有下载文件都会放置在当前目录下的pptfiles这个目录里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM整合:图书管理系统

图书管理系统 一.环境 1.数据库环境 CREATE DATABASE ssmbuild;USE ssmbuild;DROP TABLE IF EXISTS books;CREATE TABLE books (bookID INT(10) NOT NULL AUTO_INCREMENT COMMENT 书id,bookName VARCHAR(100) NOT NULL COMMENT 书名,bookCounts INT(11) NOT NULL COMMENT 数量…

Leecode热题100-48.旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]示…

QML使用Qt自带软键盘例子

//注意&#xff1a;一定要保证Qt有安装VirtualKeyboard插件 import QtQuick 2.10 import QtQuick.Window 2.3 import QtQuick.Controls 2.3 import QtQuick.VirtualKeyboard 2.1 import QtQuick.VirtualKeyboard.Settings 2.1 Window { id: root visible: true w…

109.WEB渗透测试-信息收集-FOFA语法(9)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;108.WEB渗透测试-信息收集-FOFA语法&#xff08;8&#xff09; 未授权burp&#xff1a; …

净利润暴跌,撤了,募投资金大比例购置不动产,突击申请专利

开科唯识终止原因如下&#xff1a;首先&#xff0c;报告期内&#xff0c;开科唯识收入规模较小&#xff0c;2023年上半年净利润更是出现暴跌的情况&#xff0c;其2023年可能难以满足创业板上市新规。此外&#xff0c;开科唯识研发费用率始终低于同行业可比公司&#xff0c;仅有…

线性代数书中求解齐次线性方程组、非齐次线性方程组方法的特点和缺陷(附实例讲解)

目录 一、克拉默法则 1. 方法概述 2. 例16(1) P45 3. 特点 (1) 只适用于系数矩阵是方阵 (2) 只适用于行列式非零 (3) 只适用于唯一解的情况 (4) 只适用于非齐次线性方程组 二、逆矩阵 1. 方法概述 2. 例16(2) P45 3. 特点 (1) 只适用于系数矩阵必须是方阵且可逆 …

每日读则推(二)

n.免疫疗法 n.策略,行动计划,战略 n.一代 v.设计(engineer n.工程师&#xff0c;设计师 v.设计,建造) A novel immunotherapy strategy using in vivo generation of engineered CAR T cells can n.(长篇)小说 a.新颖的,珍奇的 …

WebGIS包括哪些技术栈?怎么学习?

WebGIS&#xff0c;其实是利用Web开发技术结合地理信息系统&#xff08;GIS&#xff09;的产物&#xff0c;它是一种通过Internet实现GIS交互操作和服务的最佳途径。 WebGIS通过图形化界面直观地呈现地理信息和特定数据&#xff0c;具有可扩展性和跨平台性。 它提供交互性&am…

CSP-J二轮模拟赛----张浩轩补题报告

1.题目报告 1.交替出场2.翻翻转转3.方格取数4.圆圆中的方方AC0分--文件读写0分20分--骗分 2.赛中概况 第一题比较顺利&#xff0c;五六分钟就开始敲代码&#xff0c;暴力AC。 第二题耗了30分钟左右才有思路&#xff0c;写的时候也不大顺利&#xff0c;用得递归。文件读写错了…

HTML+CSS 基础第三季课堂笔记

一、CSS基础概念 CSS有两个重要的概念&#xff0c;分别是样式和布局 CSS的样式分为两种&#xff0c;一种是文字的样式&#xff0c;一种是盒模型的样式 CSS的另一个重要的特性就是辅助页面布局&#xff0c;完成HTML不能完成的功能&#xff0c;比如并排显示&#xff0c;比如精…

Flowable之任务撤回(支持主流程、子流程相互撤回)

撤回任务&#xff1a;主流程 > 主流程 处室主管【送科长审核】 处室主管【撤回科长审核】 流程日志 撤回任务&#xff1a;子流程 > 子流程 会办接收岗【送处室主管】 会办接收岗【撤回处室主管】 会办接收岗【同意】 撤回任务&#xff1a;子流程 > 主流程 处室主管…

秋招内推--招联金融2025

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

每日读则推(一)

v.避免,回避,撤销 n.黑花园蚁 Several animals are known to alter their behavior to avoid infections. But black garden v.改变,改动 n.传染病,感染,污染ants are th…

低空经济时代来临,挑战和机遇详细分析

低空经济作为一种新兴的经济形态&#xff0c;正逐步成为推动国民经济发展的新增长点。它依托于低空空域&#xff0c;涵盖通用航空、无人机应用、航空运动、低空旅游等多个领域&#xff0c;展现了广阔的发展前景和巨大的发展潜力。本文旨在详细分析低空经济时代来临所带来的挑战…

C语言数组和指针笔试题(三)

目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个…

C语言、Eazy_x——井字棋

#include<graphics.h>char board_data[3][3] { { -,-,-},{ -,-,-},{ -,-,-}, };char current_piece o;//检测指定棋子玩家是否获胜 bool CheckWin(char c) {if (board_data[0][0] c && board_data[0][1] c && board_data[0][2] c)return true;if (…

html+css+js实现step进度条效果

实现效果 代码实现 HTML部分 <div class"box"><ul class"step"><li class"circle actives ">1</li><li class"circle">2</li><li class"circle">3</li><li class&quo…

Sui Bridge今日正式上线Sui主网

等待结束&#xff01;Sui Bridge现已上线Sui主网。 Sui Bridge是一种原生解决方案&#xff0c;用于在外部生态&#xff08;如以太坊&#xff09;之间转移资产。随着Web3的扩展和成熟&#xff0c;打破主要生态之间的壁垒&#xff0c;允许资产和数据自由流动变得尤为重要。 在W…

十大排序算法集锦

前言 众所周知&#xff0c;程序数据结构算法&#xff0c;由此可见算法的重要性。 为了了解算法&#xff0c;可以从排序算法入手&#xff0c;如下是十大排序算法的介绍(简介&#xff0c;原理&#xff0c;动图&#xff0c;代码&#xff0c;复杂性分析等)&#xff0c;希望可以带你…

代码随想录算法训练营Day18 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

目录 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 530.二叉搜索树的最小绝对差 题目 530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值…