告诉机器人除了人类访问者的统计数据?

时间:2009-11-11 18:07:30

标签: php javascript web-services analytics

我希望推出自己的简单网络统计脚本。

据我所知,路上唯一的主要障碍是告诉人类访客除了机器人之外。我希望有一个解决方案,我不需要定期维护(即我不想用机器人相关的用户代理更新文本文件)。

是否有任何开放服务可以做到这一点,就像Akismet为垃圾邮件做的那样? 或者是否有一个专门用于识别蜘蛛和机器人并提供频繁更新的PHP项目?

澄清:我不打算阻止僵尸程序。 我不需要100%不漏水的结果。我只是  想从我的统计数据中尽可能多地排除。在  知道解析用户代理是一个  选项,但保持模式  解析是很多工作。我的  问题是是否有  这样做的项目或服务  已经

  

赏金:我以为我会把这个作为关于这个主题的参考问题。最佳/最原始/技术上可行的贡献将获得赏金金额。

15 个答案:

答案 0 :(得分:71)

人类和机器人会做类似的事情,但机器人会做人类没有做的事情。让我们试着找出那些东西。在我们查看行为之前,让我们接受RayQuang's评论是有用的。如果访问者拥有机器人的用户代理字符串,那么它可能是一个机器人。除非他们正在努力破坏某些东西,否则我无法想象任何人使用“Google Crawler”(或类似的东西)作为UA。我知道您不想手动更新列表,但是自动提取该列表应该是好的,即使它在接下来的10年内保持陈旧,也会有所帮助。

有些人已经提到过Javascript和图片加载,但谷歌会同时做这两件事。我们必须假设现在有几个机器人会同时做这两个,因此这些机器人不再是人类指标。然而,机器人仍将独一无二地遵循“隐形”链接。以非常偷偷摸摸的方式链接到页面,我无法将其视为用户。如果这样,我们就有了机器人。

Bots经常(尽管不总是)尊重robots.txt。用户不关心robots.txt,我们可以假设任何检索robots.txt的人都是机器人。不过,我们可以更进一步,将虚拟CSS页面链接到robots.txt排除的页面。如果加载我们正常的CSS但我们的虚拟CSS不是,它肯定是一个机器人。你将不得不通过IP构建(可能是内存中)负载表并且不包含在匹配中,但这应该是一个非常可靠的告诉。

所以,要使用所有这些:通过ip地址维护一个机器人数据库表,可能有时间戳限制。添加任何跟随隐形链接的内容,添加任何加载“真实”CSS但忽略robots.txt CSS的内容。也许添加所有robots.txt下载程序。过滤用户代理字符串作为最后一步,并考虑使用它来进行快速统计分析,看看这些方法看起来有多强烈地用于识别我们知道的机器人。

答案 1 :(得分:21)

最简单的方法是检查他们的使用者是否包含'bot'或'spider'。Most do

答案 2 :(得分:13)

编辑(10年后):正如Lukas在评论框中所说的,今天几乎所有的抓取工具都支持javascript所以我删除了段落,声明如果该网站是基于JS的大多数机器人将是自动剥离。

您可以按照机器人列表并将其用户代理添加到过滤列表中。

Take a look at this bot list.

user-agent list也很不错。只需删除所有B 就可以了。

编辑eSniff完成了惊人的工作,the above list here的形式可以更容易查询和解析.robotstxt.org / db / all。 txt每个新的Bot都由robot-id:XXX定义。您应该能够每周下载一次并将其解析为您的脚本可以使用的内容“就像您可以在他的评论中阅读一样。

希望它有所帮助!

答案 3 :(得分:11)

考虑一个伪造为CSS背景图像的PHP stats脚本(给出正确的响应头 - 至少是内容类型和缓存控件 - 但是写出一个空图像。)

