CURL頁麵採集通用方法
- 2018-09-14 10:55:00
- 小熊 原創
- 11360
首先,你要使用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。
| 聯繫人: | 小熊 |
|---|---|
| 電話: | 180****8880 |
| Email: | admin@cnsite.org |
| QQ: | 929410000 |
| 微信: | itseor |
| 微博: | itseoer |
| 網址: | www.beatmoon.com |


