将机器人与人类访客区分开来以获取统计数据?

Tell bots apart from human visitors for stats?

提问人:Pekka 提问时间:11/12/2009 最后编辑:Pekka 更新时间:2/1/2019 访问量:21657

问:

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

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

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

澄清一下:我不想阻止机器人。我不需要 100% 防水的结果。我只是 想从我的统计数据中排除尽可能多的人。在 知道解析 user-Agent 是一个 选项,但将模式保持为 解析是一项艰巨的工作。我 问题是有没有 执行此操作的项目或服务 已经。

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

PHP JavaScript Web 服务 分析

评论

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

答:

21赞 Yacoby 11/12/2009 #1

最简单的方法是检查他们的用户代理是否包含“bot”或“spider”。大多数人都这样做

评论

0赞 Pekka 11/12/2009
嗯,有那么容易吗?但是,像 wget 或 getleft 这样的用户代理也很好识别。仍然 - +1
4赞 Bob Kaufman 11/12/2009
合法的会这样做。坏的(例如,电子邮件收集器)只会从 Web 浏览器劫持用户代理字符串。
1赞 Svish 11/12/2009
而那些不这样做的人可能不想让你知道他们无论如何都是一个机器人。
0赞 Ast Derek 11/12/2009 #2

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

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

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

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

评论

0赞 Pekka 11/12/2009
请参阅我在上面的问题中的澄清。
0赞 Ast Derek 11/12/2009
=?对不起,误会了。您可以尝试我在我的网站上设置的另一个选项:创建一个具有硬/奇怪名称的非链接网页,并记录对该页面的访问。此页面的大多数(如果不是全部)访问者都是机器人,这样您就可以动态创建机器人列表。
0赞 Pekka 11/12/2009
好主意,以前没听说过!:)
0赞 Frank Farmer 11/12/2009
你可以称它为蜜罐:slightlyshadyseo.com/index.php/......
1赞 Ast Derek 11/12/2009
我称它为 HoneyPot www.magentaderek.com/guestbook/
13赞 Frankie 11/12/2009 #3

编辑(10 年后):正如 Lukas 在评论框中所说,今天几乎所有的爬虫都支持 javascript,所以我删除了一段话,即如果网站是基于 JS 的,大多数机器人将被自动剥离。

您可以关注机器人列表并将其用户代理添加到筛选列表中。

看看这个机器人列表。

这个用户代理列表也相当不错。只需去除所有 B 即可

编辑:eSniff 所做的惊人工作在这里以一种可以更容易查询和解析的形式”列出了上面的列表。robotstxt.org/db/all.txt 每个新机器人都由 robot-id:XXX 定义。你应该能够每周下载一次,并将其解析为你的脚本可以使用的东西“,就像你可以在他的评论中读到的那样。

希望对您有所帮助!

评论

0赞 Yacoby 11/12/2009
根据你所瞄准的市场,很多用户也没有。许多 firefox 用户倾向于使用 NoScript。
15赞 Frankie 11/12/2009
NoScript 还意味着,没有 StackOverflow,没有 Gmail、Reader、Maps、Facebook、YouTube 等等......我一直使用 NoScript 来检查我自己的网站是否有蜘蛛和机器人,但现在使用 NoScript 没有多大意义。只是我的意见。
5赞 Frankie 6/21/2010
@Col. 就像 Jeff 说的,总是试图少吸一点......昨天重读它,虽然逗号会让它更容易阅读!:)
1赞 eSniff 12/23/2010
顺便说一句,这是上面的 Robotstxt 列表,但其形式可以更轻松地查询和解析。robotstxt.org/db/all.txt每个新机器人都由 robot-id:XXX 定义。您应该能够每周下载一次,并将其解析为脚本可以使用的内容。
1赞 Lukas Liesis 1/30/2019
这个答案肯定已经过时了。现在,越来越多的机器人正在使用像无头 chrome 这样的东西,它会执行所有事情,就像人类使用它时 chrome 一样。它于 2017 年年中推出。此外,Firefox可以在无头模式下运行,可能其他浏览器已经或将来会运行。JS不是问题。太多的网站依赖 JS 来渲染任何东西。机器人知道这一点。
0赞 neoneye 11/12/2009 #4

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

评论

0赞 Pekka 11/12/2009
这也是一个聪明的主意。会考虑这一点,也许与其他人结合。
1赞 Kristen 11/12/2009
我们在每个页面上执行此操作(使用页面日志条目 ID 的参数,并使用它来建立/记录“渲染时间”)
2赞 RickNZ 12/26/2009
许多机器人索引图像以及 HTML。
0赞 12/22/2018
盲人不会加载图像。
11赞 BalusC 11/12/2009 #5

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

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

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

评论

1赞 Kristen 11/12/2009
CSS 背景图像是否会在后续访问时缓存并且不会重新请求?
0赞 BalusC 11/12/2009
@Kristen:如果添加无缓存标头,则不会。
0赞 David D 1/28/2015
如果您将统计信息存储在数据库中,这是否需要两个单独的数据库连接?
3赞 Kristen 11/12/2009 #6

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

