【问题标题】:Getting website descriptions获取网站描述
【发布时间】:2013-05-22 20:59:18
【问题描述】:

我正在尝试从提供的 url 中提取各种数据,包括使用以下内容的描述元信息:-

$tags = get_meta_tags($_POST['url']);
echo $tags['description'];

这适用于某些网站,但并非全部。例如,如果我尝试http://twitter.com,我什么也得不到,但谷歌搜索(或在 facebook 中输入 url)显示以下文本:-

立即连接到对您来说最重要的事情。关注您的朋友、专家、喜爱的名人和突发新闻。

该文本在 twitter 页面的源代码中不存在 - 这是从哪里来的,我该如何获取它?同样,我的代码对于http://bbc.com 也没有返回任何内容。

【问题讨论】:

  • 元描述似乎存在于谷歌的缓存页面中:link
  • 如果我去 twitter 然后查看源代码,我看不到元描述。我错过了什么?
  • 好吧,我的意思是……对不起,马特。你的问题无法解决。如果 twitter 向您提供的 HTML 与我们其他人看到的不同,并且没有元描述,那么您无法获得元描述我>。就这么简单。
  • 但是问题已经解决了,或者当您输入网址并自动提取数据时,问题已经解决,或者无法在 Facebook/google plus 等网站上运行。所以..我的问题是(如声明) - 如果元标记中不可用,我在哪里可以获得此信息?其他网站似乎可以访问它。怎么样?
  • 其实我刚登出,源确实显示元内容..如果我重新登录,它就消失了..

标签: php


【解决方案1】:

我认为您的托管服务器的 IP 不在任何 GeoIP 数据库中。

我只是将这段代码拼凑在一起:

function get_meta_tags_from_path($path)
{
    $tags = array();
    $source = file_get_contents($path);
    $count = preg_match_all(
        "|<meta[^>]+name=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)|i",
        $source, $matches, PREG_PATTERN_ORDER);
    for($i = 0; $i < $count; $i++)
        $tags[$matches[1][$i]] = $matches[2][$i];
    return $tags;
}

$tags = get_meta_tags_from_path('https://twitter.com/'));
$description = $tags['description'];

它工作正常,就像demonstrated hereHOWEVER,您还可以看到它显示了 Dutch 元描述,因为服务器位于荷兰,在已知的荷兰 IP 上。如果 Twitter 无法通过Accept-language 标签或 GeoIP 确定访问者的可能语言环境,那么 Twitter 很可能不会尝试提供本地化内容。除非你使用 cURL 来发起一个请求,其中包含正确的 Accept 标头来模拟实际的浏览器,否则你在主机上是相当不走运的。

【讨论】:

  • 我确实尝试使用 cURL 进行快速测试,但它没有返回任何内容,但 file_get_contents 确实(包括元描述)。可能只是我对如何使用 cURL 缺乏了解......
  • 如果file_get_contents确实返回了带有元描述的内容,你可以使用这个函数来实现你的结果。实际上应该适用于您投放的每个网站。
  • 是的,我就是这么想的。现在只需要弄清楚如何从返回的数据中获取我需要的东西......我最终会到达那里。
  • 只需按照我的代码的最后两行,为您的目的更改它们:)
【解决方案2】:

对不起,你问题的前提是错误的:

该文本在推特页面的来源中不存在

确实如此:

<meta name="description" content="Instantly connect to what&#39;s most important to you. Follow your friends, experts, favorite celebrities, and breaking news.">`

-- twitter.com

还有var_dump(get_meta_tags("http://twitter.com"));

array(4) {
  ["description"]=>
  string(125) "Instantly connect to what&#39;s most important to you. Follow your friends, experts, favorite celebrities, and breaking news."
  ["msapplication-tileimage"]=>
  string(42) "//abs.twimg.com/favicons/win8-tile-144.png"
  ["msapplication-tilecolor"]=>
  string(7) "#00aced"
  ["swift-page-name"]=>
  string(5) "front"
}

【讨论】:

  • 如果我在 Chrome 中查看源代码并搜索我没有找到的文本...我错过了什么?我的代码没有返回任何描述。
  • 您确定您访问的是 twitter 登录页面,而不是您的个性化主页?尝试登录或打开隐身窗口...
  • 这不会有什么不同,因为我在托管服务器上运行我的 php 脚本。我确实尝试过,只是为了确认我的怀疑,但没有不同的输出。
猜你喜欢
  • 2018-06-11
  • 2013-06-12
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2011-03-20
  • 2011-12-03
相关资源
最近更新 更多