这两天闲来无事,学习了一些关于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!刚刚获得了曹冲,要去三国杀一杀啦
~~
原文:http://blog.csdn.net/saymagic/article/details/18968375