這兩天閒來無事,學習了一些關於php的curl相關的內容,並利用curl和simple_html_dom作了一個查詢cet成績的API,在這了分享出來。php
我利用的是學信網的查詢地址。http://www.chsi.com.cn/cet/,能夠看到,咱們須要根據准考證號和姓名來進行查詢,幸運的是,它不須要用驗證碼,但不知道它的後臺是用post仍是get方式來接受,因此,先輸入一個數據查詢一下來看,css
點擊查詢,若是你的輸入都正確,咱們將會看到咱們要查詢的結果頁面,先看地址欄:html
能夠看到,後臺是採用get方式來接收的,因此,接下來事情就很好辦,咱們的API只須要接受name(姓名)與num(准考證號)兩個參數。chrome
因此會有以下代碼:json
$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進入開發者模式,找到咱們須要數據的位置,dom
會發現咱們須要的數據都被<td>標籤包裹,因此採用simple_html_dom來進行操做:curl
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!剛剛得到了曹衝,要去三國殺一殺啦~~