如何用php识别机器人?
Posted
技术标签:
【中文标题】如何用php识别机器人?【英文标题】:How to recognize bots with php? 【发布时间】:2010-09-30 04:39:10 【问题描述】:我正在为我的用户建立统计数据,不希望机器人的访问被计算在内。
现在我有一个基本的php,每次调用页面时mysql都会增加1。
但机器人也被添加到计数中。
有没有人能想到办法?
主要只是把事情搞砸的主要因素。谷歌、雅虎、Msn 等。
【问题讨论】:
【参考方案1】:您是否尝试过通过用户代理信息来识别他们?一个简单的谷歌搜索应该会给你谷歌等使用的用户代理。
这当然不是万无一失的,但大多数大公司的爬虫都提供了一个独特的用户代理。
编辑:假设您不想限制机器人访问,但只是不在您的统计数据中计算它的访问。
【讨论】:
【参考方案2】:您应该按用户代理字符串进行过滤。您可以在此处找到机器人提供的大约 300 个常见用户代理的列表:http://www.robotstxt.org/db.html 运行该列表并在运行 SQL 语句之前忽略机器人用户代理应该可以解决所有实际问题。
如果您甚至不希望搜索引擎到达该页面,请使用基本的robots.txt 文件来阻止它们。
【讨论】:
【参考方案3】:在增加页面浏览计数之前检查user agent,但请记住这可能会被欺骗。 PHP 在$_SERVER['HTTP_USER_AGENT']
中公开用户代理,假设 Web 服务器向它提供了此信息。有关$_SERVER
的更多信息,请访问http://www.php.net/manual/en/reserved.variables.server.php。
您可以在http://www.user-agents.org 找到用户代理列表;谷歌搜索还将提供属于主要提供商的名称。第三种可能的来源是您的网络服务器的访问日志,如果您可以汇总它们的话。
【讨论】:
【参考方案4】:可以检查User Agent字符串,空字符串,或者包含'robot'、'spider'、'crawler'、'curl'的字符串很可能是机器人。
preg_match('/robot|spider|crawler|curl|^$/i', $_SERVER['HTTP_USER_AGENT']));
【讨论】:
非常有用。如果您将 robot 替换为 bot 以匹配最活跃的机器人之一,则更有用:Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
我建议明确匹配“googlebot”,因为匹配“bot”可能会排除潜在的良性用户代理。
我在useragentstring.com/pages/Browserlist 上搜索了“bot”,但没有找到任何结果。所以我猜匹配“bot”不应该引发误报。
雅虎啜饮!是另一个需要注意的... Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
这似乎是你的 preg_match 的改进版本:***.com/a/15047834/1026623【参考方案5】:
我们有一个与您自己类似的用例,我们最近发现一个非常有用的选项是来自user-agent-string.info 的UASParser class。
这是一个 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
)
当 UA 被识别为可能属于人类访客时,typ
字段设置为 browser
,在这种情况下,您可以更新您的统计信息。
这里有几个警告:
您依赖 UAS.info 提供的用户代理字符串是准确和最新的 google 和 yahoo 等机器人在其用户代理字符串中声明自己,但此方法仍会计算来自伪装成人类访客的机器人的访问(发送欺骗性 UA) 正如上面提到的@amdfan,通过robots.txt 阻止漫游器应该会阻止大多数漫游器到达您的页面。如果您需要对内容进行索引但不增加统计信息,那么 robots.txt 方法将不是一个现实的选择【讨论】:
【参考方案6】:100% Working Bot 检测器。它正在我的网站上检测机器人、爬虫、蜘蛛和复印机。
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()
【讨论】:
【参考方案7】:这个功能对我有用,我在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
【讨论】:
以上是关于如何用php识别机器人?的主要内容,如果未能解决你的问题,请参考以下文章