有些机器人解析JS,但肯定没有人加载CSS图像。与JS一样的一个缺陷是,您将排除基于文本的浏览器,但这不到全球网络人口的1%。此外,与禁用JS的客户端(手机!)相比,CSS禁用客户端肯定更少。

为了让更为先进的机器人(谷歌,雅虎等)可能在将来抓取它们的(非常规)情况更加稳固,禁止robots.txt中的CSS图像路径(哪个更好)机器人无论如何都会尊重。)

答案 4 :(得分:6)

我将以下内容用于我的统计/计数器应用程序:

<?php
    function is_bot($user_agent) {
        return preg_match('/(abot|dbot|ebot|hbot|kbot|lbot|mbot|nbot|obot|pbot|rbot|sbot|tbot|vbot|ybot|zbot|bot\.|bot\/|_bot|\.bot|\/bot|\-bot|\:bot|\(bot|crawl|slurp|spider|seek|accoona|acoon|adressendeutschland|ah\-ha\.com|ahoy|altavista|ananzi|anthill|appie|arachnophilia|arale|araneo|aranha|architext|aretha|arks|asterias|atlocal|atn|atomz|augurfind|backrub|bannana_bot|baypup|bdfetch|big brother|biglotron|bjaaland|blackwidow|blaiz|blog|blo\.|bloodhound|boitho|booch|bradley|butterfly|calif|cassandra|ccubee|cfetch|charlotte|churl|cienciaficcion|cmc|collective|comagent|combine|computingsite|csci|curl|cusco|daumoa|deepindex|delorie|depspid|deweb|die blinde kuh|digger|ditto|dmoz|docomo|download express|dtaagent|dwcp|ebiness|ebingbong|e\-collector|ejupiter|emacs\-w3 search engine|esther|evliya celebi|ezresult|falcon|felix ide|ferret|fetchrover|fido|findlinks|fireball|fish search|fouineur|funnelweb|gazz|gcreep|genieknows|getterroboplus|geturl|glx|goforit|golem|grabber|grapnel|gralon|griffon|gromit|grub|gulliver|hamahakki|harvest|havindex|helix|heritrix|hku www octopus|homerweb|htdig|html index|html_analyzer|htmlgobble|hubater|hyper\-decontextualizer|ia_archiver|ibm_planetwide|ichiro|iconsurf|iltrovatore|image\.kapsi\.net|imagelock|incywincy|indexer|infobee|informant|ingrid|inktomisearch\.com|inspector web|intelliagent|internet shinchakubin|ip3000|iron33|israeli\-search|ivia|jack|jakarta|javabee|jetbot|jumpstation|katipo|kdd\-explorer|kilroy|knowledge|kototoi|kretrieve|labelgrabber|lachesis|larbin|legs|libwww|linkalarm|link validator|linkscan|lockon|lwp|lycos|magpie|mantraagent|mapoftheinternet|marvin\/|mattie|mediafox|mediapartners|mercator|merzscope|microsoft url control|minirank|miva|mj12|mnogosearch|moget|monster|moose|motor|multitext|muncher|muscatferret|mwd\.search|myweb|najdi|nameprotect|nationaldirectory|nazilla|ncsa beta|nec\-meshexplorer|nederland\.zoek|netcarta webmap engine|netmechanic|netresearchserver|netscoop|newscan\-online|nhse|nokia6682\/|nomad|noyona|nutch|nzexplorer|objectssearch|occam|omni|open text|openfind|openintelligencedata|orb search|osis\-project|pack rat|pageboy|pagebull|page_verifier|panscient|parasite|partnersite|patric|pear\.|pegasus|peregrinator|pgp key agent|phantom|phpdig|picosearch|piltdownman|pimptrain|pinpoint|pioneer|piranha|plumtreewebaccessor|pogodak|poirot|pompos|poppelsdorf|poppi|popular iconoclast|psycheclone|publisher|python|rambler|raven search|roach|road runner|roadhouse|robbie|robofox|robozilla|rules|salty|sbider|scooter|scoutjet|scrubby|search\.|searchprocess|semanticdiscovery|senrigan|sg\-scout|shai\'hulud|shark|shopwiki|sidewinder|sift|silk|simmany|site searcher|site valet|sitetech\-rover|skymob\.com|sleek|smartwit|sna\-|snappy|snooper|sohu|speedfind|sphere|sphider|spinner|spyder|steeler\/|suke|suntek|supersnooper|surfnomore|sven|sygol|szukacz|tach black widow|tarantula|templeton|\/teoma|t\-h\-u\-n\-d\-e\-r\-s\-t\-o\-n\-e|theophrastus|titan|titin|tkwww|toutatis|t\-rex|tutorgig|twiceler|twisted|ucsd|udmsearch|url check|updated|vagabondo|valkyrie|verticrawl|victoria|vision\-search|volcano|voyager\/|voyager\-hc|w3c_validator|w3m2|w3mir|walker|wallpaper|wanderer|wauuu|wavefire|web core|web hopper|web wombat|webbandit|webcatcher|webcopy|webfoot|weblayers|weblinker|weblog monitor|webmirror|webmonkey|webquest|webreaper|websitepulse|websnarf|webstolperer|webvac|webwalk|webwatch|webwombat|webzinger|wget|whizbang|whowhere|wild ferret|worldlight|wwwc|wwwster|xenu|xget|xift|xirq|yandex|yanga|yeti|yodao|zao\/|zippp|zyborg|\.\.\.\.)/i', $user_agent);
    }

    //example usage
    if (! is_bot($_SERVER["HTTP_USER_AGENT"])) echo "it's a human hit!";
