php中CURL技术模拟登陆抓取数据实战,抓取某校教务处学生成绩。

这两天有基友要php中curl抓取教务处成绩的源码,用于微信公众平台的开发。下面笔者只好忍痛割爱了。php中CURL技术模拟登陆抓取数据实战,抓取沈阳工学院教务处学生成绩。

首先,教务处登录需要验证码。我们寻找验证码的链接地址http://218.61.108.163/ACTIONVALIDATERANDOMPICTURE.APPPROCESS,来进行数据的抓取。下面看下主要代码-index.php

<?php 
    $ch=curl_init("http://218.61.108.163/ACTIONVALIDATERANDOMPICTURE.APPPROCESS");
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_HEADER,1);
    $str=curl_exec($ch);
    curl_close($ch);
    list($header, $body) = explode("\r\n\r\n", $str);
    preg_match("/JSESSION, $header, $matches);
    $cookie = $matches[1];
    
?>

需要模拟cookie进行登录,所以我们建立一个api.php的页面进行cookie的模拟,以及需要抓取成绩的链接地址http://218.61.108.163/ACTIONLOGON.APPPROCESS,对首页index.php表单中值进行获取

<?php
    if(isset($_POST['code'])){
        $jwxuehao'];
        $jwpwd=$_POST['mima'];
        $code=$_POST['code'];
        $ck=$_POST['ck'];
        $data="WebUserNO={$jwid}&Password={$jwpwd}&Agnomen={$code}&submit.x=23&submit.y=9&applicant=ACTIONQUERYSTUDENTSCORE";
        $ch=curl_init("http://218.61.108.163/ACTIONLOGON.APPPROCESS");
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_COOKIE, "JSESSION);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $str=curl_exec($ch);
        curl_close($ch);
            }
    }

在登录页中,我们可以看到登录需要验证码。所以,我们建议一个code.php页面用于验证码的获取、

<?php
    $ch=curl_init("http://218.61.108.163/ACTIONVALIDATERANDOMPICTURE.APPPROCESS");
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_COOKIE, "JSESSIONck']}");
    $str=curl_exec($ch);
    curl_close($ch);
    echo $str;
?>

最后一步。把所要获取的数据接收,使用正则表达式进行数据的抓取以及排版。

<?php 
function get_td_array($table) {
    $table = preg_replace("/<table[^>]*?>/is","",$table);
    $table = preg_replace("/<tr[^>]*?>/si","",$table);
    $table = preg_replace("/<td[^>]*?>/si","",$table);
    $table = str_replace("</tr>","{tr}",$table);
    $table = str_replace("</td>","{td}",$table);
    $table = str_replace("&nbsp;","",$table);
    $table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table);
    $table = preg_replace("'([rn])[s]+'","",$table);
    $table = str_replace(" ","",$table);
    $table = str_replace(" ","",$table);

    $table = explode('{tr}', $table);
    array_pop($table);
    foreach ($table as $key=>$tr) {
        $td = explode('{td}', $tr);
        $td = explode('{td}', $tr);
        array_pop($td);
        $td_array[] = $td;
    }
    return $td_array;
}
?>

完整的代码大家可以去http://pan.baidu.com/share/link?shareid=3722188112&uk=1496266064进行下载。密码:a3eh