CURL

基本語法:php

function curl($url){
$ch=curl_init();                  //初始化
curl_setopt($ch, CURLOPT_URL, $url);     //核心json

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //是否直接顯示
$str=curl_exec($ch);                //執行
curl_close($ch);                 //關閉
return $str;                  //返回
}服務器

 

 

 

 

一:簡單的curl採集cookie

1. 初始化多線程

  $ch = curl_init(); //curl

2. 設置選項,包括URL ide

  curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");函數

  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);網站

  curl_setopt($ch,CURLOPT_HEADER,0); //編碼

3. 執行並獲取HTML文檔內容

  $output = curl_exec($ch);

  if($output === FALSE ){ echo "CURL Error:".curl_error($ch); }

4. 釋放curl句柄

  curl_close($ch);

5.輸出

  echo $output;

 

二:須要Referer的採集

 

對於一些程序,它可能判斷來源網址,若是發現referer不是本身的網站,則拒絕訪問,這時候,咱們就須要添加CURLOPT_REFERER參數,模擬來路,使得程序可以正常採集。

<?php

if(empty($_POST['wd'])) {

exit('Deny empty params.'); }

//Referer判斷

if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) === false)

{ exit('Deny'); }

$keyword = addslashes(trim(strip_tags($_POST['wd'])));

$url = 'http://www.baidu.com/s?ie=utf-8&wd=' . urlencode($keyword);

$ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回數據不直接輸出

$content = curl_exec($ch); //執行並存儲結果

curl_close($ch);

echo $content;

 

三:須要cookie支持的採集

對於模擬登陸的應用,單單提交參數和模擬來路並不能解決問題,這時候咱們就須要保存或者提交相應的Cookie參數,這個在PHP cURL裏面也提供了相應的參數:
CURLOPT_COOKIE: 直接使用字符串方式提交cookie參數
CURLOPT_COOKIEFILE: 使用文件方式提交cookie參數
CURLOPT_COOKIEJAR: 保存提交後反饋的cookie數據

 

 

四:壓縮網頁採集(gzip)

不管使用iconv仍是強大的mb_convert_encoding都沒法還原數據;

CURLOPT_ENCODING參數配置壓縮

 

手冊說明:支持的編碼有"identity","deflate"和"gzip"。若是爲空字符串"",請求頭會發送全部支持的編碼類型。
後面一句代表,使用curl_setopt($ch, CURLOPT_ENCODING, "");也是能夠的,可是不能不加這個參數。

 

五: SSL連接的採集;

有些請求連接是https類型的,這時候使用cURL採集可能會失敗,這時候,咱們可使用 var_dump(curl_error($ch));的方法打印錯誤提示,而後根據錯誤提示查找相應的解決方案。好比SSL錯誤常見提示:SSL certificate problem: unable to get local issuer certificate,這時候,咱們就須要利用參數:CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 來禁用SSL證書的驗證,我嘗試過只使用CURLOPT_SSL_VERIFYPEER參數禁用失敗,因此你們最好同時使用兩個參數。

六:代理採集

你們都知道,國內存在萬惡的牆,因此,假如咱們須要獲取某些被牆數據時,就須要用到國外代理服務器;又或者咱們須要採集大量數據時,須要不斷切換IP,也會用到代理。
使用代理在PHP cURL裏面有幾個相對應的參數:CURLOPT_PROXY、CURLOPT_PROXYPORT 和 CURLOPT_PROXYUSERPWD,還有另外幾個,這裏不列舉。
CURLOPT_PROXY 指定代理IP參數
CURLOPT_PROXYPORT 指定代理端口參數
CURLOPT_PROXYUSERPWD 指定須要驗證的代理的帳號密碼,"[username]:[password]"格式的字符串

關於代理帳號獲取,你們本身發揮,我這裏提供網上搜索到的一個列表:高匿代理

其餘功能:    

  • 多線程採集

  • 302跳轉(301跳轉)

  • 模擬上傳文件

發送與獲取json數據

 

封裝函數:

function curl($url, $data=""){    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    //SSL 報錯時使用    //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);       curl_setopt($ch, CURLOPT_POST, 0);    curl_setopt($ch, CURLOPT_TIMEOUT, 15);    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1) ;    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0") ;    curl_setopt($ch, CURLOPT_REFERER, $url) ;   // curl_setopt($ch, CURLOPT_ENCODING, "gzip");    //傳遞cookie    if($data["cookie"])    {        curl_setopt($ch, CURLOPT_COOKIE, $data["cookie"]) ;    }        $response = curl_exec($ch);    $header = curl_getinfo($ch);           if (curl_errno($ch)) {        print curl_error($ch);    }    curl_close($ch);        return $response;}

相關文章
相關標籤/搜索