如何用php识别机器人?

时间:2009-01-08 02:00:13

标签: php bots statistics

我正在为我的用户构建统计信息,并且不希望机器人的访问被计算在内。

现在我有一个基本的php,每次调用页面时mysql都会增加1。

但机器人也被添加到计数中。

有人能想出办法吗?

主要是那些搞乱的主要因素。谷歌,雅虎,Msn等

7 个答案:

答案 0 :(得分:23)

您可以检查用户代理字符串,空字符串或包含'robot','spider','crawler','curl'的字符串可能是机器人。

  

preg_match('/robot|spider|crawler|curl|^$/i', $_SERVER['HTTP_USER_AGENT']));

答案 1 :(得分:9)

您应该按用户代理字符串进行过滤。你可以在这里找到一个由机器人给出的大约300个常见用户代理的列表:http://www.robotstxt.org/db.html在运行SQL语句之前运行该列表并忽略bot用户代理应该可以解决所有实际问题。

如果您不希望搜索引擎甚至到达该页面,请使用基本的robots.txt文件来阻止它们。

答案 2 :(得分:6)

我们有一个类似的用例,我们最近发现一个非常有用的选项是来自UASParser classuser-agent-string.info

这是一个PHP类,它提取最新的用户代理字符串定义集并在本地缓存它们。可以将类配置为根据您的需要经常或很少地提取定义。像这样自动获取它们意味着您不必继续对bot用户代理或市场上出现的新代理进行各种更改,尽管您依靠UAS.info来准确地执行此操作。

当调用类时,它会解析当前访问者的用户代理并返回一个关联数组,从而突破组成部分,例如

Array
(
    [typ] => browser
    [ua_family] => Firefox
    [ua_name] => Firefox 3.0.8
    [ua_url] => http://www.mozilla.org/products/firefox/
    [ua_company] => Mozilla Foundation
    ........
    [os_company] => Microsoft Corporation.
    [os_company_url] => http://www.microsoft.com/
    [os_icon] => windowsxp.png
)

当UA被识别为可能属于人类访问者时,字段typ设置为browser,在这种情况下,您可以更新统计信息。

这里有几点需要注意:

  • 您依赖UAS.info提供的用户代理字符串是准确和最新的
  • 像谷歌和雅虎这样的机器人在用户代理字符串中声明自己,但是这种方法仍会计算假装成人类访问者的机器人访问(发送欺骗性UA)
  • 如上所述@amdfan,通过robots.txt屏蔽机器人应阻止大部分机器人到达您的网页。如果您需要将内容编入索引但不增加统计信息,则robots.txt方法将不是一个现实的选项

答案 3 :(得分:2)

在递增页面查看次数之前检查user agent,但请记住这可能是欺骗性的。 PHP在$_SERVER['HTTP_USER_AGENT']中公开用户代理,假设Web服务器为其提供此信息。有关$_SERVER的更多信息,请访问http://www.php.net/manual/en/reserved.variables.server.php

您可以在http://www.user-agents.org找到用户代理列表;谷歌搜索还将提供属于主要提供商的名称。第三个可能的来源是您的Web服务器的访问日志,如果您可以聚合它们。

答案 4 :(得分:0)

您是否尝试通过其用户代理信息识别它们?一个简单的谷歌搜索应该为您提供谷歌等使用的用户代理。

当然,这并非万无一失,但主要公司的大多数抓取工具都提供了独特的用户代理。

编辑:假设您不想限制机器人访问权限,但只是不计算其在您的统计信息中的访问权。

答案 5 :(得分:0)

100%工作机器人检测器。它正在我的网站上工作,可以检测机器人,爬行器,蜘蛛和复印机。

function isBotDetected() {

    if ( preg_match('/abacho|accona|AddThis|AdsBot|ahoy|AhrefsBot|AISearchBot|alexa|altavista|anthill|appie|applebot|arale|araneo|AraybOt|ariadne|arks|aspseek|ATN_Worldwide|Atomz|baiduspider|baidu|bbot|bingbot|bing|Bjaaland|BlackWidow|BotLink|bot|boxseabot|bspider|calif|CCBot|ChinaClaw|christcrawler|CMC\/0\.01|combine|confuzzledbot|contaxe|CoolBot|cosmos|crawler|crawlpaper|crawl|curl|cusco|cyberspyder|cydralspider|dataprovider|digger|DIIbot|DotBot|downloadexpress|DragonBot|DuckDuckBot|dwcp|EasouSpider|ebiness|ecollector|elfinbot|esculapio|ESI|esther|eStyle|Ezooms|facebookexternalhit|facebook|facebot|fastcrawler|FatBot|FDSE|FELIX IDE|fetch|fido|find|Firefly|fouineur|Freecrawl|froogle|gammaSpider|gazz|gcreep|geona|Getterrobo-Plus|get|girafabot|golem|googlebot|\-google|grabber|GrabNet|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|HTTrack|ia_archiver|iajabot|IDBot|Informant|InfoSeek|InfoSpiders|INGRID\/0\.1|inktomi|inspectorwww|Internet Cruiser Robot|irobot|Iron33|JBot|jcrawler|Jeeves|jobo|KDD\-Explorer|KIT\-Fireball|ko_yappo_robot|label\-grabber|larbin|legs|libwww-perl|linkedin|Linkidator|linkwalker|Lockon|logo_gif_crawler|Lycos|m2e|majesticsEO|marvin|mattie|mediafox|mediapartners|MerzScope|MindCrawler|MJ12bot|mod_pagespeed|moget|Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|NationalDirectory|naverbot|NEC\-MeshExplorer|NetcraftSurveyAgent|NetScoop|NetSeer|newscan\-online|nil|none|Nutch|ObjectsSearch|Occam|openstat.ru\/Bot|packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pingdom|pinterest|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|rambler|Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Scrubby|Search\-AU|searchprocess|search|SemrushBot|Senrigan|seznambot|Shagseeker|sharp\-info\-agent|sift|SimBot|Site Valet|SiteSucker|skymob|SLCrawler\/2\.0|slurp|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|spider|suke|tach_bw|TechBOT|TechnoratiSnoop|templeton|teoma|titin|topiclink|twitterbot|twitter|UdmSearch|Ukonline|UnwindFetchor|URL_Spider_SQL|urlck|urlresolver|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|wapspider|WebBandit\/1\.0|webcatcher|WebCopier|WebFindBot|WebLeacher|WebMechanic|WebMoose|webquest|webreaper|webspider|webs|WebWalker|WebZip|wget|whowhere|winona|wlm|WOLP|woriobot|WWWC|XGET|xing|yahoo|YandexBot|YandexMobileBot|yandex|yeti|Zeus/i', $_SERVER['HTTP_USER_AGENT'])
    ) {
        return true; // 'Above given bots detected'
    }

    return false;

} // End :: isBotDetected()

答案 6 :(得分:0)

此功能对我有用,我在https://www.cult-f.net/detect-crawlers-with-php/网站上找到了

<?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 {
       return array_search($USER_AGENT, $crawlers);
    }
    */
}
 
// example
 
$crawler = crawlerDetect($_SERVER['HTTP_USER_AGENT']);
 
if ($crawler )
{
   // it is crawler, it's name in $crawler variable
}
else
{
   // usual visitor
}