1. 程式人生 > >PHP cURL 應用(入門詳解教程)

PHP cURL 應用(入門詳解教程)

對於做過資料採集的人來說,cURL一定不會陌生。雖然在PHP中有file_get_contents函式可以獲取遠端連結的資料,但是它的可控制性太差了,對於各種複雜情況的採集情景,file_get_contents顯得有點無能為力。因此,本文將為你介紹採集神器cURL的使用。

工具

火狐瀏覽器(FireFox) + Firebug

“工欲善其事,必先利其器。” 在分析案例之前,先讓我們學習一下如何利用神器Firebug獲取我們必要的資訊。 
使用F12開啟Firebug,我們可以得到如圖(一)介面: 
Firebug

  1. 箭頭圖示是“元素選擇”工具,單擊一次會高亮圖示,同時,滑鼠在頁面內的移動會同時在HTML選單中選定相應的內容,此時單擊內容則表示選定了該元素,圖示高亮取消。如圖(二)所示: 

    Firebug檢視元素

  2. 控制檯 
    JS裡面的console.log系列函式的列印就是在這裡輸出。

  3. HTML 
    HTML內容,注意這裡看到的不一定是採集要解析的內容,採集時候對內容的分析,一律以檢視原始碼(Ctrl+U)為準,這裡只是能快速定位元素的結構,然後再選擇一個比較特殊的參照,在原始碼中定位相應的位置。 
    比如,你在HTML裡面看到一個標籤是<div id="demo" class="demo">Demo</div>,但是你檢視原始碼時候看到的內容可能是<div class="demo" id="demo">Demo</div>,如果你對採集內容按照前者去做正則匹配,那麼你會得不到結果。
  4. CSS 
    這裡是CSS檔案內容
  5. 指令碼 
    這裡是Javascript檔案內容
  6. DOM 
    Dom節點內容
  7. 網路 
    每一個請求連結的資料,這裡是我們採集要關注和分析的地方,它能夠顯示每一個請求的引數、請求頭、Cookie資料等。在頁面提交會重新整理的情況下,需要使用保持,使得頁面請求內容在重新整理後仍然留著控制檯中,如圖(三)所示: 
    Firebug網路保持
    另外,火狐還有一款 Tamper data 擴充套件也能得到請求資料,必要時可以安裝使用。
  8. Cookies 
    Cookie資料

圖(一)中還看到下面有很多可選的小選單項,其中保持是我們要關注的,當選擇它的時候,即使提交表單重新整理了頁面,下面內容區域的資料還是會保留,這個對於分析提交資料特別關鍵。

總結

我們在分析採集請求的時候,主要關心“網路”選單裡的請求資料,必要時候使用“保持”以檢視重新整理頁面的請求資料,請求前可以使用“清除”先清除下面的內容。

案例解析

一、簡單的採集

這裡所指的簡單採集,是指一個單一頁面GET請求的採集,它簡單得即使通過file_get_contents函式也能輕鬆獲得頁面返回結果。

  • 程式碼片段之file_get_contents
  1. <?php
  2. $url ='http://demo.zjmainstay.cn/php/curl/simple.html';
  3. $content = file_get_contents($url);
  4. echo $content;
  • 程式碼片段之cURL
  1. <?php
  2. $url ='http://demo.zjmainstay.cn/php/curl/simple.html';
  3. $ch = curl_init($url);
  4. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//返回資料不直接輸出
  5. $content = curl_exec($ch);//執行並存儲結果
  6. curl_close($ch);
  7. echo $content;

二、需要引數的採集

這種情況,頁面請求需要傳入一些引數,可以是GET請求,也可以是POST請求。這種情況的採集,使用file_get_contents外帶一些引數還是可以實現的,但是這裡我們將不再展示。

  • 程式碼片段之cURL GET 
    這種請求,我們可以選擇搜尋引擎作為演示,比如我百度搜索一個詞語“PHP cURL”,在輸入回車後,我們會得到一個類似http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baidu&bar=&wd=PHP%20cURL的連結,注意這裡的連結可能不同瀏覽器、不同入口方式訪問得到不一樣結果,因此不必介意連結是否一樣。通過輸入多個關鍵詞並觀察連結,我們可以確定 wd 引數就是我們要傳入的動態引數,而其他引數則可以不變,因此得到我們下面的採集程式碼。
  1. <?php
  2. $keyword ='PHP cURL';
  3. $url ='http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baidu&bar=&wd='. urlencode($keyword);
  4. $ch = curl_init($url);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//返回資料不直接輸出
  6. $content = curl_exec($ch);//執行並存儲結果
  7. curl_close($ch);
  8. echo $content;

