在php中采集我們用的是簡單的采集方式,例如file_get_contents就無法做到了,但是如果想模擬登錄用戶并采集利用它就沒辦法了,我們可利用CURL函數來實現模擬登錄并采集數據.
這里要說一些,默認情況下,PHP的CURL功能是沒有開啟的,所以你要自己去開啟這個功能,需要在php.ini中把 ;extension= php_curl.dll 前面的 " ; " 號去掉!!!
我講講昨天晚上的程序吧,雖然最后沒有成功,但是還是學習到一些東西的,代碼如下:
- $login="http://www.survivalescaperooms.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);
- //開源代碼Vevb.com
- //如果你想把一個頭包含在輸出中,設置這個選項為一個非零值。
- 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.survivalescaperooms.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;
新聞熱點
疑難解答