?>

我删除了原始代码源的链接,因为它现在重定向到食品应用程序。

答案 5 :(得分:4)

我目前使用AWstats和Webalizer来监控我的Apasce2的日志文件,到目前为止他们已经做得很好。如果您愿意,可以查看它们的源代码,因为它是一个开源项目。

您可以在http://awstats.sourceforge.net获取来源,或者查看常见问题解答http://awstats.sourceforge.net/docs/awstats_faq.html

希望有所帮助, RayQuang

答案 6 :(得分:4)

检查用户代理会提醒您诚实的机器人,但不会提醒垃圾邮件发送者。

要告诉不诚实机器人提出哪些请求,最好的选择(based on this guy's interesting study)是抓住Javascript焦点事件

如果焦点事件触发,页面几乎肯定是由人类加载的。

  

答案 7 :(得分:3)

我们不是试图维护一个不可思议的蜘蛛用户代理列表,而是寻找表明人类行为的东西。这些原则是我们将会话数分为两个数字:单页会话数和多页会话数。我们删除会话cookie,并使用它来确定多页会话。我们还删除了一个持久的“机器ID”cookie;返回的用户(找到的机器ID cookie)被视为多页会话,即使他们只查看该会话中的一个页面。您可能还有其他特征暗示“人”访问者 - 例如,引用者是谷歌(尽管我认为MS Search僵尸程序可以作为标准的UserAgent进行标记,并使用现实的关键字来检查该网站是否显示不同的内容[那给了他们的Bot],这种行为看起来很像人类!)

当然这不是无法忍受的,特别是如果你有很多人到达并“点击”它对你来说不是一个好的统计数据,也不是你有优势的人关闭cookie(在我们的情况是,如果没有启用会话cookie,他们将无法使用我们的[购物车]网站。

从我们的一位客户那里获取数据,我们发现每日单次会话计数到处都是 - 每天都有不同的数量级;但是,如果我们每天从多页会话中减去1,000,那么每个订单放置4个多页面会话/每个篮子两个会话的接近线性速率。我不知道每天其他1,000个多页会话是什么!

答案 8 :(得分:2)

使用javascript记录鼠标移动和滚动。您可以从记录的数据中了解它是人还是机器人。除非机器人真的很精致并且模仿人类的鼠标移动。

答案 9 :(得分:1)

先决条件 - 设置了引荐来源

apache级别:

LogFormat "%U %{Referer}i %{%Y-%m-%d %H:%M:%S}t" human_log
RewriteRule ^/human/(.*)   /b.gif [L]
SetEnv human_session 0

# using referrer
SetEnvIf Referer "^http://yoursite.com/" human_log_session=1

SetEnvIf Request_URI "^/human/(.*).gif$" human_dolog=1
SetEnvIf human_log_session 0 !human_dolog
CustomLog logs/human-access_log human_log env=human_dolog

在网页中,嵌入/human/$hashkey_of_current_url.gif
如果是机器人,则不太可能有引用者设置(这是灰色区域) 如果使用浏览器地址栏直接点击,则不会包含它。

在每天结束时,/human-access_log应该包含实际上是人工页面视图的所有引荐来源。

为了安全起见,来自apache日志的引荐来源的哈希应该与图像名称

相符

答案 10 :(得分:1)

现在,我们拥有各种无头的浏览器。 Chrome,Firefox或其他可以执行您网站上所有JS的浏览器。因此,任何基于JS的检测都将无法正常工作。

我认为最自信的方法是在网站上跟踪行为。如果我要编写一个机器人并想绕过检查,那么我会使用无头chrome来模拟滚动,鼠标移动,悬停,浏览器历史记录等事件。为了将其提升到一个新的水平,即使无头chrome在请求中添加了一些有关“无头”模式的提示,我也可以派生chrome repo,进行更改并构建自己的二进制文件,这将毫无痕迹。

我认为,如果访客不采取任何行动,这可能是最真实的答案,无论它是人为的还是

https://developers.google.com/recaptcha/docs/invisible

我不确定这背后的技术,但是我相信Google可以通过使用其ML算法分析数十亿个请求来检测行为是人类还是机器人来完成。

虽然这是一个额外的HTTP请求,但它不会检测到快速反弹的访问者,因此请记住这一点。

答案 11 :(得分:0)

=?对不起,误会了。您可以尝试我在我的网站上设置的其他选项:创建一个具有硬/奇怪名称​​的非链接网页,并记录对此页面的访问。大多数(如果不是全部)此页面的访问者都是机器人,这样您就可以动态创建机器人列表。

原始答案如下(获得负面评价!)

  

告诉机器人唯一可靠的方法   人类是[CAPTCHAS] [1]。您可以   如果它适合你,请使用[reCAPTCHA] [2]。

     

[1]:   http://en.wikipedia.org/wiki/Captcha
  [2]:http://recaptcha.net/

答案 12 :(得分:0)

在您跟踪的网页中有1x1 gif。如果加载那么它可能是一个浏览器。如果没有加载它可能是一个脚本。

答案 13 :(得分:0)

您可以排除来自也请求robots.txt的用户代理的所有请求。所有表现良好的机器人都会提出这样的请求,但是坏的机器人将无法进行检测。

你也有误报的问题 - 作为一个人,我不常在浏览器中阅读a robots.txt,但我当然可以。为了避免这些错误地显示为机器人,您可以将一些常见的浏览器用户代理列入白名单,并将它们视为永远是人。但这只会变成维护浏览器用户代理列表而不是机器人用户代理列表。

所以,这样做 - 他们请求 - robots.txt方法肯定不会给出100%的防水结果,但它可能会提供一些启发式方法来提供完整的解决方案。

答案 14 :(得分:-1)

我很惊讶没有人建议实施Turing test。只需在另一端与人聊天。

程序化解决方案不会这样做:查看PARRY Encounters the DOCTOR

时会发生什么

这两个“人物”都是在70年代人工智能研究过程中写的“喋喋不休”的机器人:看他们能欺骗一个真实的人多久才能认为他们也是一个人。 PARRY角色被模仿为偏执型精神分裂症,而医生则被定型为刻板心理治疗师。

这是some more background