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.rhkb.cn/news/437174.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ios】---swift开发从入门到放弃

swift开发从入门到放弃 环境swift入门变量与常量类型安全和类型推断print函数字符串整数双精度布尔运算符数组集合set字典区间元祖可选类型循环语句条件语句switch语句函数枚举类型闭包数组方法结构体 环境 1.在App Store下载Xcode 2.新建项目&#xff08;可以先使用这个&…

Hadoop HDFS命令操作实例

一.创建与查看HDFS目录 每次重启后&#xff0c;Jps和java -version执行出来的结果不符合就使用 source ~/.bash_profile 是在 Unix/Linux 系统上用来重新加载用户的 Bash 配置文件 ~/.bash_profile 的命令。这条命令的作用是使得当前的 Bash 环境重新读取并应用 ~/.bash_pro…

PHP安装后Apache无法运行的问题

问题 按照网上教程php安装点击跳转教程&#xff0c;然后修改Apache的httpd.conf文件&#xff0c;本来可以运行的Apache&#xff0c;无法运行了 然后在"C:\httpd-2.4.62-240904-win64-VS17\Apache24\logs\error.log"&#xff08;就是我下载Apache的目录下的logs中&am…

当AI成为作家,人工智能在写作领域的崛起

AI写作技术的应用正在多个领域展现出其强大的潜力和价值&#xff0c;它不仅极大地提升了内容创作的效率&#xff0c;还为创作者提供了一个全新的创作伙伴。 随着技术的进步&#xff0c;AI写作工具越来越能够理解复杂的语境和用户需求&#xff0c;帮助创作者生成高质量的内容。…

排水系统C++

题目&#xff1a; 样例解释&#xff1a; 1 号结点是接收口&#xff0c;4,5 号结点没有排出管道&#xff0c;因此是最终排水口。 1 吨污水流入 1 号结点后&#xff0c;均等地流向 2,3,5 号结点&#xff0c;三个结点各流入 1/3 吨污水。 2 号结点流入的 1/3​ 吨污水将均等地流向…

深度学习与数学归纳法

最近发现&#xff0c;深度学习可以分为两个主要的阶段&#xff0c;分别是前向推理以及反向传播&#xff0c;分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候&#xff0c;本质上是在利用历史数据求网络参数的先验分布&#xff1b; …

Java 基础语法 Day10

一、异常 1.1异常的基本处理 1.抛出异常&#xff1a;throw 2.捕获异常&#xff1a;try-catch 1.2异常的作用 1.定位程序bug的关键信息 2.可以作为方法内部的一种特殊返回值&#xff0c;通知给上层调用&#xff0c;方便处理 //需求&#xff1a;将两个数的除返回 public cla…

音视频入门基础:FLV专题(9)——Script Tag简介

一、SCRIPTDATA 根据《video_file_format_spec_v10_1.pdf》第75页到76页&#xff0c;如果某个Tag的Tag header中的TagType值为18&#xff0c;表示该Tag为Script Tag&#xff08;脚本Tag&#xff0c;又称Data Tag、SCRIPTDATA tag&#xff09;。这时如果Filter的值不为1表示未加…

UG NX二次开发(C++)-建模-采用NXOpen获取拉伸特征的信息

文章目录 1、前言2、创建一个特征3 采用NXOpen来实现拉伸特征信息的获取1、前言 UG NX二次开发过程中,大部分初学者喜欢用UFun函数来实现UG NX二次开发的功能,因为相较于NXOpen,UFun函数简单易懂;但是有时UFun函数如果初始值设置不好,出现的错误也比较难排查。比如对于拉…

Spark SQL分析层优化

导读&#xff1a;本期是《深入浅出Apache Spark》系列分享的第四期分享&#xff0c;第一期分享了Spark core的概念、原理和架构&#xff0c;第二期分享了Spark SQL的概念和原理&#xff0c;第三期则为Spark SQL解析层的原理和优化案例。本次分享内容主要是Spark SQL分析层的原理…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

用 API 实现 AI 视频摘要:动手制作属于你的 AI 视频小助手

AI 视频摘要想必你一定不陌生&#xff0c;在各大视频平台&#xff0c;比如 B 站&#xff0c;评论区的 AI 视频小助手就如雨后春笋般遍地都是。 今天&#xff0c;让我们来填了这“护城河”&#xff0c;站到墙上看一看它的全貌。 简而言之&#xff0c;AI 视频摘要的工作流程如下&…

基于Spring Boot+Unipp的中考体测训练小程序(协同过滤算法、图形化分析)【原创】

&#x1f388;系统亮点&#xff1a;协同过滤算法、图形化分析&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

研究生如何利用ChatGPT帮助开展日常科研工作?

小白可做&#xff01;全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为当代研究生&#xff0c;科研工作三部曲----读文献、开组会、数据分析。无论哪一个&#xff0c;都令研究生们倍感头疼&#xff0c;简直就是梦魇。每当看到导师发来的消息&a…

AI面试指南:AI工具总结评测,助力求职季

AI面试指南&#xff1a;AI工具总结评测&#xff0c;助力求职季 摘要&#xff1a; 在竞争激烈的AI领域秋招季&#xff0c;准备充分并借助高效工具是提升面试通过率的关键。本文主要介绍一些针对秋招的AI面试工具和学习资源&#xff0c;分为简历优化、面试助手、手撕代码练习三个…

HarmonyOS/OpenHarmony 如何将rawfile中文件复制到沙箱中

关键词&#xff1a;h5离线加载、HarmonyOS、OpenHarmony、文件操作、复制、解压 当下有一个场景&#xff0c;需要离线加载 h5离线资源zip包&#xff0c;并实现资源包的动态更新&#xff0c;那么仅靠 $rawfile并不能实现该功能&#xff0c;那么我们该如何实现&#xff1f; 我们…

YOLO11改进|注意力机制篇|引入MLCA轻量级注意力机制

目录 一、MLCA注意力机制1.1MLCA注意力介绍1.2MLCA核心代码 五、添加MLCA注意力机制5.1STEP15.2STEP25.3STEP35.4STEP4 六、yaml文件与运行6.1yaml文件6.2运行成功截图 一、MLCA注意力机制 1.1MLCA注意力介绍 MLCA&#xff08;Multi-Level Channel Attention&#xff0c;多级通…

【前端安全】js逆向之微信公众号登录密码

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 随着发展&#xff0c;越来越多的登录页面添加了密码加密的措施&#xff0c;使得暴力破解变得不在简单&a…

SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)

SpringBoot教程&#xff08;安装篇&#xff09; | Docker Desktop的安装&#xff08;Windows下的Docker环境&#xff09; 前言如何安装Docker Desktop资源下载安装启动&#xff08;重点&#xff09;1. 检查 bcdedit的hypervisorlaunchtype是否为Auto2. 检查CPU是否开启虚拟化3.…

c#增删改查 (数据操作的基础)

//数据操作无非4种 //增删改查 是数据操作的基础 int[] ints { 110, 120, 119 }; //1. 查 在这里就是获取数组中的数据 int num ints[1]; //将数组中的某个元素取出来 Console.WriteLine(num); //2. 改 将数据从…