【问题标题】:Ignoring crawlers as visitors to website忽略爬虫作为网站的访问者
【发布时间】:2015-01-21 20:56:24
【问题描述】:

当每个页面加载到我的网站上时,我使用相同的 php 代码片段将它们作为新访问者添加到 mysql 数据库中,或者如果他们已经访问过,则更新数据库条目。我使用 cookie 来检查访问者是新的还是旧的。但是,在执行我的代码片段之前,我使用下面的代码来检查它是否是爬虫而不是人类。

但是这不起作用。我仍然从 googlebot 和 Facebook 获得数据库条目(所以总是返回 False?)。谁能告诉我我做错了什么?

function getIsCrawler() {
    $agents = array(
        "Google",
        "google", 
        "facebook", 
        "Facebook", 
        "Bing", 
        "bing",
        "yahoo",
        "Yahoo",
        "Twitter",
        "twitter",
        "Instagram",
        "instagram"
    );
    foreach ($agents as $agent)   
    {
        if(strpos($_SERVER['HTTP_USER_AGENT'], $agent))
        {
            return True;
        }
    }
    return False;
}

$iscrawler = getIsCrawler();

if ($isCrawler == False) 
{
    //run php code snipit to handle visitors
}

【问题讨论】:

  • 是否让网站对爬虫的操作有所不同会导致谷歌页面排名降低?
  • google bot 仍然可以正常访问该站点。我只是不想将它添加到数据库中。
  • 在 PHP 中对所有访问者一视同仁可能更简单。然后,在数据库中,要么使用视图消除爬虫,要么使用每日 cron 作业将其删除。
  • 或者只安装谷歌分析并使用 ti 完成

标签: php google-crawlers


【解决方案1】:

您可能想看几件事。首先,您可以通过向其传递值来使该函数更易于测试。传递值消除了这个函数和网页之间的紧密耦合。

其次,strpos() 及其类似函数因其返回值而臭名昭著。文档中有big red (ish) warnings

最后,您可以使用stripos() 来减小数组$agents 的大小。不区分大小写。

function getIsCrawler($external_agent) {
  $agents = array(
                  "Google",
                  "Facebook", 
                  "Bing",
                  "Yahoo",
                  "Twitter",
                  "Instagram",
                  );
  foreach ($agents as $agent)   
    {
      if(stripos($external_agent, $agent) !== False)
        {
          return True;
        }
    }
  return False;
}

【讨论】:

    【解决方案2】:

    变量名称的大小写不一致(即$iscrawler$isCrawler)。不同的大小写 = 不同的变量。

    确认:

    $X = 5;
    $x = 1;
    echo '<br/>' . $X;
    echo '<br/>' . $x;
    

    打印出来

    5
    1
    

    【讨论】:

    • 哇,真不敢相信我错过了!
    猜你喜欢
    • 2011-10-17
    • 2012-01-13
    • 2018-06-06
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2015-09-22
    相关资源
    最近更新 更多