我有这个简单的代码来获取任何页面的标题
<?php
$doc = new DOMDocument();
@$doc->loadHTMLFile('http://www.facebook.com');
$xpath = new DOMXPath($doc);
echo $xpath->query('//title')->item(0)->nodeValue."\n";
?>
它在我尝试过的所有页面上都运行良好,但在Facebook上没有。
当我在Facebook上尝试时,它没有显示Welcome to Facebook - Log In, Sign Up or Learn More
,但它显示Update Your Browser | Facebook
。
我认为useragent存在问题。那么有没有办法改变使用者,或者还有其他解决办法吗?
答案 0 :(得分:3)
您可以在php.ini中设置用户代理,而无需curl。在加载DOMDocument
之前,只需使用以下行$agent = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
ini_set('user_agent', $agent);
然后你的代码:
$doc = new DOMDocument();
@$doc->loadHTMLFile('http://www.facebook.com');
$xpath = new DOMXPath($doc);
echo $xpath->query('//title')->item(0)->nodeValue."\n";
答案 1 :(得分:2)
在DOMDocument
中没有直接的方法来更改用户代理。您可以使用curl检索html,然后传递给DOMDocument
。以下是从curl
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
您可以使用以下方法将其传递给DomDocument
。
$dom = new DomDocument();
$dom->loadHtml($data);
$xpath = new DOMXPath($dom);
echo $xpath->query('//title')->item(0)->nodeValue."\n";
答案 2 :(得分:0)
cURL
它,但提供合法的用户代理(也许是你自己的代理$_SERVER['HTTP_USER_AGENT']
,然后将结果提供给DOMDocument
。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.facebook.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
$dom = new DomDocument();
$dom->loadHtml(curl_exec($ch));