当然,这并不是不可思议的,特别是如果你有很多人到达并“点击关闭”,这对你来说不是一个好的统计数据,如果你关闭了cookie的人占多数(在我们的例子中,他们将无法使用我们的[购物车]网站没有启用会话cookie)。

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

-1赞 MTS 6/20/2010 #7

我很惊讶没有人建议实施图灵测试。只需在另一端与人类建立一个聊天框即可。

编程解决方案是行不通的:看看当 PARRY 遇到 DOCTOR 时会发生什么

这两个“角色”都是在 70 年代的 AI 研究过程中编写的“喋喋不休”机器人:看看它们能欺骗一个真实的人多久,让他们认为他们也是一个人。PARRY 角色被塑造成一个偏执型精神分裂症患者,而 THE DOCTOR 则被塑造成一个刻板的心理治疗师。

这里有一些背景

评论

1赞 Your Common Sense 6/20/2010
从问题(半岁,顺便说一句):.To clarify: I'm not looking to block bots
0赞 MTS 6/20/2010
我只是在开玩笑。我以为人们可能会喜欢 PARRY 和 DOCTOR。这很搞笑,尤其是它是作为 RFC 发布的。
2赞 neoneye 9/11/2010 #8

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

评论

0赞 DampeS8N 12/23/2010
我喜欢这个,但是它不会抓住访问和离开的人类,或者没有打开 JS。
1赞 ajreal 12/17/2010 #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 日志中引用者的哈希值应与图像名称一致

评论

0赞 Pekka 12/23/2010
这可能会捕获很多(尽管我认为,不是所有的机器人)并教会了我一些关于自定义日志记录的知识。+1 谢谢!
4赞 Rayhaan Jaufeerally 12/19/2010 #10

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

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

希望能有所帮助, 雷光

评论

1赞 Day 12/21/2010
awstats 用于从用户代理字符串中查找机器人的 1670 行文件 awstats.cvs.sourceforge.net/viewvc/awstats/awstats/wwwroot/...可怕
0赞 MikeAinOz 12/23/2010
我和你在一起,Ray,AWstats 对我来说很好
0赞 Day 12/21/2010 #11

您可以排除来自用户代理的所有请求,该用户代理也请求 。所有表现良好的机器人都会发出这样的请求,但坏机器人会逃避检测。robots.txt

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

因此,这种“他们请求机器人.txt”方法肯定不会提供100%无懈可击的结果,但它可能会提供一些启发式方法,以提供完整的解决方案。

72赞 Jeff Ferland 12/21/2010 #12

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

有些人已经提到了 Javascript 和图像加载,但 Google 会两者兼而有之。我们必须假设现在有几个机器人可以同时执行这两个操作,因此这些不再是人类指标。然而,机器人仍然会独特地做,那就是遵循一个“不可见”的链接。以一种非常偷偷摸摸的方式链接到一个页面,我作为用户看不到。如果遵循这一点,我们就有了一个机器人。

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

因此,要使用所有这些:按 IP 地址维护机器人的数据库表,可能有时间戳限制。添加任何跟随您的不可见链接的内容,添加任何加载“真实”CSS但忽略机器人.txt CSS的内容。也许还可以添加所有机器人.txt下载器。过滤用户代理字符串作为最后一步,并考虑使用它进行快速统计分析,看看这些方法在识别我们知道是机器人的东西方面的作用有多大。

评论

1赞 Daniel W. 10/2/2013
我不喜欢这个部分save IP address
4赞 Daniel W. 10/4/2013
@JeffFerland在大规模 NSA 间谍活动的时候,我们需要根本不保存 IP 的受信任站点
0赞 12/22/2018
大约2%的人口是盲人。在老年人中,这一比例上升到6%左右。盲人经常使用不加载图像、样式表或 JavaScript 的浏览器上网。如果您的网站对盲人有任何兴趣,请在分析日志文件时不要忘记它们。谢谢。
5赞 TehShrike 12/23/2010 #13

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

要判断哪些请求是由不诚实的机器人发出的,最好的选择(基于这个家伙的有趣研究)是捕捉一个 Javascript 焦点事件 .

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

评论

0赞 Lukas Liesis 1/30/2019
Headless Chrome 将毫无问题地执行 Focus。不会保护。
9赞 chimeraha 2/10/2014 #14

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

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

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

评论

0赞 Zortext 10/28/2023
恶意机器人永远不会识别他们自己。现在有很多这种类型的机器人
2赞 Lukas Liesis 1/30/2019 #15

现在我们有各种无头浏览器。Chrome、Firefox 或其他将执行您网站上的任何 JS。因此,任何基于 JS 的检测都不起作用。

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

我认为这可能是最接近真实检测的答案,如果它是人类的,或者不是访问者的任何行动:

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

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

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