2012-07-21 109 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