【问题标题】:Skip javascript snippet of code for crawlers跳过爬虫的 JavaScript 代码片段
【发布时间】:2013-11-13 11:35:21
【问题描述】:

我有一个 php 网站,将某些 php 变量传递给 javascript 变量,谷歌抓取了我,这会产生错误和重复的内容。有什么办法可以让google爬虫忽略javascript中这些变量的声明?

    echo '<script language="javascript">var '.$item['Nombre'].'="'.$descripcion.'";</script>';

对不起我的英语,

【问题讨论】:

  • 您能描述一下它“产生错误和重复内容”的方式吗?您在使用网站管理员工具吗?重复内容通常意味着不同 url 上的相同内容。你能告诉我们一些谷歌发现重复内容的示例网址吗?这些参数GET 参数是否有机会?我怀疑你误解了这个错误。
  • 是一个分销品牌页面,每个品牌都加载在像“/firmas/1.html”、“/fimas/2.html”这样的页面上。但是所有品牌都是从主页加载的在 javascript 变量上显示 div 中的内容,使用品牌名称上方的 innerHTML 进行鼠标悬停。这个“onmouseover”出现在所有品牌中,因为它是菜单的一部分,所以如果输入“/firmas/1.html”,则加载所有变量,如 index.html 中一样,但只显示 id 为 1 的变量。理想使用单独在
  • 我正在使用网站管理员工具。但问题是谷歌没有给我错误,但谷歌没有索引页面,因为被认为是每个页面上的相同内容。
  • 谷歌不给你报错?那你怎么知道它是“因为在每个页面上都被认为是相同的内容”?根据您的描述,我认为问题不是“相同的内容”而是“没有内容”。 Google 不会读取您的 javascript。我也有可能误解了一些东西。您能否编辑您的问题,解释您的场景(有多少页,具体包含什么内容)并包含代码的相关部分(例如鼠标悬停时实际发生的情况)?您在评论中的描述非常模棱两可!
  • 我用过'languaje="javascript"'。我已经被 'languaje="text/javascript"' 改变了,现在我还在等待来自 Google 的新抓取。我知道是因为在搜索描述时会显示每个变量的 var 名称描述。

标签: javascript php html web-crawler skip


【解决方案1】:

Google 抓取 javascript 代码并认为它​​重复?我以前从未听说过这个问题。我的一些页面有内联 javascript(如果内容很小),这意味着每个页面上都使用相同的 &lt;script&gt;...&lt;/script&gt;

在某些情况下,我或多或少地以与您相同的方式输出 javascript 变量。 Google 从未将其标记为“重复内容”。

来自here的描述:

重复内容通常是指实质性的内容块 在域内或跨域完全匹配其他内容或 明显相似。大多数情况下,这在起源上并不具有欺骗性。 非恶意重复内容的示例可能包括:

  • 可以生成针对移动设备的常规页面和精简页面的讨论论坛
  • 存储通过多个不同 URL 显示或链接的项目
  • 仅打印版本的网页

如果您在多个页面上具有相同的内容,则可能会出现此类错误,但 google 不会将 javascript 解析为内容。 (虽然你永远无法确定谷歌做什么或不做什么)。就像 google 不会将您的 &lt;head&gt; 标签标记为重复一样,或者在每个页面上使用相同的布局(菜单、页脚等)也不会受到惩罚。

您可以将&lt;script&gt; 标记放在&lt;aside&gt; 标记中以确保安全。

HTML 元素代表页面的一部分,其中包含 与其周围的内容相切相关的内容, 这可以被认为与该内容分开。这样的部分 通常表示为侧边栏或插入。它们通常包含 侧面解释,如词汇表定义;更松散相关 东西,比如广告;作者的传记;或在 网络应用程序、个人资料信息或相关博客链接。

这意味着在索引页面时,谷歌或多或少会忽略该内容。它不会将其标记为重复,因为它可能是商业广告。

同时从您的脚本标签中删除language="javascript" 属性。我怀疑它会以任何方式混淆谷歌,因为that attribute is deprecated(改用type)并且现在没有考虑到它。但如果 google bot 这样做,正确的值将是 text/javascript 而不是简单的 javascript。可能是 google 无法识别值 javascript 并将其解析为未知类型的文本内容。

脚本的默认类型是text/javascript,所以省略是安全


首先,我怀疑问题不在于 JS 变量的存在,而在于 URL 中的 GET 参数之类的其他东西。 GET参数可以通过在站长工具中正确配置URL参数来处理。

【讨论】:

  • 好的,我用过 languaje="javascript",我会改一下看看能不能解决我的问题。
