【问题标题】:Tell bots apart from human visitors for stats?将机器人与人类访客区分开来获取统计信息?
【发布时间】:2010-12-15 13:55:58
【问题描述】:

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

据我所知,路上唯一的主要障碍是将人类访客与机器人区分开来。我想要一个不需要定期维护的解决方案(即我不想使用与机器人相关的用户代理更新文本文件)。

有没有像 Akismet 那样处理垃圾邮件的开放服务? 或者有没有专门用于识别蜘蛛和机器人并提供频繁更新的 PHP 项目?

澄清一下:我不想阻止机器人。 我不需要 100% 无懈可击的结果。我只是 想从我的统计数据中排除尽可能多的数据。在 知道解析 user-Agent 是一个 选项,但保持模式 解析是很多工作。我的 问题是有没有 这样做的项目或服务 已经。

赏金:我想我会将此作为该主题的参考问题。最好/最原始/技术上最可行的贡献将获得赏金。

【问题讨论】:

  • 我能问你为什么要自己制作吗?它会给你的服务器增加大量额外的压力(写操作)。什么是 GA 无法为您追踪的?
  • @galambalazs 我不想在这种情况下使用 GA。目标是拥有一个完全独立的解决方案。
  • 我了解您的目标是什么。我只是好奇为什么? :)
  • @galambalasz 我想要做的这个网站是为一群不太懂技术的人准备的。具有数千种花里胡哨的 GA 对他们来说太复杂了。他们需要知道的是 1) 当天的访客总数和 2) 他们大概来自哪里的列表。我认为对于这种简单的解决方案的需求,GA 并没有仅仅因为它太复杂 来解决它。但是,使用GA API,现在可以以自定义方式获取和显示数据
  • 所以这个论点不再像我问这个问题时那样有效。但除此之外,我有时还希望减少对第三方供应商的依赖,特别是对于不会进行频繁技术开发和维护的项目。托管服务可能会出现问题 - technical outages、可能的许可证变更、破产......这一切都存在,即使对于最大和最强大的公司也是如此

标签: php javascript web-services analytics


【解决方案1】:

编辑(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 每个新机器人由机器人 ID:XXX 定义。您应该能够每周下载一次并将其解析为您的脚本可以使用的内容”,就像您在他的评论中看到的那样。

希望对你有帮助!

【讨论】:

  • 根据您的目标市场,很多用户也没有。很多 Firefox 用户倾向于使用 NoScript。
  • NoScript 也意味着,没有 StackOverflow,没有 Gmail、阅读器、地图、Facebook、YouTube 等等......我一直使用 NoScript 来检查我自己的网站是否有蜘蛛和机器人,但现在没有使用 NoScript 没有多大意义。只是我的看法。
  • @Col。就像杰夫所说的那样,总是试图少吸一点……昨天重新阅读它,尽管逗号会使它更容易阅读! :)
  • 顺便说一句,这里是上面的 Robotstxt 列表,但其形式更易于查询和解析。 robotstxt.org/db/all.txt 每个新的 Bot 都由一个 robots-id:XXX 定义。您应该能够每周下载一次并将其解析为您的脚本可以使用的内容。
  • 这个答案肯定已经过时了。现在越来越多的机器人正在使用无头 chrome 之类的东西,它会像人类使用 chrome 一样执行所有操作。它于 2017 年年中推出。此外,Firefox 可以在无头模式下运行,并且可能其他浏览器也已经或将来会运行。 JS 不是问题。太多的网站依赖 JS 来渲染任何东西。机器人知道这一点。
【解决方案2】:

现在我们拥有各种无头浏览器。 Chrome、Firefox 或其他将执行您网站上的任何 JS 的工具。所以任何基于 JS 的检测都行不通。

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

如果访问者没有采取任何行动,我认为这可能是最接近真实检测的答案:

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

我不确定这背后的技术,但我相信 Google 做得很好,通过使用他们的 ML 算法分析数十亿个请求来检测行为是人类还是机器人。

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

