【Python爬虫实战入门】:教你一个程序实现PPT模版自由

文章目录

      • 💥一、PPT模版爬取
        • 🔥1.1 第一个爬虫
          • 🚲1. 获取下载页面链接
        • ❤️1.2 第二个爬虫
        • 🚲1.3 第三个爬虫
          • 🎈2. 文件保存
        • ❤️1.4 翻页处理
      • 🔥二、完整代码

🔥🔥🔥 Python爬虫专栏

💥一、PPT模版爬取

🛤️目标网址

https://www.ypppt.com/moban/

关于第三方模块requests

Python 的第三方模块 requests 是一个非常流行的 HTTP 客户端库,用于发送各种 HTTP 请求。它由 Kenneth > Reitz 开发,并被广泛用于 Python 社区。以下是 requests 模块的一些主要特点:


  1. 简单易用:requests 的 API 设计简洁,使得发送 HTTP 请求变得非常简单。
  2. 跨平台:它支持 Python 2.7 和 3.4+ 版本,可以在多种操作系统上运行。
  3. 国际化:支持国际域名和 URL。
  4. HTTP 连接保持:可以持久化连接,减少连接建立的开销。
  5. 支持多部分文件上传:方便地上传文件。
  6. 支持 Sessions:允许跨请求保持某些参数,如 cookies。
  7. 可连接的流式请求:可以方便地下载大文件。
  8. 支持同步和异步操作:虽然 requests 本身是同步的,但可以与异步框架如 grequests 或 aiohttp 结合使用。
  9. SSL 证书验证:默认情况下会验证 SSL 证书。
  10. 社区支持:由于其流行度,requests 有一个活跃的社区,可以快速获得帮助和支持。

安装pip install requests

✈1.1 爬虫框架
💥思路

  1. 模板的主页链接:https://www.ypppt.com/moban/
  2. 获取某一个PPT的下载页面链接:https://www.ypppt.com/p/d.php?aid=8257
  3. 获取下载链接
# 导入请求模块
import requests# 伪装
headers = {'User-Agent': '浏览器信息','Cookie': '浏览器信息'
}url = '目标网址'# 请求网址获得响应
res = requests.get(url, headers=headers)
🔥1.1 第一个爬虫

根据我们的思路,首先我们要写第一个爬虫来从模版首页获取PPT编号

🛤️目标网址https://www.ypppt.com/moban/
🛤️浏览器信息
在这里插入图片描述

# 导入请求模块
import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36','Cookie': 'Hm_lvt_45db753385e6d769706e10062e3d6453=1715320446; __gads=ID=f965cafb7bccd599:T=1715320445:RT=1715320445:S=ALNI_MYHKs8_kMiTTQssHwk_I4unaHm1zQ; __gpi=UID=00000e15cb8f6b9a:T=1715320445:RT=1715320445:S=ALNI_MZWVWyERCMXvsHDoW2WB20RuXSXEg; __eoi=ID=d8be83a85bd77edf:T=1715320445:RT=1715320445:S=AA-AfjZv_F_ROl0rslGv9LnpXhIp; Hm_lpvt_45db753385e6d769706e10062e3d6453=1715320500'
}url = 'https://www.ypppt.com/moban/'# 请求网址获得响应
res = requests.get(url, headers=headers, verify=False)
print(res.text)

注意:在使用 Python 的 requests 库发送 HTTP 请求时,verify 参数是一个布尔值,它控制着 SSL 证书验证的行为。

  • 当 verify=True(默认设置)时,requests 会验证 SSL 证书的有效性。这意味着 requests 将检查你正在与之通信的服务器是否拥有一个有效的、由受信任的证书颁发机构签发的 SSL 证书。如果证书无效或过期,或者与请求的主机名不匹配,requests 将抛出一个 SSLError 异常。

  • 当 verify=False 时,requests 将不会验证 SSL 证书的有效性。这通常用于测试环境或某些特定情况下,服务器使用自签名证书或不安全的连接,而你又不希望因为证书验证而中断请求。