有些時候,一些引數並不是必須的,這時候我們可以刪掉它,比如上面的連結可以只保留http://www.baidu.com/s?ie=utf-8&wd=PHP%20cURLie=utf-8 這個引數可能影響結果的編碼,所以暫且留著它。就這樣簡單的程式碼,我們就可以採集到百度搜索的結果了。

  • 程式碼片段之cURL POST 
    對於POST型別的請求,我們平時並不少見,比如有些搜尋就是使用POST方式提交,這時候我們就需要使用POST型別來提交引數了。這個在PHP cURL裡面有相應的引數:CURLOPT_POST 和 CURLOPT_POSTFIELDS , CURLOPT_POST 的設定可以指定當前提交是否為POST方式,CURLOPT_POSTFIELDS則用於設定提交的引數,可以是引數串,也可以是引數陣列,比如:
  1. curl_setopt($ch, CURLOPT_POSTFIELDS,'ie=utf-8&wd=PHP%20cURL');
  2. curl_setopt($ch, CURLOPT_POSTFIELDS, array(
  3. 'ie'=>'utf-8',
  4. 'wd'=>'PHP%20cURL',
  5. ));

下面是我做的一個POST模擬搜尋PHP POST 搜尋,後端是使用了前面的百度關鍵詞搜尋,基本原理就是,客戶端提交一個關鍵詞到我伺服器,我伺服器使用該關鍵詞請求百度的搜尋,然後得到結果,返回到客戶端。 
如圖(四)是利用Firebug對請求資料的分析,得到我們需要提交的請求連結和請求引數: 
cURL POST 引數分析

然後下面是我們的程式碼:

  1. <?php
  2. $keyword ='PHP cURL';
  3. //引數方法一
  4. // $post = 'wd=' . urlencode($keyword);
  5. //引數方法二
  6. $post = array(
  7. 'wd'=> urlencode($keyword),
  8. );
  9. $url ='http://demo.zjmainstay.cn/php/curl/search.php';
  10. $ch = curl_init($url);
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//返回資料不直接輸出
  12. curl_setopt($ch, CURLOPT_POST,1);//傳送POST型別資料
  13. curl_setopt($ch, CURLOPT_POSTFIELDS, $post);//POST資料,$post可以是陣列,也可以是拼接
  14. $content = curl_exec($ch);//執行並存儲結果
  15. curl_close($ch);
  16. var_dump($content);

三、需要Referer的採集

對於一些程式,它可能判斷來源網址,如果發現referer不是自己的網站,則拒絕訪問,這時候,我們就需要新增CURLOPT_REFERER引數,模擬來路,使得程式能夠正常採集。

  1. <?php
  2. $keyword ='PHP cURL';
  3. //引數方法一
  4. // $post = 'wd=' . urlencode($keyword);
  5. //引數方法二
  6. $post = array(
  7. 'wd'=> urlencode($keyword),
  8. );
  9. $url ='http://demo.zjmainstay.cn/php/curl/search_refer.php';
  10. $refer ='http://demo.zjmainstay.cn/';//來路地址
  11. $ch = curl_init($url);
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//返回資料不直接輸出
  13. curl_setopt($ch, CURLOPT_REFERER, $refer);//來路模擬
  14. curl_setopt($ch, CURLOPT_POST,1);//傳送POST型別資料
  15. curl_setopt($ch, CURLOPT_POSTFIELDS, $post);//POST資料,$post可以是陣列,也可以是拼接
  16. $content = curl_exec($ch);//執行並存儲結果
  17. curl_close($ch);
  18. var_dump($content);

search_refer.php的原始碼如下,做了簡單的Referer判斷攔截:

  1. <?php
  2. if(empty($_POST['wd'])){
  3. exit('Deny empty params.');
  4. }
  5. //Referer判斷
  6. if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'])===false){
  7. exit('Deny');
  8. }
  9. $keyword = addslashes(trim(strip_tags($_POST['wd'])));
  10. $url ='http://www.baidu.com/s?ie=utf-8&wd='. urlencode($keyword);
  11. $ch = curl_init($url);
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//返回資料不直接輸出
  13. $content = curl_exec($ch);//執行並存儲結果
  14. curl_close($ch);
  15. echo $content;

四、需要cookie支援的採集

對於模擬登入的應用,單單提交引數和模擬來路並不能解決問題,這時候我們就需要儲存或者提交相應的Cookie引數,這個在PHP cURL裡面也提供了相應的引數: 
CURLOPT_COOKIE: 直接使用字串方式提交cookie引數 
CURLOPT_COOKIEFILE: 使用檔案方式提交cookie引數 
CURLOPT_COOKIEJAR: 儲存提交後反饋的cookie資料