【解决方案2】:

重要提示:在大多数情况下,这是不好的做法。如果 Google 注意到您向其机器人提供不同的内容并认为其相关,那么您的网站可能会受到无法衡量的处罚。

我推荐这个 php 解决方案

在 PHP 中使用此代码:

if (!strpos($_SERVER[‘HTTP_USER_AGENT’],"Googlebot")) {
  //echo the script
}
else{ //dont echo, does nothing. }

但如果这不起作用,您可以尝试将此 javascript 代码添加到您的脚本标记中:

    if (!navigator.userAgent.contains('Googlebot')) {
    //do the script
    } else {
    //does nothing
    }

Ps:这是一个用户代理列表http://www.useragentstring.com/pages/Crawlerlist/

【讨论】:

  • Googlebot 不是正确的用户代理字符串 - 请参阅 support.google.com/webmasters/answer/1061943?hl=en
  • 在大多数情况下这是不好的做法。如果 Google 注意到您向其机器人提供不同的内容并认为其相关,那么您的网站可能会受到无法衡量的处罚。
  • @broofa 抱歉,我在 js 代码中犯了一个小错误,现在它可以工作了 :) 并且现在有效。
  • 你确定这个 JS 真的可以工作吗?具体来说,是否有任何证据表明 Google 使用了指定可检测用户代理的 JS 运行时?这似乎与我预期的他们的主要目标背道而驰:为访问者在访问该网站时将看到的内容编制索引。
  • @broofa 好吧,也许你是对的,但我认为机器人在“解释”方面就像浏览器一样,可能是由于对代码的 sn-p 的错误解释导致的错误。但只是一种意见。
【解决方案3】:

另一种(未经测试的、推测性的)方法要求您可以编写自己的 robots.txt 文件:

  1. 将所有 javascript 代码生成移至另一个 URL,并将其作为 javascript 脚本包含在您的页面中:&lt;script type="text/javascript" src="/path/to/my/php/that/generates/js/variables.php"&gt;&lt;/script&gt;

  2. 将该 URL 添加到您的 robots.txt 文件中(请参阅 Google answer

用户代理:Googlebot

不允许:/path/to/my/php/that/generates/js/variables.php

【讨论】:

  • 高度怀疑这是否会达到您的要求。虽然它会阻止您的 variables.php 文件出现在谷歌搜索中,但我敢打赌它不会阻止谷歌在索引不同的 [allowed-by-robots.txt] 网页时将其用作脚本导入该脚本。
  • 是的……所以……就是这样。这让我很想投反对票。 :-/ 如果您至少注意到这是一种投机方法,在您的答案中具有未经测试的行为,那可能是最好的。
【解决方案4】:

您可以使用以下 PHP 代码:

$crawlers = array(
'Google'=>'Google',
'MSN' => 'msnbot',
'Rambler'=>'Rambler',
'Yahoo'=> 'Yahoo',
'AbachoBOT'=> 'AbachoBOT',
'accoona'=> 'Accoona',
'AcoiRobot'=> 'AcoiRobot',
'ASPSeek'=> 'ASPSeek',
'CrocCrawler'=> 'CrocCrawler',
'Dumbot'=> 'Dumbot',
'FAST-WebCrawler'=> 'FAST-WebCrawler',
'GeonaBot'=> 'GeonaBot',
'Gigabot'=> 'Gigabot',
'Lycos spider'=> 'Lycos',
'MSRBOT'=> 'MSRBOT',
'Altavista robot'=> 'Scooter',
'AltaVista robot'=> 'Altavista',
'ID-Search Bot'=> 'IDBot',
'eStyle Bot'=> 'eStyle',
'Scrubby robot'=> 'Scrubby',
);

function crawlerDetect($USER_AGENT)
{
// to get crawlers string used in function uncomment it
// it is better to save it in string than use implode every time
// global $crawlers
// $crawlers_agents = implode('|',$crawlers);
$crawlers_agents = 'Google|msnbot|Rambler|Yahoo|AbachoBOT|accoona|AcioRobot|ASPSeek|CocoCrawler|Dumbot|FAST-WebCrawler|GeonaBot|Gigabot|Lycos|MSRBOT|Scooter|AltaVista|IDBot|eStyle|Scrubby';

if ( strpos($crawlers_agents , $USER_AGENT) === false )
   return false;
// crawler detected
// you can use it to return its name
/*
else {
                                                                                                                                                        1,1           Top
 return array_search($USER_AGENT, $crawlers);
}
*/
}

使用上述方法可以检查请求是否来自爬虫。

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多