文章目录

  • 写在前面
  • 分析HTML
  • 代码
  • 后续的消息推送


写在前面

这个不困难,用到两个库。

  1. requests库,用来发起get请求获得目标HTML。
  2. bs4,用来解析HTML获取想要的信息。

两个库都是第三方的,所以需要对应下载。可以直接命令行使用pip

pip install requests
pip install bs4

如果用的pycharm,也可以直接点击左上角"File",“Settings”,然后找到左侧红框点击,点击右侧“+”。然后在弹出的窗口中输入要下载的库。

Python爬虫高校信息 python爬取学校公告通知_requests

分析HTML

注:这一部分是一些“废话”!!看代码直接到最下面去

首先,在浏览器内打开控制台查看页面元素,找到你想要提取的内容。如下图,在无数次展开标签后,终于找到通知公告这个表单了。

Python爬虫高校信息 python爬取学校公告通知_Python爬虫高校信息_02

下图是第二条消息的table:

Python爬虫高校信息 python爬取学校公告通知_requests_03


分析一下:我的目的是得到消息标题以及对应链接,然后把标题和链接推送出去。做法有很多种:

  1. 直接找到上图中第三行的id"line_u3_1"就可以定位到这个tr标签,然后".td.a.get(“href”)“拿到链接,”.td.a.text"拿到标题
  2. 通过string=“2019-11-06"定位到截图中间部位的span标签,然后”.parent.parent.td.a.get(“href”)“拿到链接,”.parent.parent.td.a.text"拿到标题
  3. 等等

然而,这里面其实涉及到一个很简单的算法问题,可以想象一下:“通过脚本不断的定时访问,我要如何拿到一个网站的最新消息?”如果是一直拿取最上面一条,与前一次拿取的最上面一条比对,不等则是最新消息。但是如果网站置顶一条或多条消息,那么这一方法就失效了。所以,从根本上,这种方法是不可靠的,它不能保证爬取的消息是最新的。
而方法二可以实时获取当天的年月日,与网站内通告的日期比对,相等则一定是最新消息,爬到一条后就把它添加到一个“已抓取”列表中,再次抓取的时候先判断通知的链接是否在列表内,在则是当日已抓取信息;不在内则是当日新信息。

代码

给出一个较为简单的爬虫示例,最开始在网上查资料时,各种大堆代码看起来很烦。
直接能用的:功能是打印出学院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停止维护了,所以就打算搞个微信机器人给自己推送通知公告。