下面是PHP100的模擬登入示例:

  1. <?php
  2. header("content-Type: text/html; charset=UTF-8");
  3. $cookie_file = tempnam('./temp','cookie');
  4. $login_url="http://bbs.php100.com/login.php";
  5. $post_fields="cktime=36000&step=2&pwuser=username&pwpwd=password";
  6. //提交登入表單請求
  7. $ch=curl_init($login_url);
  8. curl_setopt($ch,CURLOPT_HEADER,0);
  9. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  10. curl_setopt($ch,CURLOPT_POST,1);
  11. curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields);
  12. curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);//儲存提交後得到的cookie資料
  13. 相關推薦

    PHP cURL 應用入門教程

    對於做過資料採集的人來說,cURL一定不會陌生。雖然在PHP中有file_get_contents函式可以獲取遠端連結的資料,但是它的可控制性太差了,對於各種複雜情況的採集情景,file_get_contents顯得有點無能為力。因此,本文將為你介紹採集神器cURL的使用。 工具 火狐

    linux sed使用 sed入門教程

    sed入門詳解教程     sed 是一個比較古老的,功能十分強大的用於文字處理的流編輯器,加上正則表示式的支援,可以進行大量的複雜的文字編輯操作。sed 本身是一個非常複雜的工具,有專門的書籍講解 sed 的具體用法,但是個人覺得沒有必要去學習它的每個細節,那樣沒有特別大的實際意

    Jmeter(三) - 從入門到精通 - 測試計劃Test Plan的元件教程

    1.簡介 上一篇中巨集哥已經教你如何通過JMeter來建立一個測試計劃(Test Plan),那麼這一篇我們就將JMeter啟動起來,建立一個測試計劃(Test plan),然後巨集哥給大家介紹一下測試計劃(Test Plan)有哪些元件組成的。 2.測試計劃(Test Plan)要素 本節主要描述

    Jmeter(五) - 從入門到精通 - 建立網路計劃實戰和建立高階Web測試計劃教程

    1.簡介   上一篇中巨集哥已經將其的理論知識介紹了一下,這一篇巨集哥就帶著大家一步一步的把上一篇介紹的理論知識實踐一下,然後再說一下如何建立高階web測試計劃。 2.網路計劃實戰   通過上一篇的學習,巨集哥將其分類為:     (1)不需要登入驗證身份就可以操作的。     (2)需要登入驗證身份之後才

    Jmeter(七) - 從入門到精通 - 建立資料庫測試計劃實戰<MySQL資料庫>教程

    1.簡介    在實際工作中,我們經常會聽到資料庫的效能和穩定性等等,這些有時候也需要測試工程師去評估和測試,上一篇文章巨集哥主要介紹了jmeter連線和建立資料庫測試計劃的過程,巨集哥在文中通過示例和程式碼非常詳細地介紹給大家,希望對各位小夥伴和童鞋們的學習或者工作具有一定的指導和參考學習價值,遇

    Jmeter(八) - 從入門到精通 - JMeter配置元件教程

    1.簡介 JMeter配置元件可以用來初始化預設值和變數,讀取檔案資料,設定公共請求引數,賦予變數值等,以便後續取樣器使用。將在其作用域的初始化階段處理。配置元件(Config Element)提供對靜態資料配置的支援,可以為取樣器設定預設值和變數。 首先我們來看一下JMeter的配置元件,路徑:新增-配置元

    Jmeter(九) - 從入門到精通 - JMeter邏輯控制器 - 上篇教程

    1.簡介 Jmeter官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”。 意思是說,邏輯控制器可以控制取樣器(samplers)的執行順序。由此可知,控制器需要和取

    Jmeter(十) - 從入門到精通 - JMeter邏輯控制器 - 中篇教程

    1.簡介 Jmeter官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”。 意思是說,邏輯控制器可以控制取樣器(samplers)的執行順序。由此可知,控制器需要和取

    Jmeter(十一) - 從入門到精通 - JMeter邏輯控制器 - 下篇教程

    1.簡介 Jmeter官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”。 意思是說,邏輯控制器可以控制取樣器(samplers)的執行順序。由此可知,控制器需要和取

    Jmeter(十二) - 從入門到精通 - JMeter邏輯控制器 - 終篇教程

    1.簡介 Jmeter官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”。 意思是說,邏輯控制器可以控制取樣器(samplers)的執行順序。由此可知,控制器需要和取

    Jmeter(十三) - 從入門到精通 - JMeter定時器 - 上篇教程

    1.簡介   使用者實際操作時,並非是連續點選,而是存在很多停頓的情況,例如:使用者需要時間閱讀文字內容、填表、或者查詢正確的連結等。為了模擬使用者實際情況,在效能測試中我們需要考慮思考時間。若不認真考慮思考時間很可能會導致測試結果的失真。例如,估計的可支撐使用者數偏小。在效能測試中,訪問請求之間的停頓時間被

    Jmeter(十四) - 從入門到精通 - JMeter定時器 - 下篇教程

    1.簡介   使用者實際操作時,並非是連續點選,而是存在很多停頓的情況,例如:使用者需要時間閱讀文字內容、填表、或者查詢正確的連結等。為了模擬使用者實際情況,在效能測試中我們需要考慮思考時間。若不認真考慮思考時間很可能會導致測試結果的失真。例如,估計的可支撐使用者數偏小。在效能測試中,訪問請求之間的停頓時間被

    Jmeter(十五) - 從入門到精通 - JMeter匯入自定義的Jar包教程

    1.簡介   原計劃這一篇是介紹前置處理器的基礎知識的,結果由於許多小夥伴或者童鞋們在微信和部落格園的短訊息中留言問如何引入自己定義的Jar包呢???我一一回復告訴他們和引入外掛的Jar包一樣的道理,一通百通。但是感覺他們還是很迷糊很迷惘,因此在這裡穿插一篇匯入自定義的Jar包。還有另外一個原因就是前置處理器

    Jmeter(十六) - 從入門到精通 - JMeter前置處理器教程

    1.簡介   前置處理器是在發出“取樣器請求”之前執行一些操作。如果將前置處理器附加到取樣器元件,則它將在該取樣器元件執行之前執行。前置處理器最常用於在取樣器請求執行前修改其設定,或更新未從響應文字中提取的變數。前置處理器主要是用來處理請求前的一些準備工作,比如引數設定、環境變數設定等

    Jmeter(十七) - 從入門到精通 - JMeter後置處理器 -上篇教程

    1.簡介   後置處理器是在發出“取樣器請求”之後執行一些操作。取樣器用來模擬使用者請求,有時候伺服器的響應資料在後續請求中需要用到,我們的勢必要對這些響應資料進行處理,後置處理器就是來完成這項工作的。例如系統登入成功以後我們需要獲取SessionId,在後面的業務操作中伺服器會驗證這

    Jmeter(十八) - 從入門到精通 - JMeter後置處理器 -下篇教程

    1.簡介   後置處理器是在發出“取樣器請求”之後執行一些操作。取樣器用來模擬使用者請求,有時候伺服器的響應資料在後續請求中需要用到,我們的勢必要對這些響應資料進行處理,後置處理器就是來完成這項工作的。例如系統登入成功以後我們需要獲取SessionId,在後面的業務操作中伺服器會驗證這

    Jmeter(十九) - 從入門到精通 - JMeter監聽器 -上篇教程

    1.簡介   監聽器用來監聽及顯示JMeter取樣器測試結果,能夠以樹、表及圖形形式顯示測試結果,也可以以檔案方式儲存測試結果,JMeter測試結果檔案格式多樣,比如XML格式、CSV格式。預設情況下,測試結果將被儲存為xml格式的檔案,檔案的字尾: ".jtl"。另外一種儲存格式為CSV檔案,該格式的好處就

    Jmeter(二十) - 從入門到精通 - JMeter監聽器 -下篇教程

    1.簡介   監聽器用來監聽及顯示JMeter取樣器測試結果,能夠以樹、表及圖形形式顯示測試結果,也可以以檔案方式儲存測試結果,JMeter測試結果檔案格式多樣,比如XML格式、CSV格式。預設情況下,測試結果將被儲存為xml格式的檔案,檔案的字尾: ".jtl"。另外一種儲存格式為CSV檔案,該格式的好處就

    Jmeter(二十一) - 從入門到精通 - JMeter斷言 - 上篇教程

    1.簡介   最近由於巨集哥在搭建自己的個人部落格可能更新的有點慢。斷言元件用來對伺服器的響應資料做驗證,常用的斷言是響應斷言,其支援正則表示式。雖然我們的通過響應斷言能夠完成絕大多數的結果驗證工作,但是JMeter還是為我們提供了適合多個場景的斷言元件,輔助我們來更好的完成結果驗證工作。在使用JMeter進

    Jmeter(二十二) - 從入門到精通 - JMeter斷言 - 下篇教程

    1.簡介   斷言元件用來對伺服器的響應資料做驗證,常用的斷言是響應斷言,其支援正則表示式。雖然我們的通過響應斷言能夠完成絕大多數的結果驗證工作,但是JMeter還是為我們提供了適合多個場景的斷言元件,輔助我們來更好的完成結果驗證工作。在使用JMeter進行效能測試或者介面自動化測試工作中,經常會用到的一個功