日常工作中,我们总是找不到合适的PPT模板而烦恼。即使有免费的网站可以下载,但是一个一个地去下载,然后再批量解压进行查看也非常的麻烦,有没有更好方法呢?
今天,我们利用Python来爬取一个网站上的PPT,随机下载10个PPT的模板,然后进行批量解压缩,以方便查看,话不多说,直接开干。
一、设计原理
- 目标网站:确定要爬取的网站,分析其PPT模板所在的页面,然后观察下载的方法。
选择的网站地址
-
确定要使用的python模块。我们使用tkinter来设计软件的UI界面,利用requests发出请求,再用正而表达式找到下载地址,然后把获取的内容以二进制的形式写到本地,最后根据下载的文件类型,分别采用zipfile,rarfile来解压缩zip和rar格式的压缩包。
-
为了解压缩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 = 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模板
四、学后总结
- 为了防止ip被网站封锁,程序设定了下载的间隔时间。
下载ppt模板
- 下载过程与批量解压缩程序分两个按钮设计,所有下载文件都会放置在当前目录下的pptfiles这个目录里。