前言
记得从大二的时候就很想写一个基于教务系统的辅助工具,提供一些“黑科技”的功能,例如辅助选课等等,但是受限于当时掌握的知识,还有就是正方的这套教务系统实在是有不少坑。。。
遇到的坑
下面总结一下在爬取数据过程中遇到的一些问题及解决方案。
1. 模拟登陆教务系统需要一个隐藏表单项
想要爬取教务系统中的课程、成绩等信息,首先自然是要登录系统,在抓包的过程中发现,提交的 POST 请求中需要一个名为 lt 的参数,查看源码,发现一个隐藏表单项。
没有这个参数是无法成功登录的,因此我们需要先通过一个 GET 请求,获取到该表单项的值,然后再进行 POST 登录。
2. 登录完成以及跳转到其他应用时会有很多认证跳转
这个是什么意思呢?当我们在完成 POST 请求之后,并不是直接跳转至我们想要的页面,而是会经过多次页面跳转。个人猜测是为了同步不同域之间的会话数据,由于整个教务系统,包括数字杭电、教学管理(选课系统)、银校通其实都各自是独立的应用,所属域不同,甚至使用的编程语言都不同,那么当我们从一个应用跳转至另一个应用的时候,如何保持我们的登录状态呢?首先每个应用需要提供一个接口用于同步会话信息,然后需要一个独立的认证服务。
当然上面都是我个人的猜测。。。
在这套系统中,这些跳转是通过 js 来完成的(location.href = ……),那我们要怎么做的,最简单的方式就是使用循环,检查源码中是否包含「认证跳转」这四个字,如果有,则解析出其中要跳转的地址,再发送一次 GET 请求,如果没有,表明已经到达目的地,则退出循环。
3. 请求页面出现 Object moved to here
这个问题困扰了我很长时间,也导致这个项目荒废了很久。
这其实是 asp.net 编写的 Web 程序经常出现的问题,具体我也没有深入研究,解决方案也很简单,在请求头加入一个 Referer 参数就可以了,值的话可以用请求页面的 URL。