自己动手写一个查询cet成绩的API

   这两天闲来无事,学习了一些关于php的curl相关的内容,并利用curl和simple_html_dom做了一个查询cet成绩的API,在这了分享出来。

   我利用的是学信网的查询地址。http://www.chsi.com.cn/cet/,可以看到,我们需要根据准考证号和姓名来进行查询,幸运的是,它不需要用验证码,但不知道它的后台是用post还是get方式来接受,所以,先输入一个数据查询一下来看,


点击查询,如果你的输入都正确,我们将会看到我们要查询的结果页面,先看地址栏:



可以看到,后台是采用get方式来接收的,所以,接下来事情就很好办,我们的API只需要接受name(姓名)与num(准考证号)两个参数。

   所以会有如下代码:

   

$zkzh=$_GET['num'];
$xm=$_GET['name'];
   接下来,构造查询地址:

$curlPost='zkzh='.$zkzh.'&xm='.$xm;
$ch = curl_init("http://www.chsi.com.cn/cet/query?".$curlPost) ;

声明一个数组用来存储我们一会要捕获的数据。

$arrMsg = array();

重头戏来了,我们接下来就试着用curl来捕获刚才我们构造的url地址。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回  
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $output = curl_exec($ch) ;  
    $html = new simple_html_dom();
    $html ->load($output);
    echo $html;

如果对刚才的这段代码不太理解则建议先看一些curl的相关内容,这个代码的意思是获得刚才我们构造的url地址的html页面,正常情况下,它的输出应该和我们最开始在官网上的查询返回的页面是一样的,(其实理解很简单,url地址都是一样的吗,只不过这里我们会获得整个html页面的源码并存于$html中),但是很悲剧,返回的页面如下:


可见学信网对访问来源做了限制,但是这没什么,curl是很强大的,它可以构造虚拟的访问来源,代码如下:

curl_setopt($ch, CURLOPT_REFERER, "http://www.chsi.com.cn/cet/ ");

最后,整合一下代码如下:

<?php
include('simple_html_dom.php');//引入simple_html_dom文件
$zkzh=$_GET['num'];
$xm=$_GET['name'];
//$zkzh = '4300221312*****';//准考证号
//$xm = '**';//姓名
$curlPost='zkzh='.$zkzh.'&xm='.$xm;
$ch = curl_init("http://www.chsi.com.cn/cet/query?".$curlPost) ;  
$arrMsg = array();
for($i=0;$i<15;$i++)
{
    curl_setopt($ch, CURLOPT_REFERER, "http://www.chsi.com.cn/cet/ "); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回  
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $output = curl_exec($ch) ;  
    $html = new simple_html_dom();
    $html ->load($output);
    echo $html;
}


?>
运行上面的代码返回页面如下:

       

       好的,因为缺少学信网的css文件,所以布局会乱掉,但这不会影响后续操作,如果你的操作和我一样,效果也一样,那么第一步就完成啦!

      一鼓作气,接下来,我们其实要的数据不多,只有姓名,学校,总分等信息,所以就要从$html这个字符串中提取出这些信息。在chrome浏览器下按f12进入开发者模式,找到我们需要数据的位置,


     会发现我们需要的数据都被<td>标签包裹,所以采用simple_html_dom来进行操作:

foreach($html->find("td") as $m)
    {
            array_push($arrMsg,$m->plaintext);
     }

   
       幸运的是td标签包裹的只有我们需要的数据,所以经过上面的代码,我们会将姓名,学校等数据放进$arrMsg数组,后面的就简单了,只需要按照自己的需求来构造了。

最后,贴出我的版本的完整代码。

<?php
include('simple_html_dom.php');
$zkzh=$_GET['num'];
$xm=$_GET['name'];
//$zkzh = '4300221312*****';//准考证号
//$xm = '**';//姓名
$curlPost='zkzh='.$zkzh.'&xm='.$xm;
$ch = curl_init("http://www.chsi.com.cn/cet/query?".$curlPost) ;  
$arrMsg = array();
for($i=0;$i<15;$i++)
{
    curl_setopt($ch, CURLOPT_REFERER, "http://www.chsi.com.cn/cet/ "); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回  
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $output = curl_exec($ch) ;  
    $html = new simple_html_dom();
    $html ->load($output);
    
    foreach($html->find("td") as $m)
    {
            array_push($arrMsg,$m->plaintext);
     }
     $returnArr= array("name"=>urlencode($arrMsg[2]),"school"=>urlencode($arrMsg[3]),"time"=>urlencode($arrMsg[6]),"pro"=>urlencode($arrMsg[4]),"score"=>urlencode($arrMsg[7]));
    if(!empty($arrMsg))
    {
        echo urldecode(json_encode($returnArr));
        break;
    }
    
}


?>

上面的代码会把我们需要的主要信息以json形式返回,效果如下:


好的,over!刚刚获得了曹冲,要去三国杀一杀啦大笑~~


版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/u/1020021/blog/502255

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值