【讨论】:

    【解决方案3】:

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

    <?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!";
    ?>
    

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

    【讨论】:

      【解决方案4】:

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

      要判断哪些请求是由不诚实的机器人发出的,最好的办法 (based on this guy's interesting study) 是捕获 Javascript 焦点事件

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

      【讨论】:

      • headless chrome 将毫无问题地执行焦点。不会保护。
      【解决方案5】:

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

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

      为了让更高级的机器人(Google、Yahoo 等)将来可能会抓取它们的(非例外)情况更加可靠,禁止robots.txt 中的 CSS 图像路径(更好的机器人会无论如何都要尊重)。

      【讨论】:

      • CSS背景图会不会在后续访问时被缓存而不被重新请求?
      • @Kristen:如果您添加无缓存标头,则不会。
      • 如果您将统计信息存储在数据库中,这是否需要两个单独的数据库连接?
      【解决方案6】:

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

      有些人已经提到了 Javascript 和图像加载,但谷歌会同时做这两件事。我们必须假设现在有几个机器人可以做到这两点,所以这些不再是人类指标。然而,机器人仍然会做的是遵循“隐形”链接。以一种非常隐秘的方式链接到一个页面,我作为用户看不到。如果这被跟踪,我们就有了一个机器人。

      机器人会经常(但并非总是)尊重 robots.txt。用户不关心 robots.txt,我们可以假设任何检索 robots.txt 的人都是机器人。不过,我们可以更进一步,将一个虚拟 CSS 页面链接到 robots.txt 排除的页面。如果我们的普通 CSS 已加载但我们的虚拟 CSS 没有加载,那么它肯定是一个机器人。您必须按 IP 构建(可能是内存中的)负载表并执行不包含在匹配中,但这应该是一个非常可靠的说明。

      所以,要使用所有这些:通过 ip 地址维护一个机器人数据库表,可能有时间戳限制。添加任何跟随你的隐形链接的东西,添加任何加载“真实”CSS但忽略robots.txt CSS的东西。也可以添加所有 robots.txt 下载器。在最后一步过滤用户代理字符串,并考虑使用它来进行快速统计分析,看看这些方法在识别我们知道是机器人的事物方面的效果如何。

      【讨论】:

      • 我不喜欢 save IP address 部分
      • @JeffFerland 在大规模 NSA 间谍活动中,我们需要完全不保存 IP 的可信站点
      • 大约 2% 的人口是盲人。在老年人中,这一比例上升到约 6%。盲人经常使用不加载图像、样式表或 JavaScript 的浏览器上网。如果您的网站对盲人感兴趣,请不要在分析日志文件时忘记它们。谢谢。
      【解决方案7】:

      您可以排除来自同时请求robots.txt 的用户代理的所有请求。所有表现良好的机器人都会提出这样的请求,但不良机器人会逃脱检测。

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

      因此,这种 did-they-request-robots.txt 方法当然不会提供 100% 无懈可击的结果,但它可能会提供一些启发式方法来输入完整的解决方案。

      【讨论】:

        【解决方案8】:

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

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

        希望对您有所帮助, 瑞光

        【讨论】:

        【解决方案9】:

        先决条件 - 已设置引荐来源网址

        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 日志的引用者的哈希值应该与图像名称相符

        【讨论】:

        • 这可能会引起很多(尽管我认为,不是所有的机器人),并教会了我一些关于自定义日志记录的知识。 +1 谢谢!
        【解决方案10】:

        使用 javascript 记录鼠标移动和滚动。您可以从记录的数据中判断它是人类还是机器人。除非机器人真的非常复杂并且模仿人类鼠标的移动。

        【讨论】:

        • 我喜欢这个,但是它不会捕捉到访问和离开的人,或者没有打开JS。
        【解决方案11】:

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

        程序化解决方案行不通:看看PARRY Encounters the DOCTOR 时会发生什么

        这两个“角色”都是 70 年代在人工智能研究过程中编写的“聊天”机器人:看看他们能在多长时间内愚弄一个真实的人,让他们认为他们也是一个人。 PARRY 角色被建模为偏执型精神分裂症患者,而 THE DOCTOR 则被建模为刻板的心理治疗师。

        这里是some more background

        【讨论】:

        • 来自问题(半岁,顺便说一句):To clarify: I'm not looking to block bots
        • 我只是在开玩笑。我认为人们可能会喜欢 PARRY 和 DOCTOR。这很有趣,尤其是它以 RFC 的形式发布。
        【解决方案12】:

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

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

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

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

        【讨论】:

        • 请参阅我在上述问题中的说明。
        • =?对不起,误会了。您可以尝试我在我的站点上设置的另一个选项:创建一个具有硬/奇怪名称​​的非链接网页,并记录对该页面的访问。此页面的大多数访问者(如果不是全部)都是机器人,这样您就可以动态创建机器人列表。
        • 好主意,以前没听说过! :)
        • 你可以称之为蜜罐:slightlyshadyseo.com/index.php/…
        • 我称之为 HoneyPot www.magentaderek.com/guestbook/
        【解决方案13】:

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

        当然,这不是绝对可靠的,特别是如果您有很多人到达并“点击关闭”,那么这对您来说并不是一个好的统计数据,或者如果您的 cookie 关闭的人占主导地位(在在我们的案例中,如果没有启用会话 cookie,他们将无法使用我们的 [购物车] 网站)。

        从我们的一位客户那里获取数据,我们发现每天的单次会话计数无处不在 - 每天都有不同的数量级;但是,如果我们每天从多页面会话中减去 1,000,那么我们将得到一个该死的接近线性的比率,即每个下达的订单 4 个多页面会话/每个篮子两个会话。我真的不知道每天另外 1,000 个多页会话是什么!

        【讨论】:

          【解决方案14】:

          在您跟踪的页面中放置一个 1x1 的 gif。如果已加载,则它可能是浏览器。如果它没有加载,它可能是一个脚本。

          【讨论】:

          • 这也是一个聪明的主意。会考虑这一点,也许与其他人结合起来。
          • 我们在每个页面上都这样做(带有页面日志条目ID的参数,并使用它来建立/记录“渲染时间”)
          • 许多机器人索引图像以及 HTML。
          • 盲人不加载图片。
          【解决方案15】:

          最简单的方法是检查他们的用户代理中是否包含“bot”或“spider”。Most do

          【讨论】:

          • 嗯。能这么容易吗?但是,也有像 wget 或 getleft 这样的用户代理也很容易识别。仍然 - +1
          • 合法的可以。坏的(例如,电子邮件收割机)只会从网络浏览器中劫持用户代理字符串。
          • 那些可能不想让你知道他们是机器人的人。
          猜你喜欢
          • 1970-01-01
          • 2017-08-31
          • 1970-01-01
          • 1970-01-01
          • 2018-06-05
          • 2012-06-18
          • 2012-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多