最近工作中要使用PPT,但是模板搞不定怎么办,嘿嘿,直接批量下载,各种模板随便安排。
找了很多PPT模板网站,发现大多数网站都要登陆和vip才可以下载到想要的模板。后来发现这个网站不需要登陆和vip也可以下载符合自己要求的模板,小白制作,刚开始学python 代码有点冗余。
https://www.ypppt.com/moban/
0x01 爬虫思路
1.获取所有的模板url
2.遍历每页ppt模板并获取子页url
3.根据遍历到的子页url可以查到下载的url
4.使用获取到的下载url进行下载模板
0x02 遍历所有的模板url的接口和总页数
1.查看response发现子页的api接口在class="p-title"
的href
里面,只要提取出href
的内容就可以打开对应模板的子页了。
打开的子页面,发现
点击下载
这个按钮可以进入下载页面,这个请查看0x03
2.发现简约模板有12页,页数在div class="page-navi"
里面
0x03 根据子页url查找下载模板的url和下载模板
1.打开点击下载
跳转到下载模板页面
这里就是模板下载的url地址了,复制这个地址就可以下载模板了
下载模板的url发现有两个,并且还都一样,我们提取一个就行
最后就是下载模板了,这是脚本运行后的下载结果
附上脚本
# 这是第1节,获取url的脚本,命名为ppt_url.py
# _*_ coding:utf-8 _*_
import requests
from bs4 import BeautifulSoup
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/92.0.4515.107 Safari/537.36 ',
}
def get_ppt(muban, page_number):
"""
:param muban: 模板对应的url字符串
:param page_number: 此模板类型的页数
:return:
"""
url = 'https://www.ypppt.com/moban/{name}/{page}'.format(name=muban, page=page_number)
res = requests.get(url, headers=headers)
res.encoding = res.apparent_encoding # 解决'gbk'编解码器不能编码字符'\xe7'问题
soup = BeautifulSoup(res.text, 'html5lib')
html_find = soup.find('ul', class_='posts clear')
ppt_list = html_find.find_all(class_='p-title')
list_result = []
name_result = []
for i in ppt_list:
list_result.append('https://www.ypppt.com' + i.get('href'))
name_result.append(i.string)
return list_result, name_result
def page_num(name_muban):
"""
:param name_muban: 模板对应的url字符串
:return:
"""
url = 'https://www.ypppt.com/moban/{name}/'.format(name=name_muban)
res = requests.get(url, headers=headers)
res.encoding = res.apparent_encoding # 解决'gbk'编解码器不能编码字符'\xe7'问题
soup = BeautifulSoup(res.text, 'html5lib')
html_find = soup.find('div', class_="page-navi")
html_list = html_find.find_all('a')
page_list = set()
for s in html_list:
page_list.add(s.get('href'))
return page_list
def muban_name(name):
"""
# 这里可以优化,可以提取response的模板名称,这样就可以不用写这么多判断了
:param name: 对应模板判断
:return:
"""
if name == '简约模板':
return 'jianyue'
if name == '商务模板':
return 'shangwu'
if name == '自我介绍':
return 'jieshao'
if name == '开题报告':
return 'kaiti'
if name == '职业规划':
return 'zhiye'
if name == '精美模板':
return 'jingmei'
if name == '公司介绍':
return 'gongsi'
if name == '个人简历':
return 'jianli'
if name == '培训课件':
return 'peixun'
if name == '动态模板':
return 'dongtai'
if name == '总结汇报':
return 'zongjie'
if name == '述职报告':
return 'shuzhi'
if name == '论文答辩':
return 'lunwen'
if name == '优秀作品':
return 'zuopin'
if name == '中国风':
return 'zhongguo'
if name == '公司企业':
return 'qiye'
if name == '教育教学':
return 'jiaoyu'
if name == '经济金融':
return 'jingji'
if name == '网络科技':
return 'kexue'
if name == '建筑地产':
return 'jianzhu'
if name == '体育运动':
return 'tiyu'
if name == '自然风景':
return 'ziran'
if name == '环境保护':
return 'huanjing'
if name == '读书笔记':
return 'gongye'
if name == '医学医疗':
return 'yixue'
if name == '旅游旅行':
return 'lvyou'
if name == '动物模板':
return 'dongwu'
if name == '植物模板':
return 'zhiwu'
if name == '美食水果':
return 'shiwu'
if name == '艺术抽象':
return 'yishu'
if name == '党建工作':
return 'dangjian'
if name == '婚礼爱情':
return 'hunli'
if name == '卡通风格':
return 'katong'
if name == '影视音乐':
return 'yingshi'
if name == '社会生活':
return 'shenghuo'
# 这里是第2节,下载ppt的脚本,名称为download_ppt.py
# coding=utf-8
import os
import requests
from bs4 import BeautifulSoup
import ppt_url as ppt_muban
from urllib.parse import urlparse
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/92.0.4515.107 Safari/537.36 ',
}
def api_ppt(ppt_url):
"""
:param ppt_url: PPT的正文url
:return: ppt下载页面api接口
"""
url = ppt_url
res = requests.get(url)
res.encoding = res.apparent_encoding
soup = BeautifulSoup(res.text,'html5lib')
html_div = soup.find('div', class_="button")
ppt_api = html_div.find_all('a')
return 'https://www.ypppt.com' + ppt_api[0].get('href')
def ppt_download_url(api_url):
"""
:param api_url: 下载PPT的url,例:https://www.ypppt.com/p/d.php?aid=6324
:return: 下载地址的url,可以直接下载ppt模板
"""
url = api_url
res = requests.get(url)
res.encoding = res.apparent_encoding
soup = BeautifulSoup(res.text, 'html5lib')
html_li = soup.find('ul', class_="down clear")
download_url = html_li.find_all('a')
return download_url[0].get('href') or download_url[1].get('href')
def download_zip(download_url):
"""
:param download_url: 下载ppt压缩包的url
:return: 下载得到PPT压缩文件
"""
try:
url = download_url
res = requests.get(url).content
file_spilt = urlparse(url)
filepath, filepathname = os.path.split(file_spilt.path)
with open(file_download_path + "/" + muban + "_" + filepathname, 'wb') as f:
f.write(res)
# f.close()
print('下载 ' + filepathname + ' 成功')
except Exception as z:
print(z)
if __name__ == "__main__":
print("""请输入以下模板的对应名称获取链接:
【简约模板、商务模板、自我介绍、开题报告、职业规划、精美模板、公司介绍、个人简历、培训课件、动态模板、总结汇报、述职报告、论文答辩
优秀作品、中国风、公司企业、教育教学、经济金融、网络科技、建筑地产、体育运动、自然风景、环境保护、读书笔记、医学医疗、旅游旅行
动物模板、植物模板、美食水果、艺术抽象、党建工作、婚礼爱情、卡通风格、影视音乐、社会生活】""")
muban = input('请输入上面模板名称(仅支持选择1个模板名称):')
z = ppt_muban.muban_name(muban)
# print(z)
ppt_muban.get_ppt(z, '')
a = ppt_muban.page_num(z)
file_download_path = 'PPT模板'
if not os.path.exists(file_download_path):
os.mkdir(file_download_path)
for i in a:
r = ppt_muban.get_ppt(z, i)
for x in r[0]:
y = api_ppt(x)
download = ppt_download_url(y)
download_zip(download)
原始脚本下载:https://download.csdn.net/download/m0_55593211/20825209