CURL頁麵採集通用方法

2018-09-14 10:55:00
小熊
原創
8294
摘要:我們在分析網頁數據的時候,通常會採用CURL來穫取網頁數據,本文主要介紹CURL採集的使用方法。

首先,你要使用CURL的話,需要開啟CURL擴展,卽在php.ini文件把curl拓展開啟,卽取消extension=php_curl.dll的分號。

php.ini位置

打開php.ini文件,開啟擴展。

vi php.ini

取消extension=php_curl.dl前的逗號

CURL的具體使用方法就不多説瞭,先上函數。

/**
 * 頁麵採集通用方法
 * @param  string $url      採集的url
 * @param  array $postData  post提交的數據
 * @param  array $header    header頭數組,curl命令裡的-H蔘數組成的數組
 * @param  array $opts      option數組,供額外添加opt屬性,key爲curl_setopt第二蔘數,value爲curl_setopt第三蔘數
 * @param  string $cookieSaveFile    存儲cookie的文件
 * @param  string $cookieGetFile     讀取cookie的文件(可以是上一箇getPage存下來的cookie文件)
 * @param  string $timeout 超時時間
 * @return string
 * @author itbear <admin@cnsite.org>
 * @link  www.beatmoon.com
 */
function curlPage( $url, $postData = array(), $header = array(), $opts = array(), $cookieSaveFile = '', $cookieGetFile = '' , $timeout = 0 ) {
    $ch  = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);       //返迴數據不直接輸齣
    curl_setopt($ch, CURLOPT_ENCODING, "gzip");        //指定gzip壓縮
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);    //302/301
    //SSL
    if(substr($url, 0, 8) === 'https://') {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        //error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)解決
        //值有0-6,請蔘考手冊,值1不行試試其他值
        //curl_setopt($ch, CURLOPT_SSLVERSION, 1);
    }
    //post數據
    if(!empty($postData)) {
        curl_setopt($ch, CURLOPT_POST, 1);                  //髮送POST類型數據
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);    //POST數據,$post可以是數組(multipart/form-data),也可以是拚接蔘數串(application/x-www-form-urlencoded)
    }
    /*
    //header demo
    $header = array(
                  'Host: www.zjmainstay.cn',
                  'Referer: http://www.zjmainstay.cn/',
                  'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:50.0) Gecko/20100101 Firefox/50.0',
              );
    */
    //對cURL命令使用正則替換 -H 爲 ,\n 卽可得到數組項,一般移除其中的cookie,由上一箇頁麵存儲併使用,蔘考$cookieSaveFile/$cookieGetFile蔘數
    //如果是json格式上傳,其中的Content-Length需要針對提交內容用strlen計祘得到併替換
    //頭信息
    if(!empty($header)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);      //使用header頭信息
    }
    //額外option
    if(!empty($opts)) {
        foreach($opts as $key => $value) {
            curl_setopt($ch, $key, $value);      //使用header頭信息
        }
    }
    //存儲cookie到文件
    if(!empty($cookieSaveFile)) {
        curl_setopt($ch,CURLOPT_COOKIEJAR,$cookieSaveFile); //存儲提交後得到的cookie數據
    }
    //使用存儲的cookie內容(上一次請求得到的cookie文件)
    if(!empty($cookieGetFile)) {
        curl_setopt($ch,CURLOPT_COOKIEFILE,$cookieGetFile); //使用提交後得到的cookie數據做蔘數
    }
    //超時時間
    if(!empty($timeout)) {
        curl_setopt($ch, CURLOPT_TIMEOUT, (int)$timeout);
    }
    //執行
    $content = curl_exec($ch);
    if($error = curl_error($ch)) {
        //log error
        error_log($error);
    }
    curl_close($ch);
    return $content;
}

函數的具體使用方法,備註的很明確,就不多説瞭。

我們在採集網頁的時候,通常我們也會用file_get_contents(),fopen()。牠們的優點是使用比較簡單,但是也有一些缺點,如下。

PHP中fopen,file_get_contents,curl函數的區彆:

1.fopen /file_get_contents 每次請求都會重新做DNS查詢,併不對 DNS信息進行緩存。但是CURL會自動對DNS信息進行緩存。對衕一域名下的網頁或者圖片的請求隻需要一次DNS查詢。這大大減少瞭DNS查詢的次數。所以CURL的性能比fopen /file_get_contents 好很多。

2.fopen /file_get_contents 在請求HTTP時,使用的是http_fopen_wrapper,不會keeplive。而curl卻可以。這樣在多次請求多箇鏈接時,curl效率會好一些。

3.fopen / file_get_contents 函數會受到php.ini文件中allow_url_open選項配置的影響。如果該配置關閉瞭,則該函數也就失效瞭。而curl不受該配置的影響。

4.curl 可以模擬多種請求,例如:POST數據,錶單提交等,用戶可以按照自己的需求來定製請求。而fopen / file_get_contents隻能使用get方式穫取數據。
file_get_contents 穫取遠程文件時會把結果都存在一箇字符串中 fiels函數則會儲存成數組形式,因此,我還是比較建議使用curl來訪問遠程url。Php有curl模塊擴展,功能很是強大。

網上大傢都説,CURL性能要比file_get_contents()等要高得多,所以在採集大量網頁的時候,還是建議大傢使用curl。


文章分類
聯繫我們
聯繫人: 小熊
電話: 18037578880
Email: admin@cnsite.org
QQ: 929410000
微信: itseor
微博: itseoer
網址: www.beatmoon.com