使用 verify=False 会降低安全性,因为它允许连接到可能不安全的服务器,这可能使你的应用程序容易受到中间人攻击。因此,除非有充分的理由,否则不建议在生产环境中禁用 SSL 证书验证。

此外,verify 参数也可以是一个字符串,指定一个文件路径,该文件包含多个受信任的SSL证书的路径。这允许你使用自定义的证书颁发机构的证书。
示例

import requests# 默认情况下,verify 为 True,将验证 SSL 证书
response = requests.get('https://example.com', verify=True)# 禁用 SSL 证书验证
response = requests.get('https://example.com', verify=False)# 使用自定义证书
response = requests.get('https://example.com', verify='path/to/custom/cert.pem')

在处理金融数据、用户个人信息或其他敏感数据时,确保 SSL 证书验证是启用的非常重要,以维护数据的安全性和完整性。

注意:在写爬虫的时候如果遇到SSL的错误,也就是证书检查,可以使用verify=False来忽略证书检查!
在这里插入图片描述
由于我们忽略了证书检查,所以每次运行都会有一个警告,忽略警告的代码如下:

# 导入请求模块
import requests
# 忽略警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
}url = 'https://www.ypppt.com/moban/'# 请求网址获得响应
res = requests.get(url, headers=headers, verify=False)
print(res.text)

在这里插入图片描述

☔解决乱码问题
从上面的截图可以看出,打印出来的内容有许多我们不认识的符号,比如:è½½_幻灯片模板下载 -【优å,这就是乱码造成的
我们可以通过改变编码方式来解决:

# 导入请求模块
import requests
# 忽略警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
}url = 'https://www.ypppt.com/moban/'# 请求网址获得响应
res = requests.get(url, headers=headers, verify=False)
# 编码改成utf-8
res.encoding = 'utf-8'
print(res.text)

在这里插入图片描述

🚲1. 获取下载页面链接

我们可以通过正则表达式来获取PPT的下载页面链接

Python 的 re 模块是一个用于正则表达式操作的内置库,它提供了丰富的功能来处理字符串和模式匹配。正则表达式是一种用于字符串搜索和操作的强大工具,它们使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。


re 模块的一些常用功能和方法:

  1. 模式匹配 (re.match(), re.search(), re.findall(), re.finditer(), re.match()):这些方法用于在字符串中查找与正则表达式模式相匹配的子串。
  2. 字符串替换 (re.sub(), re.subn()):用于替换字符串中的匹配项。
  3. 捕获组:正则表达式中的圆括号 () 用于创建捕获组,允许你捕获匹配表达式的部分内容。
  4. 编译正则表达式 (re.compile()):允许你编译一个正则表达式模式,然后使用编译后的模式进行匹配和其他操作。
  5. 特殊序列:如 \d 表示数字,\w 表示字母、数字或下划线,. 表示任意单个字符等。
  6. 量词:如 * 表示0次或多次,+ 表示1次或多次,? 表示0次或1次,{m,n} 表示m到n次。
  7. 贪婪与非贪婪:默认情况下,量词是贪婪的,尽可能多地匹配字符。添加一个问号 ? 可以使量词变为非贪婪的,尽可能少地匹配字符。
  8. 特殊字符转义:使用反斜杠 \ 来转义正则表达式中的特殊字符,如 . 匹配字面意义上的点(.)。
  9. 正则表达式标志:如 re.IGNORECASE 或 re.I 用于忽略大小写,re.MULTILINE 或 re.M 用于多行匹配。
# 导入请求模块
import requests
import re
# 忽略警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
}url = 'https://www.ypppt.com/moban/'# 请求网址获得响应
res = requests.get(url, headers=headers, verify=False)
# 提取数据
res.encoding = 'utf-8'  # 编码改成utf-8
# print(res.text)
pptId = re.findall('href="/article/.*?/(.*?).html" class="p-title"', res.text)
print(pptId)

在这里插入图片描述
👊构造PPT下载页面链接

