PHP爬虫-正方教务系统一键报名四六级
Mar 23, 2018
前言
在我们学校四六级也是在正方教务系统进行报名的,login页面是跟查询成绩绩点的差不多,就是添加了几个表单数据。
require页面中一点点区别,模拟登录和之前的成绩绩点爬取是一样的。在报名页面有个地方是很关键的。
正文
login_cet.php
login_cet.php页面跟login_grade.php是差不多的,获取到cookie和验证码保存到本地。
以下是提交表单界面
require_cet.php
在前言说到,模拟登录跟之前是一样的,加之目前学校已经关闭了报名页面,所以无法抓包。
Posting multipart form data using curl in PHP
如下代码demo
1 | $ch = curl_init(); |
以上是一个简单的curl发送一个POST请求
这个demo的产生request如下
1 | POST / HTTP/1.1 |
从以上代码中总结出的就是,在curl_setopt($ch, CURLOPT_POSTFIELDS, $post)这个函数中,
如果$post是字符串,则Content-Type是application/x-www-form-urlencoded。
如果$post是k=>v的数组,则Content-Type是multipart/form-data
在这里因为这个爬虫中,确定提交的POST包的Content-Type是multipart/form-data。
所以这里有用到这个知识点。代码如下:
1 | $params=['__EVENTTARGET' => '','__EVENTARGUMENT'=>'','__VIEWSTATE'=>$state,'txtxxmc'=>'',$cet=>'on','txtSFZH'=>$idcard,'btnSubmit'=>'确 定','TextBox1'=>'']; |
以上的代码就可以实现提交确认POST数据报了,接下来我还做了个简单的判断,判断是否报名成功。
如果报名成功了,页面会有报名记录的。这里因为无法抓包,就只能根据代码说明了。
这里我没有使用正则匹配,用到的xpath定位。
代码如下:
1 | $con3=post_cet($url2,$cookie,$params); |
其中的
1 | //*[@id="DBGridInfo"]/tbody/tr[2] |
是需要判断的xpath路径,更加匹配该地址的值来判断是否实现报名。
Github
https://github.com/uknowsec/CETCrawler