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

[复制链接]
发表于 2026-1-14 08:40: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模板随机下载

终极的步调代码如下:
  1. import tkinter as tk
  2. import requests
  3. import re
  4. import os
  5. import random
  6. import zipfile,rarfile
  7. rarfile.UNRAR_TOOL = r"unrar\UnRAR.exe" #没有这个文件将无法解压缩rar格式的压缩包
  8. class PPTDownloaderApp:
  9.     def __init__(self, root):
  10.         self.root = root
  11.         self.root.title("PPT模板批量下载-Gordon VX:psx6697")
  12.         # 调整窗口大小
  13.         self.root.geometry('400x250')  
  14.         # 检查是否存在pptfiles,没有创建pptfiles文件夹
  15.         if not os.path.exists('pptfiles'):
  16.             os.makedirs('pptfiles')
  17.         # 伪装请求头
  18.         self.headers = {
  19.             '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',
  20.             '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'
  21.         }
  22.         # 设置提醒标签
  23.         remind_label = tk.Label(self.root, text="点击按钮下载,文件存于当前目录pptfiles下面", font=("宋体", 12))
  24.         remind_label.pack(padx=1, pady=10)
  25.         # 随机下载按钮
  26.         random_button = tk.Button(self.root, text="随机下载10个PPT模板", font=("宋体", 18), command=self.random_download)
  27.         random_button.pack(padx=20, pady=10)
  28.         # 解压按钮
  29.         extract_button = tk.Button(self.root, text="解压pptfiles中的文件", font=("宋体", 18), command=self.extract_files)
  30.         extract_button.pack(padx=20, pady=10)
  31.     # 获取PPT下载链接函数
  32.     def get_ppt_links(self, url):
  33.         urls = []
  34.         res = requests.get(url, headers=self.headers)
  35.         res.encoding = 'utf-8'
  36.         id_list = re.findall('/article/.*/(.*?).html', res.text)
  37.         for aid in id_list:
  38.             url = f"https://www.ypppt.com/p/d.php?aid={aid}"
  39.             urls.append(url)
  40.         return urls
  41.     # 下载PPT函数
  42.     def download_ppt(self, ppt_link, ppt_name):
  43.         try:
  44.             # 请求下载页面
  45.             resp = requests.get(ppt_link, headers=self.headers)
  46.             # 从下载页面中提取下载链接
  47.             down_link = re.search('<a href="(.*?)">下载地址1', resp.text)
  48.             if not down_link:
  49.                 return f"{ppt_name} 下载链接未找到"
  50.             download_url = down_link.group(1)
  51.             # 请求下载地址
  52.             res = requests.get(download_url)
  53.             # 提取下载地址中的文件扩展名
  54.             file_ext = os.path.splitext(download_url)[-1]  # 提取扩展名
  55.             # 构造文件名,使用扩展名
  56.             file_name = os.path.join('pptfiles', f"{ppt_name}{file_ext}")
  57.             # 如果文件已存在,跳过
  58.             if os.path.exists(file_name):
  59.                 return f"{ppt_name} 已存在,跳过下载"
  60.             # 保存文件
  61.             with open(file_name, 'wb') as f:
  62.                 f.write(res.content)
  63.             return f"{ppt_name} 下载成功"
  64.         except Exception as exc:
  65.             return f"{ppt_name} 下载失败: {exc}"
  66.     # 随机下载10个PPT
  67.     def random_download(self):
  68.         page = random.randint(1, 186)
  69.         if page == 1:
  70.             html_page = 'https://www.ypppt.com/moban/'
  71.         else:
  72.             html_page = f'https://www.ypppt.com/moban/list-{page}.html'
  73.         ppt_links = self.get_ppt_links(html_page)
  74.         unique_titles = set()  # 用于存储唯一的标题
  75.         download_count = 0
  76.         for link in ppt_links:
  77.             if download_count >= 10:  # 如果已经下载了10个,停止
  78.                 break
  79.             try:
  80.                 resp = requests.get(link, headers=self.headers)
  81.                 resp.encoding = 'utf-8'
  82.                 ppt_name = re.findall('<title>(.*?) - 下载页</title>', resp.text)
  83.                 if ppt_name and ppt_name[0] not in unique_titles:  # 检查是否重复
  84.                     unique_titles.add(ppt_name[0])  # 添加到集合中
  85.                     message = self.download_ppt(link, ppt_name[0])  # 调用下载方法
  86.                     print(message)
  87.                     download_count += 1
  88.             except Exception as exc:
  89.                 print(f"错误: {exc}")
  90.     def extract_files(self):
  91.       #获取下载文件的扩展名#
  92.         for file_name in os.listdir('pptfiles'):
  93.             file_path = os.path.join('pptfiles', file_name)
  94.             if file_name.endswith('.zip'):
  95.                 self.extract_zip(file_path)
  96.             elif file_name.endswith('.rar'):
  97.                  self.extract_rar(file_path)
  98.     def extract_zip(self, zip_path):
  99.         #获取zip文件的文件名
  100.         base_name = os.path.splitext(os.path.basename(zip_path))[0]
  101.         
  102.         with zipfile.ZipFile(zip_path, 'r') as zip_ref:
  103.             for member in zip_ref.namelist():
  104.                 # Extract all files to a temporary directory
  105.                 zip_ref.extract(member, 'pptfiles')
  106.                 # Check if the extracted file is a .pptx file
  107.                 if member.endswith('.pptx'):
  108.                     # 构建新的文件名
  109.                     extracted_path = os.path.join('pptfiles', member)
  110.                     new_file_name = f"{base_name}.pptx"
  111.                     new_file_path = os.path.join('pptfiles', new_file_name)
  112.                     # 重命名 .pptx file
  113.                     os.rename(extracted_path, new_file_path)
  114.                     print(f"Renamed {member} to {new_file_name}")
  115.         print(f"解压 {zip_path} 完成")
  116.         
  117.     def extract_rar(self, rar_path):
  118.         # 获取RAR文件的基本文件名
  119.         base_name = os.path.splitext(os.path.basename(rar_path))[0]
  120.         with rarfile.RarFile(rar_path, 'r') as rar_ref:
  121.             for member in rar_ref.infolist():
  122.                 # 提取所有文件到pptfiles目录
  123.                 rar_ref.extract(member, 'pptfiles')
  124.                 # 检查是否为pptx文件
  125.                 if member.filename.endswith('.pptx'):
  126.                     extracted_path = os.path.join('pptfiles', member.filename)
  127.                     new_file_name = f"{base_name}.pptx"
  128.                     new_file_path = os.path.join('pptfiles', new_file_name)
  129.                     # 重命名pptx文件
  130.                     os.rename(extracted_path, new_file_path)
  131.                     print(f"Renamed {member.filename} to {new_file_name}")
  132.         print(f"解压 {rar_path} 完成")
  133. # 创建Tkinter窗口并运行程序
  134. if __name__ == "__main__":
  135.     root = tk.Tk()
  136.     app = PPTDownloaderApp(root)
  137.     root.mainloop()
复制代码
三、代码视频演示

   用Python批量下载PPT模板
四、学后总结

1. 为了防止ip被网站封锁,步调设定了下载的隔断时间。


下载ppt模板

2. 下载过程与批量解压缩步调分两个按钮操持,全部下载文件都会放置在当前目次下的pptfiles这个目次里。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表