这两天闲来无事,学习了一些关于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!刚刚获得了曹冲,要去三国杀一杀啦~~