文章目录
- 写在前面
- 分析HTML
- 代码
- 后续的消息推送
写在前面
这个不困难,用到两个库。
- requests库,用来发起get请求获得目标HTML。
- bs4,用来解析HTML获取想要的信息。
两个库都是第三方的,所以需要对应下载。可以直接命令行使用pip
pip install requests
pip install bs4
如果用的pycharm,也可以直接点击左上角"File",“Settings”,然后找到左侧红框点击,点击右侧“+”。然后在弹出的窗口中输入要下载的库。
分析HTML
注:这一部分是一些“废话”!!看代码直接到最下面去
首先,在浏览器内打开控制台查看页面元素,找到你想要提取的内容。如下图,在无数次展开标签后,终于找到通知公告这个表单了。
下图是第二条消息的table:
分析一下:我的目的是得到消息标题以及对应链接,然后把标题和链接推送出去。做法有很多种:
- 直接找到上图中第三行的id"line_u3_1"就可以定位到这个tr标签,然后".td.a.get(“href”)“拿到链接,”.td.a.text"拿到标题
- 通过string=“2019-11-06"定位到截图中间部位的span标签,然后”.parent.parent.td.a.get(“href”)“拿到链接,”.parent.parent.td.a.text"拿到标题
- 等等
然而,这里面其实涉及到一个很简单的算法问题,可以想象一下:“通过脚本不断的定时访问,我要如何拿到一个网站的最新消息?”如果是一直拿取最上面一条,与前一次拿取的最上面一条比对,不等则是最新消息。但是如果网站置顶一条或多条消息,那么这一方法就失效了。所以,从根本上,这种方法是不可靠的,它不能保证爬取的消息是最新的。
而方法二可以实时获取当天的年月日,与网站内通告的日期比对,相等则一定是最新消息,爬到一条后就把它添加到一个“已抓取”列表中,再次抓取的时候先判断通知的链接是否在列表内,在则是当日已抓取信息;不在内则是当日新信息。
代码
给出一个较为简单的爬虫示例,最开始在网上查资料时,各种大堆代码看起来很烦。
直接能用的:功能是打印出学院2019-11-06的所用通知的标题和链接(链接还没做处理)
import requests
from bs4 import BeautifulSoup
url = 'http://www.auto.shu.edu.cn/synr/tzgg.htm'
# 模拟浏览器发送HTTP请求
header = {'User-Agent': 'Mozilla/5.0'}
try:
response = requests.get(url, headers=header)
response.raise_for_status()
# 设置编码
response.encoding = response.apparent_encoding
html = response.text
soup = BeautifulSoup(html, "html.parser")
target = soup.find_all("span", string="2019-11-06")
# target为列表
for eachOne in target:
each_text = eachOne.parent.parent.td.a.text
each_href = eachOne.parent.parent.td.a.get("href")
print(each_text)
print(each_href)
except:
print("爬取失败")
#######################输出结果如下
第五届中国智能仪器仪表设计大赛/参赛邀请函
../info/1123/7805.htm
更多的bs4的HTML解析方法当然还是得看官方文档,中文的,自己做些小脚本可以参照。
Beautiful Soup 4.4.0 文档
后续的消息推送
其实最初的目的就是每次去刷公告很烦,所以想爬取各种通知公告,然后推送到QQ上。结果webQQ停止维护了,所以就打算搞个微信机器人给自己推送通知公告。