for i in pptId:# 构造新的链接url = 'https://www.ypppt.com/p/d.php?aid=' + iprint(url)

在这里插入图片描述
注意:构造出来的链接不是PPT的下载链接,这是PPT下载页面链接。

❤️1.2 第二个爬虫
for i in pptId:# 构造新的链接url1 = 'https://www.ypppt.com/p/d.php?aid=' + i# print(url)res1 = requests.get(url1, headers=headers, verify=False)print(res1.text)

在这里插入图片描述
在第二次请求的时候我们就可以获取PPT模版的下载地址,接下来就和上面的数据提取一样,利用正则表达式将我们的PPT下载链接提取出来即可。

for i in pptId:# 构造新的链接url1 = 'https://www.ypppt.com/p/d.php?aid=' + i# print(url)res1 = requests.get(url1, headers=headers, verify=False)# print(res1.text)# 提取数据down_url = re.findall('href="(.*?)">下载地址1</a>', res1.text)[0]print(down_url)

在这里插入图片描述
我们发现我们获取的链接的后缀名是不同的,另外这些PPT都是没有名字的,不方便后续保存。所以这里我们要修改一下,不单单只获取PPT的编号,还需要获取PPT的标题,根据标题等信息作为保存PPT模版的文件名。

ppt_info = re.findall('href="/article/.*?/(.*?).html" class="p-title" target="_blank">(.*?)</a>', res.text)
print(ppt_info)

在这里插入图片描述
可以看到得到的数据是一个列表嵌套这元组,直接通过循环获取ID和标题即可。

ppt_info = re.findall('href="/article/.*?/(.*?).html" class="p-title" target="_blank">(.*?)</a>', res.text)
for i, title in ppt_info:# 构造新的链接url1 = 'https://www.ypppt.com/p/d.php?aid=' + ires1 = requests.get(url1, headers=headers, verify=False)# print(res1.text)# 提取数据down_url = re.findall('href="(.*?)">下载地址1</a>', res1.text)[0]print(title, down_url)

在这里插入图片描述
对于链接的后缀名的不同,我们可以对链接以 . 进行切割,然后取最后一个就是他的后缀名。

suffix = down_url.split(".")[-1]  # 获取后缀名

在这里插入图片描述

🚲1.3 第三个爬虫
res2 = requests.get(down_url, headers=headers, verify=False)

通过第三次请求去下载PPT模版。

🎈2. 文件保存
open(f'PPT模版/{title}-{i}.{suffix}', 'wb').write(res2.content)

这里为了避免文件名相同,我们在标题的后面加上他们的id号,文件的后缀名就是我们获取到的后缀名。

❤️1.4 翻页处理

要进行翻页处理,我们只需要观察不同页数的url的变化规律即可。
在这里插入图片描述
我们发现,除了第一页的url外,从第二页开始,url都是规律变化的,那首先我们可以尝试一下在第一页的url后面加上list-1.html,看是否可以访问,如果可以就直接加上,如果不可以,那我们就单独判断一下就可以了。
在这里插入图片描述
可以发现,加上后这个链接是无法访问的,所以我们只能单独的进行判断。

page = 1  # 页数, 从第一页开始
while True:if page == 1:# 第一页url = 'https://www.ypppt.com/moban/'else:# 从第二页开始url = f'https://www.ypppt.com/moban/list-{page}.html'# 请求网址获得响应res = requests.get(url, headers=headers, verify=False)# 提取数据res.encoding = 'utf-8'  # 编码改成utf-8# print(res.text)ppt_info = re.findall('href="/article/.*?/(.*?).html" class="p-title" target="_blank">(.*?)</a>', res.text)for i, title in ppt_info:# 构造新的链接url1 = 'https://www.ypppt.com/p/d.php?aid=' + ires1 = requests.get(url1, headers=headers, verify=False)# print(res1.text)# 提取数据down_url = re.findall('href="(.*?)">下载地址1</a>', res1.text)[0]suffix = down_url.split(".")[-1]  # 获取后缀名res2 = requests.get(down_url, headers=headers, verify=False)open(f'PPT模版/{title}-{i}.{suffix}', 'wb').write(res2.content)page += 1  # 爬完之后页数+1

到这里其实还有一个问题没有解决,除了以链接下载PPT模版外,还有通过百度网盘链接下载的,这个由于有些复杂,另外通过网盘下载的模版数量很少,这里我们可以直接跳过不下载。

if 'pan.baidu' in down_url:  # 百度网盘下载continue
else:suffix = down_url.split('.')[-1]  # 获取后缀名

🔥二、完整代码

# 导入请求模块
import requests
import re
# 忽略警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
}page = 1  # 页数, 从第一页开始
while True:if page == 1:# 第一页url = 'https://www.ypppt.com/moban/'else:# 从第二页开始url = f'https://www.ypppt.com/moban/list-{page}.html'# 请求网址获得响应res = requests.get(url, headers=headers, verify=False)# 提取数据res.encoding = 'utf-8'  # 编码改成utf-8# print(res.text)ppt_info = re.findall('href="/article/.*?/(.*?).html" class="p-title" target="_blank">(.*?)</a>', res.text)for i, title in ppt_info:# 构造新的链接url1 = 'https://www.ypppt.com/p/d.php?aid=' + ires1 = requests.get(url1, headers=headers, verify=False)# print(res1.text)# 提取数据down_url = re.findall('href="(.*?)">下载地址1</a>', res1.text)[0]if 'pan.baidu' in down_url:  # 百度网盘下载continueelse:suffix = down_url.split('.')[-1]  # 获取后缀名res2 = requests.get(down_url, headers=headers, verify=False)open(f'PPT模版/{title}-{i}.{suffix}', 'wb').write(res2.content)print(f'已成功下载{title}-{i}.{suffix}')page += 1  # 爬完之后页数+1

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】简易进度条的实现

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…

深度学习论文: LightGlue: Local Feature Matching at Light Speed

深度学习论文: LightGlue: Local Feature Matching at Light Speed LightGlue: Local Feature Matching at Light Speed PDF: https://arxiv.org/pdf/2306.13643 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/…

AI算法-高数2-导数定义和公式

P14 2.1 导数的定义(一):2.1 导数的定义_哔哩哔哩_bilibili 导数定义&#xff1a; 导数公式&#xff1a; P15 2.1 导数的定义(二)&#xff1a;2.1 导数的定义&#xff08;二&#xff09;_哔哩哔哩_bilibili [a,b]可导&#xff0c;a的端点&#xff1a;右可导&#xff0c;b端点&…

Leetcode—138. 随机链表的复制【中等】(cend函数)

2024每日刷题&#xff08;129&#xff09; Leetcode—138. 随机链表的复制 实现代码 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { public:Node* copyRan…

Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述&#xff1a; 由于某些情况下当查询过滤参数过大时&#xff0c;执行sql由于参数过大而报错&#xff0c;此时 需要使用临时表的方式&#xff0c;即 当参数超过某个阀值&#xff08;如 1000&#xff0c;可调整&#xff09;新增一张临时表&#xff0c;将原表 与 该临时表进…

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水 503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元…

第十一篇:操作系统新纪元:智能融合、量子跃迁与虚拟现实的交响曲

操作系统新纪元&#xff1a;智能融合、量子跃迁与虚拟现实的交响曲 1 引言 在数字化的浪潮中&#xff0c;操作系统如同一位智慧的舵手&#xff0c;引领着信息技术的航船穿越波涛汹涌的海洋。随着人工智能、物联网、量子计算等前沿技术的蓬勃发展&#xff0c;操作系统正站在一个…

富士Apeos 2350 NDA复印机报062 360代码故障

故障描述&#xff1a; 富士Apeos 2350 NDA复印机新机器刚拆箱安装&#xff0c;开机正常&#xff0c;自检扫描头一卡一卡的往前动几下就不动了、扫描灯也不亮扫描头也不能正常复位&#xff1b;按机器的复印键直接报062 360代码&#xff1b; 解答&#xff1a; 此代码为扫描故障&a…

PDF高效编辑:一键批量,PDF转图片的快速解决方案

在数字化时代&#xff0c;PDF文件已成为工作和学习中不可或缺的一部分。然而&#xff0c;有时我们可能需要将PDF转换为图片&#xff0c;以便更轻松地编辑、共享或处理。为了满足这一需求&#xff0c;许多高效的PDF编辑工具应运而生&#xff0c;其中“办公提效工具”一键批量PDF…

【每日八股】淘天一面

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 rocketmq的消息重复发送问题&#xff1f;如何保证幂等&#xff1f; 如何保证幂等性&#xff1a; 消息 Key 设置&#xff1a;不建议…

如何自定义Markdown中插入图片的位置

工作中常常需要在VsCode下写Markdown笔记&#xff0c;在写笔记的过程中不免需要插入图片。  Markdown中插入笔记的操作往往是比较繁琐的&#xff0c;比如&#xff1a;在文档中引用本地某个文件夹下的图片&#xff0c;首先需要你先保存图片到本地路径&#xff0c;然后需要你在文…

Vue-Cli脚手架项目的搭建【新手快速入手】

目录 一、Vue CLI脚手架简介☺ 1.Node.js前置环境的安装 2.安装npm管理器 3.安装淘宝镜像(cnpm) 二、安装vue-cli 1. 版本号查看 2.旧版本卸载 3.新版本安装 4.检查 三、Vue项目的搭建 &#x1f4cc;进入Vue项目管理器 ★命令方式创建 若localhost拒绝访问怎么办&…

技术速递|Python in Visual Studio Code 2024年5月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2024 年 5 月发布&#xff01; 此版本包括以下公告&#xff1a; “Implement all inherited abstract classes”代码操作新的自动缩进设置Debugpy 从 Python 扩展中删除&#…

Unity TileMap入门

概述 相信很多同学学习制作游戏都是从2D游戏开始制作的吧&#xff0c;瓦片地图相信大家都有接触&#xff0c;那接下来让我们学习一下这部分的内容吧&#xff01; Tilemap AnimationFrameRate:设置每帧动画的播放速率。Color:瓦片地图的颜色TileAnchor:锚点&#xff0c;&#x…

Docker容器创建各种镜像

目录 1.Docker创建Mysql容器 2.Docker创建Redis容器 3.Docker 创建minio容器 1.Docker创建Mysql容器 拉取镜像 docker pull mysql:8.0.20 宿主机创建挂载目录 /opt/mysql/conf /opt/mysql/data /opt/mysql/log 启动命令 docker run --name mysql -p 3306:3306 -v /opt/…

Set接口

Set接口的介绍 Set接口基本介绍 无序&#xff08;添加和取出的顺序不一致&#xff09;&#xff0c;没有索引不允许重复元素&#xff0c;所以最多包含一个nullJDK API中Set接口的实现类&#xff1a;主要有HashSet&#xff1b;TreeSet Set接口的常用方法 和List 接口一样&am…

Windows11提示升级,我要点确定吗?

Windows 11自2021年10月推出以来&#xff0c;一直保持着缓慢而稳定的增长&#xff0c;相对来说在游戏PC上的影响力较大&#xff0c; 而Windows 10也即将于2025年10月结束支持。 截至2024年&#xff0c;Windows 11的主要版本包括24H2、 23H2、22H2和21H2。 24H2&#xff1a;20…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决&#xff1a;关键文件缺失&#xff0c;多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

五一超级课堂---Llama3-Tutorial(Llama 3 超级课堂)---第四节Llama 3 高效部署实践(LMDeploy 版)

课程文档&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a; https://space.bilibili.com/3546636263360696/channel/collectiondetail?sid2892740&spm_id_from333.788.0.0 操作平台&#xff1a; https://studio.intern-ai.org.cn/consol…

GAMMA Lab——知识图谱和LLM大模型

图机器学习的发展与分类 图基础模型 LLM基础模型 GNN LLM 前沿工作