前言
从去年寒假开始,学校的一些二级域名就对外网访问进行了限制。而在校内同学们宿舍普遍是用的电信网,要使用内网需要到教学区域连学校的wifi才行。这样是很不方便的。
寒假一直想写个正方教务系统爬虫的,一直拖着拖着的没有完成。开学这一段时间挺闲的,目前完成了正方教务系统爬取成绩绩点和另外两个小项目,一个是正方系统一键报名四六级,一个是物业报修系统一键物业报修。这三个爬虫目前挂在自己的个人服务器上,以某种手段访问内网,后续会转移到内网服务器,转发到外网,提高访问速度。
习惯了,用博客记录自己写的东西,这里简单记录下正方教务系统爬虫成绩绩点的过程。
正文
UI设计
这里提下这个登陆表单和后端的UI界面,这里是借鉴了我在Github上看到的一个类似的项目
https://github.com/wangyufeng0615/bjuthelper
整个项目跟上述的项目有点类似,都是正方系统,仅仅是在一些小小的地方有区别。
login_grade.php
在上面项目中,个别院校的教务系统是有无需验证码的接口的。而在我们学校是没有的,这里我们需要先获取到验证码
这里用到PHP中的CURL进行获取验证码,并把访问页面的cookie保存到本地。并把验证码图片保存到本地。
login_grade后面的页面就是利用WEUI写得一个提交表单了,这里就不要过多的说了。
require_grade.php
抓包分析
这里还是先简单的抓包分析,先抓登录页面的POST请求包。
简单的看下POST提交的参数有
其中txtUserName是学号,TextBox2是密码,txtSecretCode是验证码,后面的参数直接默认提交就行。
这里重点的是__VIEWSTATE参数,这个参数是在登录页面里的。需要去获取这个参数,来找下这个参数的位置。
这里我们需要得到这个value值,这里我们需要代入login_grade页面里的cookie放入得到响应的vivewstate值
同样利用curl来访问。
传入教务网地址,访问登录页面,利用preg_match_all函数正则匹配到页面里的__VIEWSTATE的value值。
参数都准备好了,可以模拟登录了。
这样我们就成功的登录到教务系统了,接下来我们需要跳转到成绩页面。
同样抓包分析,
这里是查询用户选择学期的POST请求包,url里的/xscjcx.aspx?xh=中的xh是用户学号。
POST参数里
这几个参数都可以看出他们的意思,重要的是获取__VIEWSTATE的value值,同样利用一个正则去获取这个值
获取到所有参数,提交post数据报就可以返回值了。
这里就得到要查询的学期的成绩了,得到的HTML里的table标签的数据,需要转换为数组进行输出。
用到一个函数get_td_array()
从该函数的代码来看,可以看出是利用正则匹配table标签下的tr,td将数据通过遍历存入数组返回。
到这里当前学期的成绩详情都可以获取到了。
下面是绩点的计算,我们学校的系统是把已修学科的学分绩点都列出来了的。我们只需要把数据爬取出来做一个简单的计算就行了。
数据报跟查询学期成绩是差不多的。简单的看下post数据。
上面是一个简单的计算GPA的过程,简单来说就是一个遍历叠加计算的过程。
到这里require_grade页面的PHP部分差不多都说完了,后面的数据的排版输出了。
Github
https://github.com/uknowsec/GPACrawler
Reference
https://github.com/wangyufeng0615/bjuthelper
领取专属 10元无门槛券
私享最新 技术干货