2012-07-21 151 views
2

我想打開網頁的主頁,並從它的HTML標記中提取標題和描述使用curl與PHP,我成功地做到了這一點,但許多網站在那裏我無法打開。我的代碼在這裏:curl無法下載網頁

function curl_download($Url){ 
    if (!function_exists('curl_init')){ 
     die('Sorry cURL is not installed!'); 
    } 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $Url); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    $output = curl_exec($ch); 
    curl_close($ch); 
    return $output; 
} 
// $url is any url 
$source=curl_download($url); 
$d=new DOMDocument(); 
$d->loadHTML($source); 
$title=$d->getElementsByTagName("title")->item(0)->textContent) 
$domx = new DOMXPath($d); 
$desc=$domx->query("//meta[@name='description']")->item(0); 
$description=$desc->getAttribute('content'); 
?> 

此代碼適用於大多數網站,但有很多人甚至無法打開。可能是什麼原因?

當我嘗試使用get_headers函數獲取那些網站的標題時,它的工作正常,但這些不是使用curl打開的。其中兩個網站是blogger.comlive.com

+0

會發生什麼情況?任何錯誤? – tiwo 2012-07-21 20:27:24

+0

只是猜測......他們是否可能阻止捲曲(因爲curl尊重'robots.txt',或者通過在curl的請求頭上皺眉)服務器端? – tiwo 2012-07-21 20:27:38

+0

沒有錯誤,只是不返回任何內容,我試着直接使用file_get_contents函數打開,結果相同,但不能。 – Sourabh 2012-07-21 20:30:16

回答

3

替換:

$output = curl_exec($ch); 

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSLVERSION, 3); 
$output = curl_exec($ch); 
if (!$output) { 
    echo curl_error($ch); 
} 

,看看爲什麼捲曲失敗。

總是檢查函數調用的結果以查看它們是否成功,並在失敗時進行報告是一個好主意。雖然一個函數可能會工作99.999%的時間,但您需要報告它失敗的時間以及原因,如果可能,可以確定並修復潛在的原因。

+0

「SSL證書問題,請驗證CA證書是否正常。詳細信息:錯誤:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:證書驗證失敗「 這是它顯示的錯誤,它關於SSL,但我認爲curl可以處理ssl?其他ssl受保護的站點正在響應。 – Sourabh 2012-07-21 21:03:25

+0

我有一個想法,這是一個SSL問題。添加:'curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,0); curl_setopt($ ch,CURLOPT_SSLVERSION,3);'。我已經更新了上面的答案。 – 2012-07-21 21:04:41

+0

哇,它只是工作,很好,謝謝,如果你不介意,我可以關注你在微博上? – Sourabh 2012-07-21 21:08:22