CURL頁麵採集通用方法
- 2018-09-14 10:55:00
- 小熊 原創
- 8294
首先,你要使用CURL的話,需要開啟CURL擴展,卽在php.ini文件把curl拓展開啟,卽取消extension=php_curl.dll的分號。
打開php.ini文件,開啟擴展。
vi php.ini
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 |