日常工作中,我们总是找不到合适的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这个目录里。