PHP如何抓取https內容?記錄一下。


PHP里做一般的獲取內容時,用自帶的file_get_contents()函數基本就足夠了。當然,這個函數只能抓一些簡單的數據,如果是遇到需要登錄的頁面,就不行了,而且效率及穩定性也不是很強。所以要是有特殊需求的話,還是用curl吧。不僅僅速度快,而且非常穩定,基本上用curl抓取失敗的幾率很小。

而且今天在抓優酷視頻API接口中的信息時,發現了一個問題,由於優酷API的url請求是https安全協議,用file_get_contents()函數竟然無法獲取到數據,然后用curl寫了個代替函數,雖然不報錯了,但還是無法獲取,最后Google的下,發現有很多人都曾經遇到過這個問題,而且都寫出了解決辦法。

還是需要curl。

<?php
function file_get_contents_by_curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//禁止調用時就輸出獲取到的數據
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
$result = curl_exec($ch);
curl_close($ch);return $result;}?>

這兩行才是關鍵。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

算是一小段救命代碼,以前知道的看完一笑就好了,主要為不知道的朋友們准備。

 

 

 

直接用file_get_contents,會報錯;
程序代碼$url = (https://xxx.com");
file_get_contents($url);
錯誤:
程序代碼Warning: file_get_contents(https://xxx.com) [function.file-get-contents]: failed to open stream: No such file or directory in D:wampwwwgrabber_clientindex.php on line 3
用curl的方式是可以的:
程序代碼$url = (https://xxx.com);

重點是以下兩句:

=============================================================
今天項目上線,使用php的curl模塊通過https訪問某個文件時出錯:
     這是我日志里記錄的信息:
2009-05-11 11:10:23 請求音頻列表,錯誤號:60--錯誤描述:SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
哎,項目上線急阿,請教同事得知修改如下代碼即可,添加黑體字部分就好了。
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);

雖然有些簡單,但是還是寫下來吧,以后好作參考。
// 對HTTPS網站的訪問,用到了擴展庫curl

要在PHP.ini中對curl的extension前面的分號去掉,可能還要把openssl的擴展同樣打開
請問如何配置curl才能支持獲取https網站內容或者向https的網站提交數據 ?
Linux下編譯php的時候,把openssl支持一塊編譯進去
  --with-openssl[=DIR]    Include OpenSSL support (requires OpenSSL >= 0.9.6)
  --with-openssl-dir[=DIR]  FTP: openssl install prefix
  --with-imap-ssl[=DIR]    IMAP: Include SSL support. DIR is the OpenSSL install prefix
  --with-openssl-dir[=DIR]  SNMP: openssl install prefix
我一般自己編譯,如果你的Linux發行版帶有php5-openssl包,安裝好就行了 
如果是通過OpenSSL加密的https協議傳輸的網頁,curl可以直接訪問:
  curl https://that.secure.server.com
window下的https 通過curl訪問的配置:
http://618119.com/archives/2007/10/26/16.html
http://hi.baidu.com/kkwtre/blog/item/3d20fbfb9a90da204e4aea01.html
http://www.enet.com.cn/article/2011/0617/A20110617874334.shtml




















=-----------------------------------------------------------------------------------------=
PHP CURL HTTPS POST:

    1. function vpost($url,$data){ // 模擬提交數據函數  
    2.     $curl = curl_init(); // 啟動一個CURL會話  
    3.     curl_setopt($curl, CURLOPT_URL, $url); // 要訪問的地址  
    4.     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 對認證證書來源的檢查  
    5.     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 從證書中檢查SSL加密算法是否存在  
    6.     curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模擬用戶使用的瀏覽器  
    7.     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自動跳轉  
    8.     curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自動設置Referer  
    9.     curl_setopt($curl, CURLOPT_POST, 1); // 發送一個常規的Post請求  
    10.     curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的數據包  
    11.     curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 設置超時限制防止死循環  
    12.     curl_setopt($curl, CURLOPT_HEADER, 0); // 顯示返回的Header區域內容  
    13.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 獲取的信息以文件流的形式返回  
    14.     $tmpInfo = curl_exec($curl); // 執行操作  
    15.     if (curl_errno($curl)) {  
    16.        echo 'Errno'.curl_error($curl);//捕抓異常  
    17.     }  
    18.     curl_close($curl); // 關閉CURL會話  
    19.     return $tmpInfo// 返回數據  
    20. }  
    21.   
    22.   
    23. $url = "https://xxx.xxx.xxx/xxx";  
    24. $data ="x=xxxxxx";  
    25. $result = vpost($url,$data);  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM