【问题标题】:PHP change DOM useragentPHP 更改 DOM 用户代理
【发布时间】:2013-08-17 09:21:08
【问题描述】:

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

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

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

【问题讨论】:

  • 我会使用 curl 加载 html 并传递给 DOMDocument
  • 我该怎么做。有示例代码吗?
  • 在下面查看我的答案
  • 不是同一个问题,但回答了你的问题:stackoverflow.com/questions/5975213/…
  • @Gordon 我怎样才能只得到标题?

标签: php url dom domdocument domxpath


【解决方案1】:

您可以在 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";

【讨论】:

    【解决方案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";
    

    【讨论】:

    • 我怎样才能只得到标题。 $data 显示整个页面?
    • 我试过这个。它在其他页面上运行良好,但在 facebook 上又不行。它显示此错误Notice: Trying to get property of non-object in C:\localhost\htdocs\title\index.php on line 17
    • 最后一个echo $xpath-&gt;query('//title')-&gt;item(0)-&gt;nodeValue."\n";
    • 检查源facebook没有title标签@Enve
    • 我在谷歌浏览器中从view-source:https://www.facebook.com 查到了。有一个标题标签&lt;title id="pageTitle"&gt;Welcome to Facebook - Log In, Sign Up or Learn More&lt;/title&gt;
    【解决方案3】:

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多