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

日常工作中,我们总是找不到合适的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 = rootself.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个PPTdef 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 = 0for link in ppt_links:if download_count >= 10:  # 如果已经下载了10个,停止breaktry: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 += 1except 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 directoryzip_ref.extract(member, 'pptfiles')# Check if the extracted file is a .pptx fileif 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 fileos.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.xdnf.cn/news/1552401.html

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

相关文章

Java学习-网络编程

目录 1. 网络通信基本概念 1.1 通信 1.2 网络 1.3 协议 1.4 网络通信 1.5 网络通信协议 1.6 TCP/IP协议 1.7 互联网 1.8 计算机网络 2. TCP与UDP协议 2.1 TCP 2.2 UDP 2.3 TCP的三次握手 2.4 为什么要三次握手 2.5 TCP四次挥手 2.6 为什么要四次挥手 3. HTTP1…

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

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

python16_引号使用

引号使用 A "Im a teacher!" B I\m a teacher! C """Im a teacher!, I am a teacher!, "I am a teacher!" """def single_quote(s):return sdef double_quote(s):return sdef triple_quote(s):return sif __name__ &qu…

【Linux】进程+权限管理+软硬链接+其他命令

目录 1. man手册 2. find按文件名称 3. find按文件类型 4. date显示时间 5. cal显示日历 6. du文件大小 7. ln链接 8. 软连接&#xff0c;硬链接区别 9. 文本查找 10. wc统计文本(计算文件的Bytes数、字数或列数) 11. 查看文本内容&#xff1a; 1…

单调队列与单调栈<2>——单调栈

单调栈的定义 单调递增栈 栈中元素从栈底到栈顶是递增的。 单调递减栈 栈中元素从栈底到栈顶是递减的。 单调栈的核心内容 我们从左到右遍历元素&#xff0c;构造单调栈&#xff08;从栈顶到栈底递增或减&#xff09;&#xff1a;在 i 从左往右遍历的过程中&#xff0c;我…

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 (…

数据结构-链表笔记

移除节点 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListN…

常见的VPS或者独立服务器的控制面板推荐

随着越来越多的企业和个人转向VPS和独立服务器以获得更高的性能和灵活性&#xff0c;选择合适的控制面板变得尤为重要。一个好的控制面板可以大大简化服务器管理&#xff0c;提高工作效率。本篇文章将介绍2024年最值得推荐的VPS控制面板&#xff0c;帮助您做出明智的选择。 1.…

python调用opencv报错“module ‘cv2‘ has no attribute ‘namedWindow‘”

之前电脑上使用pip install安装过opencv相关的python模块&#xff0c;不过后续学习opencv时主要使用OpenCVSharp在VS2022中创建项目测试。今天学习过程中突然想用python试试&#xff0c;不过运行下面代码时报错“module ‘cv2’ has no attribute namedWindow”。 import cv2c…

TVS管工作原理:【图文讲解】

TVS(Transient Voltage Suppressor)二极管&#xff0c;又称为瞬态抑制二极管&#xff0c;是普遍使用的一种新型高效电路保护器件&#xff0c;它具有极快的响应时间&#xff08;亚纳秒级&#xff09;和相当高的浪涌吸收能力。当它的两端经受瞬间的高能量冲击时&#xff0c;TVS能…

每日OJ题_牛客_DP2跳台阶_动态规划_C++_Java

目录 牛客_DP2跳台阶_动态规划 题目解析 C代码 Java代码 牛客_DP2跳台阶_动态规划 跳台阶_牛客题霸_牛客网 题目解析 当前值只和数组的前两个值有关&#xff0c;在往前面的就无关了&#xff0c;所以没必要申请一个数组&#xff0c;直接使用两个变量即可&#xff0c;这样空…

【数据结构与算法】时间复杂度和空间复杂度例题

文章目录 时间复杂度常数阶时间O(1)对数阶时间O(logN)线性阶时间O(n)线性对数阶时间O(nlogN)平方阶时间O(n*n) 空间复杂度常量空间O(1)线性空间O(n)二维空间O(n*n)递归空间 时间复杂度 常数阶时间O(1) 代码在执行的时候&#xff0c;它消耗的时间并不随着某个变量的增长而增长…

pytorch之梯度累加

1.什么是梯度&#xff1f; 梯度可以理解为一个多变量函数的变化率&#xff0c;它告诉我们在某一点上&#xff0c;函数的输出如何随输入的变化而变化。更直观地说&#xff0c;梯度指示了最优化方向。 在机器学习中的作用&#xff1a;在训练模型时&#xff0c;我们的目标是最小…

LeetCode[中等] 279.完全平方

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 1…

数值计算的程序设计问题举例

### 数值计算的程序设计问题 #### 1. 结构静力分析计算 **涉及领域**&#xff1a;工程力学、建筑工程 **主要问题**&#xff1a;线性代数方程组&#xff08;Linear Algebraic Equations&#xff09; **解释说明**&#xff1a; 在结构静力分析中&#xff0c;我们需要解决复杂的…

Java项目实战II基于Java+Spring Boot+MySQL的购物推荐网站的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着互联网技术的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。然而&#xf…

自动驾驶系列—自动驾驶MCU架构全方位解析:从单核到多核的选型指南与应用实例

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

VIIRS 版本1(5000)数据于2024年6月17日停更,请转向VIIRS版本2(5200)

根据官网发布的消息&#xff0c;VIIRS版本1&#xff08;5000&#xff09;的多数数据产品于今日停止更新。需要VIIRS数据的朋友需要转向版本2数据了。 可见红外成像辐射计套件 (VIIRS) 第 1 版 (集合 1) 陆地数据产品于 2024 年 6 月 17 日终止生产。唯一的例外是双向反射分布函…

python+requests接口测试(tonken)

一、如何提取tonken值 token案例&#xff1a; 案例&#xff1a; 网站&#xff1a;http://shop.duoceshi.com/login?redirect%2Fdashboard 验证码&#xff08;固定&#xff09;&#xff1a;8888 二、抓取接口 第一个接口&#xff1a;code接口&#xff1a;http://manage.duoc…

Stm32的bootloader无法使用问题

Stm32的bootloader无法使用问题 用不了一键下载电路 首先简单地对此处涉及的内容进行介绍:如果stm32的BOOT0引脚为低电平时,系统从FLASH中启动,而如果BOOT0引脚为高电平,且BOOT1为低电平时,系统从自举程序(bootloader)中启动. 我在自制照相机设计中加入了ISP一键下载电路,如…