18

我正在为我的用户建立统计数据,并且不希望计算来自机器人的访问。

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

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

有没有人能想到办法?

主要是那些把事情搞砸的主要因素。谷歌、雅虎、Msn 等

4

7 回答 7

24

可以检查User Agent字符串,空字符串,或者包含'robot'、'spider'、'crawler'、'curl'的字符串很可能是机器人。

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

于 2009-01-08T02:07:32.600 回答
10

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

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

于 2009-01-08T02:04:02.123 回答
6

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

这是一个 PHP 类,它提取最新的用户代理字符串定义集并将它们缓存在本地。该类可以配置为根据您认为合适的频率或频率提取定义。像这样自动获取它们意味着您不必密切关注机器人用户代理或市场上新出现的各种变化,尽管您依靠 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
)

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

这里有几个警告:

  • 您依赖 UAS.info 提供的用户代理字符串是准确和最新的
  • 像 google 和 yahoo 这样的机器人在他们的用户代理字符串中声明自己,但这种方法仍然会计算来自伪装成人类访客的机器人的访问(发送欺骗性的 UA)
  • 正如上面提到的@amdfan,通过 robots.txt 阻止机器人应该会阻止大多数机器人到达您的页面。如果您需要对内容进行索引但不增加统计信息,那么 robots.txt 方法将不是一个现实的选择
于 2011-04-20T09:06:37.233 回答
2

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

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

于 2009-01-08T02:06:16.160 回答
0

您是否尝试过通过他们的用户代理信息来识别他们?一个简单的谷歌搜索应该会给你谷歌等使用的用户代理。

当然,这并不是万无一失的,但大公司的大多数爬虫都提供了一个独特的用户代理。

编辑:假设您不想限制机器人访问,但只是不计算它在您的 statistc 中的访问。

于 2009-01-08T02:03:14.277 回答
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()
于 2020-02-04T10:19:33.297 回答
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
}

于 2020-08-03T01:22:35.757 回答