本身動手寫一個查詢cet成績的API

   這兩天閒來無事,學習了一些關於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來捕獲剛纔咱們構造的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進入開發者模式,找到咱們須要數據的位置,dom


     會發現咱們須要的數據都被<td>標籤包裹,因此採用simple_html_dom來進行操做:curl

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!剛剛得到了曹衝,要去三國殺一殺啦大笑~~

相關文章
相關標籤/搜索