一样寻常工作中,我们总是找不到符合的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 = root
- self.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个PPT
- def 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 = 0
- for link in ppt_links:
- if download_count >= 10: # 如果已经下载了10个,停止
- break
- try:
- 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 += 1
- except 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 directory
- zip_ref.extract(member, 'pptfiles')
- # Check if the extracted file is a .pptx file
- if 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 file
- os.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这个目次里。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |