前言
本文作者:不温卜火
此文转载文,著作权归作者所有,如有侵权联系小编删除 未经本人允许,禁止转载!!!
原文地址:https://buwenbuhuo.blog.csdn.net/。
博主前几天带来了一个通过查找百度接口实现翻译单词的小demo,本次将继续带来另一个使用正则的小demo。只需一行正则代码,即可爬取某高校官网通知公告。
一. 前期准备
说要爬取高校,那肯定要爬高校的,要不然就显的本博主言而无信!但是问题来了,要爬取哪个高校呢?不仅能够成功爬取到信息并且只需要一行正则表达式即可提取到相关信息。这可有点难为住博主了,正在这是 博主想到了自己学校,并且找到了自己学校就业处的网站,通过查看网站规则,发现正好符合规则。当然了博主本人的学校为双非院校,只是一所普通本二院校…Hahahaha… 话不多说,正片正式开始:
- 1. 分析网页
首先给出我们要爬取的网址:https://zs.hait.edu.cn/list.jsp?urltype=tree.TreeTempUrl&wbtreeid=1261
我们打开网址以后,页面如上图所示,我们可以看到整个界面上,最多的就是一个又一个的通知公告,那么我们就知道我们需要爬取的内容。下面我们打开开发者选项
通过上图,我们可以看到每一个tr标签对应一个通知公告,这个时候我们打开其中一个tr标签进行查看
打开之后,我们可以看到我们所需要的所有信息都在a标签内,找到了位置,下面我们就可以进行解析实现了。当然了,博主本人还是更喜欢使用xpath进行解析的。
- 2. 解析获取标题
下面先让大家看下xpath解析我们所需要的标题的方法:
怎么样,是不是很简单。但是由于本篇博文是要用正则表达式,所以,博主还是使用正则表达式进行获取标题
上述的正则表达式(.*?)代表获取选中部分的所有内容。
如果有小伙伴对正则表达式有不懂的,可以自行查看下博主给的链接https://www.runoob.com/regexp/regexp-syntax.html
当然了,写好了正则表达式当然需要先测试下能否成功获取到我们所需要的内容,下面给出测试结果:
🆗,我们可以看到获取到的结果是正确的,如果正则写的不对的话,需要多次查看调试,这不是什么难活,主要是需要有足够的耐心就够了。
- 3. 保存到本地
此处,个人感觉 没啥需要讲解的地方,所以直接贴出代码
with open("./河工院通告.txt","w",encoding="utf-8") as file: #循环 for title in title_list: #写 file.write(title) file.write("\n") print("保存完毕!") 1234567
二. 从思想转换成程序
既然大体思路已经完成了,那么下面就还差完成代码了
- 1. 思路及源码
那么下面就是代码的实现过程了:
1.设定所需爬取的URL
2. 添加请求头,伪装成浏览器。这位最基本的手段
3. 发送请求,获取数据
4. 通过正则提取所有内容
5. 保存内容到本地
#!/usr/bin/env python # encoding: utf-8 ''' @author 李华鑫 @create 2020-10-06 10:04 Mycsdn:https://buwenbuhuo.blog.csdn.net/ @contact: 459804692@qq.com @software: Pycharm @file: 爬河工院通告.py @Version:1.0 ''' # 导入包 import requests import re url = "https://zs.hait.edu.cn/list.jsp?urltype=tree.TreeTempUrl&wbtreeid=1261" headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", } def hegong_Spider(): # 发送请求,获取响应 response = requests.get(url=url, headers=headers) # 获取响应数据 content = response.content.decode("utf-8") # 提取数据,使用正则表达式 title_list = re.findall(r'<a class="c57797".*?title="(.*?)">.*?</a>',content,flags=re.DOTALL) #打开文件写 with open("./河工院通告.txt","w",encoding="utf-8") as file: #循环 for title in title_list: #写 file.write(title) file.write("\n") print("保存完毕!") if __name__ == '__main__': hegong_Spider()
- 2. 运行结果
三. 代码升级
上述代码,我们只能爬取第一个的内容,这和我们所想的是有差别的,我们想的是要爬取所有通告,这个时候不用想我们就需要通过模拟翻页动作,进行全部获取。
- 1. 分析
我们先来通过查看网址的变化以及查看能否看到网站的总页数,好以此来实现爬取全部标题的目的。
首先我们先来看下网址差异:
https://zs.hait.edu.cn/list.jsp?a5t=13&a5p=1&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261 https://zs.hait.edu.cn/list.jsp?a5t=13&a5p=2&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261 https://zs.hait.edu.cn/list.jsp?a5t=13&a5p=4&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261 123
根据上述三个网址,我们不难发现网址唯一变化的地方就是
那么,我们就可以通过拼接网址的方式实现网页跳转。
下面我们再来查看网站总共有多少页码。
我们可以看到总共有13页,下面就很简单了,我们先来看下拼接的url是否是我们所需要的
- 2. 源码
🆗通过上图,看到url是我们所需要的,下面就可以完善一开始的代码了:
#!/usr/bin/env python # encoding: utf-8 ''' @author 李华鑫 @create 2020-10-06 10:04 Mycsdn:https://buwenbuhuo.blog.csdn.net/ @contact: 459804692@qq.com @software: Pycharm @file: 爬河工院通告分页.py @Version:1.0 ''' # 导入包 import random import time import requests import re headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", } base_url = "https://zs.hait.edu.cn/list.jsp?a5t=13&a5p={}&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261" def hegong_Spider(): # 翻页 for i in range(1, 14): print("第{}页爬取中...".format(i)) time.sleep(random.random()) url = base_url.format(i) # 发送请求,获取响应 response = requests.get(url=url, headers=headers) # 获取响应数据 content = response.content.decode("utf-8") # 提取数据,使用正则表达式 title_list = re.findall(r'<a class="c57797".*?title="(.*?)">.*?</a>', content, flags=re.DOTALL) # title_list = content.xpath('//a[@class="c57797"]/@title').extract() # 打开文件写 with open("./河工院通告.txt", "a", encoding="utf-8") as file: # 循环 for title in title_list: # 写 file.write(title) file.write("\n") print("保存完毕!") if __name__ == '__main__': hegong_Spider()
- 3. 运行结果
美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!完整代码获取点这里即可