目的:外部調用網站的百度統計(tongji.baidu.com)數據。
條件:1、具備調用目標網站的百度統計平台管理權限
2、PHP環境支持curl函數。
原理:同PHP小偷程序原理,通過curl函數模擬登陸百度統計平台,並抓取相關數據。
實現過程詳解:
一、設置目標網站百度統計
登錄百度統計管理后台需要輸入驗證碼,為了避免遠程抓取過程中處理驗證碼,可先進入百度統計管理后台將目標站點設置允許通過密碼查看統計數據,在調用數據時可模擬登陸百度統計開放瀏覽入口,而不用登錄管理后台,從而跳過驗證碼問題。
設置過程:登陸tongji.baidu.com -> 點擊頂部“設置”選項 -> 點擊左側“系統管理”中的“統計圖標設置 ” -> 頁面右上角選擇目標網站 -> 勾選“開放數據給第三方查看”和“開放所有報告” -> 設置查看密碼,點擊確定。
此時在“小貼士”下方文本框中可得到目標網站的統計數據查看地址,如本站abcd9.com的查看地址為:http://tongji.baidu.com/web/welcome/ico?s=f265eac6e83d5c33da59b31b26da94fd
二、php代碼調用
遠程抓取類代碼:
class getinfo{
public $cookie_abcd9_com,$content;
public function post($post_url,$param) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$post_url); //設定遠程抓取網址
curl_setopt($ch, CURLOPT_POST, 1); //設置為POST提交模式
curl_setopt($ch, CURLOPT_POSTFIELDS, $param); //提交參數
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_abcd9_com);
//把返回的cookie保存到$this->cookie_abcd9_com文件中
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_abcd9_com);
//讀取cookie
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//返回獲取的輸出文本流,而不自動顯示
$this->content = curl_exec($ch);
curl_close($ch);
}
}
調用代碼:
$info=new getinfo(); //創建實例$info
$info->cookie_abcd9_com=tempnam("","cookie"); //設置cookie臨時文件
$info->post('http://tongji.baidu.com/web/welcome/ico?s=f265eac6e83d5c33da59b31b26da94fd','passwd=abcd9.com');
//模擬登陸。其中淡藍色字符串為目標網站的查看地址,紅色字符串為查看密碼
$info->post('http://tongji.baidu.com/web/3827653/ajax/post','indicators=ip_count&method=visit/district/f&siteId=1351465');
//獲取數據。其中淡藍色字符串為ajax處理url,三個紅色字符串為傳遞參數
$data=json_decode($info->content,true); //獲取到的數據為json格式,轉換為數組
print_r($data); //輸出,或進行其他操作
百度統計后台中是通過ajax調用數據的,所以無法直接抓取html代碼,而需要post給ajax處理url並獲取返回值。通過web抓包程序(如IE httpwatch professional) 對百度統計平台登錄后的抓包可得到提交所需的參數,上面代碼中以本站abcd9.com百度統計平台中訪客分析-地域分布為例抓取到ajax處理url和 相關參數,參數中ip_count為獲取地域分布中的ip統計數據,如改成pv_count將會獲取到地域分布中的pv統計數據。對百度統計平台各類統計 項目抓包可得到更多相關參數,這里不一一列舉。
- /**
- * 發送HTTP請求方法
- * @param string $url 請求URL
- * @param array $params 請求參數
- * @param string $method 請求方法GET/POST
- * @return array $data 響應數據
- */
- function http($url, $params, $method = 'GET', $header = array(), $multi = false){
- $opts = array(
- CURLOPT_TIMEOUT => 30,
- CURLOPT_RETURNTRANSFER => 1,
- CURLOPT_SSL_VERIFYPEER => false,
- CURLOPT_SSL_VERIFYHOST => false,
- CURLOPT_HTTPHEADER => $header
- );
-
- /* 根據請求類型設置特定參數 */
- switch(strtoupper($method)){
- case 'GET':
- $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
- break;
- case 'POST':
- //判斷是否傳輸文件
- $params = $multi ? $params : http_build_query($params);
- $opts[CURLOPT_URL] = $url;
- $opts[CURLOPT_POST] = 1;
- $opts[CURLOPT_POSTFIELDS] = $params;
- break;
- default:
- throw new Exception('不支持的請求方式!');
- }
-
- /* 初始化並執行curl請求 */
- $ch = curl_init();
- curl_setopt_array($ch, $opts);
- $data = curl_exec($ch);
- $error = curl_error($ch);
- curl_close($ch);
- if($error) throw new Exception('請求發生錯誤:' . $error);
- return $data;
- }
- //定義一個要發送的目標URL;
- $url = "https://www.xxx.com";
- //定義傳遞的參數數組;
- $data['aaa']='aaaaa';
- $data['bbb']='bbbb';
- //定義返回值接收變量;
- $httpstr = http($url, $data, 'POST', array("Content-type: text/html; charset=utf-8"));