在許多時候我們需要抓取其他網(wǎng)頁的內(nèi)容數(shù)據(jù),,對于一般性的小型網(wǎng)頁直接使用
file_get_contents()函數(shù)就能滿足我們的需求,但是當我們有特殊需求(如需要post數(shù)據(jù))或者網(wǎng)頁較大,,響應時間較長時,,那么這是
file_getcontents()已經(jīng)不能滿足我們的需求了。我們需要借助phpcurl來抓取我們需要的數(shù)據(jù),。
當我們需要抓取某個網(wǎng)頁時我們可以借助一些工具來更方便我們獲取使用phpcurl用的參數(shù)和方法,。
火狐的firebug就是一個很好的工具,已在百度百科搜索關(guān)鍵詞php為例:
上面可以清楚的看到請求的方式,,請求的參數(shù),,請求的鏈接,。
在使用phpcurl之前我們需要安裝并啟用phpcurl擴展,可以修改php.ini找到php_curl.dll取消注釋,,若并沒有安裝此擴展,,在linux環(huán)境下紅帽系列可以用yum,烏邦圖系列可以用apt-get命令安裝php-curl,。
對于phpcurl的使用,,還是以上述抓取百度百科,為例:
<?php $word = 'php' ; //要抓取的關(guān)鍵詞 $word = urlencode( $word ); //url加密,對服務器在地址中有些特殊字符和中文需要轉(zhuǎn)義后,,服務器才認識 $url = 'http://baike.baidu.com/search/word?word=' . $word ; $ch = curl_init( $url ); //curl初始化 curl_setopt( $ch ,CURLOPT_RETURNTRANSFER,TRUE); //將curl_exec()獲取的信息以文件流的形式返回,,而不是直接輸出 $str = curl_exec(); curl_close(); |
完成上部后,打出$str,,你會發(fā)現(xiàn)這是一個空白的字符,,這是為什么呢?
查看firebug
你會發(fā)現(xiàn)在響應頭里面有一個地址的跳轉(zhuǎn),,這個跳轉(zhuǎn)是百科后臺的跳轉(zhuǎn),,我們?nèi)绾潍@取這個跳轉(zhuǎn)呢。
可以在curl_close()之前,,使用
$info = curl_getinfo(); $redirect_url = $info [ 'redirect_url' ]; |
來獲取跳轉(zhuǎn)的地址,,然后我們再使用上面的方法再次抓取得到的地址就好了,當然也可以使用CURLOPT-FOLLOWLOCATION參數(shù)來設置遞歸跳轉(zhuǎn),。
上面說了對于頁面get方式的抓取,,那么需要post數(shù)據(jù)的頁面我們?nèi)绾巫ト∧?/p>
我們只需要使用
curl_setopt( $ch ,CURLOPT_POST,TRUE); //使用post提交數(shù)據(jù) curl_setopt( $ch ,CURLOPT_POSTFIELDS, $postdata ); //提交數(shù)據(jù) |
就可以了,其中$postdata是你需要提交的數(shù)據(jù),,他可以是一個鍵值數(shù)組可以是一個字符串如:
word=php&type=add 與 array('word'=>'php','type'=>'add')是等價的啦,,
但是請注意當使用字符串提交時,字符串中的參數(shù)最好使用urlencode()轉(zhuǎn)義
還有一些頁面,,我們是必須要先登錄才能訪問該頁面的怎么辦呢,?
那么我們可以使用上述的post方式先登錄該頁面并記錄cookie(記得當你不確定表單到底有多少參數(shù)需要提交時,可以使用firebug查看),,記錄cookie的方法如下:
curl_setopt( $ch ,CURLOPT_COOKIEJAR, $cookiejar ); //記錄cookie |
其中$cookiejar是一個路徑,,它放置你想要將cookie文件存放的路徑(如:/var/www/html/cookie.txt);
那么在登錄后記錄了cookie文件,在以后抓取頁面的時候我們怎么調(diào)用這個cookie文件呢,?方法:
curl_setopt( $ch ,CURLOPT_COOKIEFILE, $cookiejar ); //調(diào)用cookie文件 |
可以了,,但是有時候除了有以上的方法時我們還是不能正常的抓取頁面,那么也許是頁面設置了對請求頭信息的驗證,,我們這時就需要模擬請求頭信息啦,。
在firebug中我們可以很方便的看到請求頭信息:
我們可以復制這些請求頭信息放在我們的數(shù)組中;
$header[] = 'Accept:….' 已這種格式,,每行信息是數(shù)組中的一個值,,用冒號將類型和內(nèi)容隔開,。
然后使用
curl_setopt( $ch ,CURLOPT_HTTPHEADER, $header ); |
下面貼出一些phpcurl的常用函數(shù)
curl_close 關(guān)閉一個curl會話
curl_errno 返回一個包含當前會話錯誤信息的數(shù)字編號
curl_error 返回一個包含當前會話錯誤信息的字符串
curl_exec 執(zhí)行一個curl會話
curl_init 初始化一個curl會話
curl_setopt_array 以數(shù)組的形式為一個curl設置會話參數(shù)
curl_setopt 為一個curl設置會話參數(shù)
curl_version 獲取curl相關(guān)的版本信息
curl_init 作用初始化一個curl會話,curl_init()函數(shù)唯一的一個參數(shù)是可選的,,表示一個url地址
curl_exec 作用是執(zhí)行一個curl會話,,唯一的參數(shù)是curl_init()函數(shù)返回的句柄
curl_close 作用是關(guān)閉一個curl會話,唯一的參數(shù)是curl_init()函數(shù)返回的句柄
常用參數(shù):
CURLINFO_SSL_VERIFYRESULT Result of SSL certification verification requested by setting
CURLOPT_SSL_VERIFYPEER
CURLOPT_FOLLOWLOCATION 啟用時會將服務器服務器返回的“Location:”放在header中遞歸的返回給服務器,,CURLOPT_MAXREDIRS可以限定遞歸返回的數(shù)量
CURLOPT_HEADER 啟用時會將頭文件的信息作為數(shù)據(jù)流輸出
CURLOPT_NOBODY 啟用時將不對HTML中的body部分進行輸出
CURLOPT_POST 啟用時會發(fā)送一個常規(guī)的POST請求,,類型為:application/x-www-form-urlencoded,就像表單提交的一樣
CURLOPT_RETURNTRANSFER 講curl_exec()獲取的信息以文件流的形式返回,,而不是直接輸出
CURLOPT_SSL_VERIFYPEER FALSE to stop cURL
from verifying the peer's certificate. Alternate certificates to verify
against can be specified with the CURLOPT_CAINFO option or a
certificate directory can be specified with the CURLOPT_CAPATH option.
CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE if
CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2). TRUE by default
as of cURL 7.10. Default bundle installed as of cURL 7.10.
CURLOPT_TIMEOUT 設置curl允許執(zhí)行的最長秒數(shù)
CURLOPT_COOKIE 設定HTTP請求中“Set-Cookie:”部分的內(nèi)容
CURLOPT_COOKIEFILE 包含cookie信息的文件名稱,,這個cookie文件可以是Netscape格式或者HTTP風格的header信息
CURLOPT_COOKIEJAR 連接關(guān)閉以后,存放cookie信息的文件名稱
CURLOPT_POSTFIELDS 在HTTP中的“POST”操作,。如果要傳送一個文件,,需要一個@開頭的文件名
CURLOPT_PROXY 設置通過的HTTP代理服務器
CURLOPT_REFERER 設置header中“Referer:” 部分的值
CURLOPT_URL 需要獲取的URL地址,也可以在PHP的curl_init()函數(shù)中設置
CURLOPT_USERAGENT 在HTTP請求中包含一個“user-agent”頭的字符串
CURLOPT_HTTPHEADER 設置一個header中傳輸內(nèi)容的數(shù)組