每一次到考试周,就是出成绩的时候。每天起床第一件事就是查成绩,有没有挂科之类,相当麻烦!
于是乎,便写一个自动获取成绩,将成绩与上一次查询成绩做对比,发生变化则将成绩单发送到自身手机微信账号
先看一下成果

登录

由于查询成绩需要输入学号密码登录,且登陆需要验证码,所以不妨建一个 Login 模块,该模块主要完成输入账号信息之后的登录请求,并且将登陆之后的 session 返回,sission 中包含我们需要的登录信息。

兼容性原因,使用 IE 浏览器进入 URP 综合教务系统 输入本人账号密码以及验证码。按下 F12 找到 网络 一栏先清空,随后登录教务系统。点击第一个请求,查看请求方式为 POST,在右边的的正文 -> 请求正文中找到含有值的三个参数 zjhmmv_yzm,发现三个参数为我们刚输入的账号,密码,验证码。我们将这三个数据设置一个字典,并且在登录 POST 请求中传递给 data 参数。

参数里需要传递验证码,如何获取验证码?使用相同道理获取请求 URL ,在未登陆界面点击 看不清,换一张。发现多了一个请求,点击请求获取请求方式以及参数,将获取的信息经过优秀的第三方库的处理,得到一个有效的字符串。最后将字符串传入 data 参数中的 v_yzm 中。机器也有错误时候,识别无法保证 100% 正确,可以设置多次请求,直至请求成功。

最终需要返回 session

爬取

找到自己成绩页面,查看源代码,网页源代码为纯 HTML 代码,使用 BeautifulSoup 库解析会方便很多。
安装库 pip install beautifulsoup4

观察历史成绩,发现都在标签为 table,属性值为titleTop2 的标签内容。一共有七个此类标签,本学期成绩便在第七个此类标签中。一学年三学期,第七个此类标签,代表第三学年第一学期成绩。脚本中设置一个 i,来控制获取成绩为哪一学期。
找到后返回继续作为查找,查询标签 tr, 属性 onmouseover = this.className='evenfocus'; ,通过BeautifulSoup中的string返回标签中的内容,将其添加进入字典中,key 为我们查找的课程号。

发送

在本地创建 json 类型那个文本文件,其中储存之前爬取的成绩单,若没有变化不做处理。若有变化,则通过微信服务号 API 接口,发送到微信服务号中。
将脚本放在服务器,设置早晨八点到晚上八点每三十分钟定时运行

*/30 8-20 * * * python3 main.py

代码Github