1

我有这个简单的代码来获取任何页面的标题

<?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

我认为用户代理有问题。那么有没有办法改变用户代理或者有没有其他解决方案呢?

4

3 回答 3

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";
于 2015-07-20T06:25:08.613 回答
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";
于 2013-08-15T08:03:02.257 回答
0

Facebook 可能不希望人们抓取他们的网站。另一方面,您可以做的是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));
于 2013-08-15T07:58:18.433 回答