PHP爬虫登录查询并抓取广西科技大学成绩

2017年7月21日 0 条评论 1.37k 次阅读 9 人点赞

一 介绍

对于新手使用正则表达式开发PHP爬虫的话,难以入手。这里使用了一个html解析类库:simple_html_dom。通过php的curl获取网页内容,传入simple_html_dom进行解析。

因为外网无法访问教务信息管理系统,外网能查询成绩的只有柳苑晨曦网站,所以本文就以柳苑晨曦成绩查询为爬虫的对象。

本文为成绩查询:https://pingxonline.com/app/transcript/ 核心抓取代码。

二 模拟登录原理

打开Fiddler 4 抓包软件,自动监听当前网络,回到柳苑晨曦成绩查询输入账号密码登录,即可抓到登录用的数据包。

图 1 数据包内容

图1了解到数据包提交方式为POST,并产生了Seesion ID。

 

图2 原始数据格式

图2切换到TextView选项卡,可以看到提交的数据。

图3 格式化后的数据

图3是格式化后的数据,可以分为三个字段,第一个是“userName”为学号,第二个是“password”为登录密码,第三个就是提交类型了,这个是固定的值。

分析数据包后,然后使用curl模拟POST提交登录。到这一步我门得知了,POST请求网址:http://online.gxut.edu.cn/cmzx/StudentsMediaCentre.php/Index/login/chengji,请求的方法为POST和请求所发送的数据,以及成绩显示的网页地址为:http://online.gxut.edu.cn/cmzx/StudentsMediaCentre.php/Index/chengji.html。

三 curl模拟POST

第一步:请求登录

模拟登录实际就是正常登录的时候,php会产生一个Seesionid验证用户。请求登录就是要在这个Seesionid产生了登录的记录,在Seesion生命周期结束前,可以获取到成绩数据。我们需要把每个Seesionid保存下来进行第二次的请求。

填写账号密码进行测试发现如果密码是对的,服务器不返回任何文本;但是如果填写错误的密码,则会返回登录界面的内容。

第二步:二次请求成绩网页内容

在第一步拿到Cookies文件后,我们需要将它一同发送到成绩显示的网页:http://online.gxut.edu.cn/cmzx/StudentsMediaCentre.php/Index/chengji.html。

第一、二步完整代码:

 

四 解析HTML代码

在上面代码中,“echo $ret;”将获取得到的html代码输出到前端,所以直接能看到成绩。我们需要提取的是详细的成绩内容,去除不想要的部分,或者要单独获取某个学期的成绩这时候就要用到了simple_html_dom解析HTML代码。

这个类库下载使用的方法很简单,项目地址:https://github.com/samacs/simple_html_dom,项目文档:http://simplehtmldom.sourceforge.net/

放在同目录下,在PHP引用:include_once('simple_html_dom.php');

重要函数:

  1. str_get_html() :用法 $html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>'); // 将字符串转变为DOM结构
  2. // 查找所有的td标签并循环输出文本
    foreach($html->find('td') as $element)
    echo $element->plaintext. '<br>';

第一步:分析成绩查询网页

图4 HTML结构

图4中,在chrome开发者模式中可以找得到,所有的成绩都放在id为"biaoge"的tbody的td里面,所以代码可以写为:

 

图5 输出结果

到这里就成功的把成绩提取出来了,这时候可以作为数据储存在数据库了。

五 本篇文章完整代码

 

 

六 总结

总体来说,爬成绩并算太难,关键在于模拟POST登录与Cookies的处理,可以尝试使用同样的方法抓取柳苑晨曦的课程表。simple_html_dom 还有很多很强大的函数可以查阅上面给出的文档。

QQ咨询:平兄 597914752

平兄

做任何一件事情,计划和努力应当留给自己看,成果才适合秀给他人看。

文章评论(0)