这两天闲来无事,学习了一些关于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_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是很强大的,它可以构造虚拟的访问来源,代码如下:
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); }
最后,贴出我的版本的完整代码。
<?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; } } ?>
好的,over!刚刚获得了曹冲,要去三国杀一杀啦~~
版权声明:本文为博主原创文章,未经博主允许不得转载。