忽略抓取工具作为网站访问者

时间:2015-01-21 20:56:25

标签: php google-crawlers

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

然而,这不起作用。我仍然从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
}

2 个答案:

答案 0 :(得分:1)

您的大写字母与您的变量名称不一致(即$iscrawler$isCrawler)。不同的大写=不同的变量。

确认:

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

打印

5
1

答案 1 :(得分:1)

您可能希望了解一些事情。首先,您可以通过向其传递值来使此函数更容易测试。传递值会消除此函数与网页之间的紧密耦合。

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

最后,您可以使用stripos()减少数组$代理的大小。它对案件不敏感。

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