首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP爬虫-正方教务系统爬取成绩绩点

前言

从去年寒假开始,学校的一些二级域名就对外网访问进行了限制。而在校内同学们宿舍普遍是用的电信网,要使用内网需要到教学区域连学校的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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180324G00C5700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券