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

news/2024/12/21 21:49:38/

日常工作中,我们总是找不到合适的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模板随机下载

最终的程序代码如下:

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 = 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.ppmy.cn/news/1533355.html

相关文章

C# WPF内存泄漏排查方法详解

在C# WPF开发中&#xff0c;内存泄漏是一个常见且棘手的问题。内存泄漏会导致应用程序随着时间的推移消耗越来越多的内存&#xff0c;最终可能导致应用程序崩溃或者系统性能下降。以下是一些常见的内存泄漏原因以及相应的排查和解决方法。 1. 事件订阅 代码实例&#xff1a; pu…

Excel-统计日期内的个数1月到12月

使用函数COUNTIFS&#xff08;范围,"条件",范围,"条件"&#xff09; COUNTIFS(Sheet!F2:F230,">2024-01-01",sheet!F2:F230,"<2024-01-31") COUNTIFS(sheet!F2:F230,">2024-02-01",sheet!F2:F230,"<2024-…

SprakSQL-Catalog

祝福 在这个举国同庆的时刻&#xff0c;我们首先献上对祖国的祝福&#xff1a; 第一&#xff0c;我们感谢您给我们和平的环境&#xff0c;让我们能快乐生活 第二&#xff0c;祝福我们国家未来的路越走越宽广&#xff0c;科技更发达&#xff0c;人民更幸福 第三&#xff0c;…

(done) 声音信号处理基础知识(11) (Complex Numbers for Audio Signal Processing)

参考&#xff1a;https://www.youtube.com/watch?vDgF4m0AWCgA&t1047s 似乎是因为信号处理需要使用复数&#xff0c;作者花了一节课介绍复数 据油管主所说&#xff0c;声学信号处理中引入复数的原因是&#xff1a;快速完成部分计算 这里的例子是&#xff0c;当我们做傅里…

安装epic games错误码2738解决(安装ue错误码2738)

这个错误不好找到解决方案&#xff0c;尝试删除注册表以及通过电脑管家下载安装都不生效&#xff0c;仍然会错误2738。直到找到了这个解决方案。 1.cmd然后右键以管理员身份运行&#xff0c; 2.cd %windir%\syswow64进入该目录 3.reg delete “HKCU\SOFTWARE\Classes\Wow6432No…

MongoDB 聚合管道

参考: 聚合管道 - MongoDB 手册 v7.0 介绍 聚合管道由一个或多个处理文档的阶段组成&#xff1a; 每个阶段对输入文档执行一个操作。例如&#xff0c;某个阶段可以过滤文档、对文档进行分组并计算值。 从一个阶段输出的文档将传递到下一阶段。 一个聚合管道可以返回针对文档…

Spring Boot框架下的足球青训俱乐部后台开发

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…

解决方案:PCA跟SVD有什么不同

文章目录 一、现象二、解决方案 一、现象 在做模型建模做降维的时候&#xff0c;时常回想起PCA&#xff08;主成分分析&#xff09;和SVD&#xff08;奇异值分解&#xff09;&#xff0c;但两者有什么区别&#xff0c;时而会弄混&#xff0c;所以整理一下 二、解决方案 PCA&…