在php中采集我們用的是簡單的采集方式(例如file_get_contents)就無法做到了,但是如果想模擬登錄用戶並采集利用它就沒辦法了,我們可利用CURL函數來實現模擬登錄並采集數據
這裡要說一些,默認情況下,PHP的CURL功能是沒有開啟的,所以你要自己去開啟這個功能,需要在php.ini中把 ;extension= php_curl.dll 前面的 " ; " 號去掉!!!
好,我講講昨天晚上的程序吧,雖然最後沒有成功,但是還是學習到一些東西的。
$login="http://www.phpyu.com/index.php?action=login";
$post_file="user=××&pw=××";
$cookie_file = tempnam('./temp','cookie');
/////創建一個具有唯一文件名的臨時文件。 若成功,則該函數返回新的臨時文件名。若失敗,則返回 false。
代碼如下 復制代碼$ch=curl_init($login_url); /////初始化一個CURL對象
curl_setopt($ch,CURLOPT_HEADER,0);
//如果你想把一個頭包含在輸出中,設置這個選項為一個非零值。
代碼如下 復制代碼curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); ///設置不輸出在浏覽器上
curl_setopt($ch,CURLOPT_POST,1);
/////如果你想PHP去做一個正規的HTTP POST,設置這個選 項為一個非零值。這個POST是普通的 application/x-www-from-urlencoded 類型,多數被HTML表單使用。
代碼如下 復制代碼curl_setopt($ch,CURLOPT_POSTFIELDS,$post_file); ////傳遞一個作為HTTP "POST"操作的所有數據的字符串。
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); /////把返回來的cookie信息保存在$cookie_jar文件中
curl_exec($ch);///執行
curl_close($ch);////關閉
上面已經完成了模擬登錄的過程
下面要做的就是進入具有權限的頁面了,要記得你現在已經登錄了,你應該把登錄的憑證cookie保存了起來。
代碼如下 復制代碼$url="http://www.phpyu.com/admin/××";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
////把這個頁面顯示在浏覽器上,這裡要特別注意!!就是如果把它顯示在浏覽器上的時候 下面的$contents 就會變成 一個布爾類型 true
代碼如下 復制代碼curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);
例2
代碼如下 復制代碼<?php
$cookie_path = './'; //設置cookie保存路徑
//-----登錄要提交的表單數據---------------
$vars['username'] = '張三';
$vars['pwd'] = '123';
//-------------------------------------
$method_post = true;
//登錄提交的url地址(表單中的action的絕對地址)
$url = 'http://****.com/login';
//----------------------------
$ch = curl_init();
$params[CURLOPT_URL] = $url; //請求url地址
$params[CURLOPT_HEADER] = true; //是否返回響應頭信息
$params[CURLOPT_RETURNTRANSFER] = true; //是否將結果返回
$params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
$params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1';
$postfields = '';
foreach ($vars as $key => $value){
$postfields .= urlencode($key) . '=' . urlencode($value) . '&';
}
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = $postfields;
//判斷是否有cookie,有的話直接使用
if (isset($_COOKIE['cookie_jar']) && ($_COOKIE['cookie_jar'] || is_file($_COOKIE['cookie_jar'])))
{
$params[CURLOPT_COOKIEFILE] = $_COOKIE['cookie_jar']; //這裡判斷cookie
}
else
{
$cookie_jar = tempnam($cookie_path, 'cookie'); //產生一個cookie文件
$params[CURLOPT_COOKIEJAR] = $cookie_jar; //寫入cookie信息
setcookie('cookie_jar', $cookie_jar); //保存cookie路徑
}
curl_setopt_array($ch, $params); //傳入curl參數
$content = curl_exec($ch); //執行
echo '
'; echo $content; //輸出登錄結果
/*
//---------登錄成功後再次請求其他地址,如果有多個可以循環執行---------
echo '
--------------------------------------------------------------------------------
';
$nexturl = 'http://****.com/test';
$params[CURLOPT_URL] = $nexturl;
$params[CURLOPT_POSTFIELDS] = '';
curl_setopt_array($ch, $params); //傳入curl參數
$content = curl_exec($ch); //執行
echo $content; //輸出請求結果
//-------------------------------------------------
*/
curl_close($ch); //關閉連接
?>
注:如果遇到無法請求https站點的情況,可能是因為無法驗證證書或者域名,只要在curl_setopt_array前增加以下兩項就可以了:
代碼如下 復制代碼$params[CURLOPT_SSL_VERIFYPEER] = false;
$params[CURLOPT_SSL_VERIFYHOST] = false;