提问人:Pekka 提问时间:11/12/2009 最后编辑:Pekka 更新时间:2/1/2019 访问量:21657
将机器人与人类访客区分开来以获取统计数据?
Tell bots apart from human visitors for stats?
问:
我希望推出我自己的简单网络统计脚本。
据我所知,路上唯一的主要障碍是将人类访客与机器人区分开来。我希望有一个我不需要定期维护的解决方案(即我不想使用与机器人相关的用户代理更新文本文件)。
是否有任何开放服务可以做到这一点,就像 Akismet 对垃圾邮件所做的那样? 或者是否有专门用于识别蜘蛛和机器人并提供频繁更新的 PHP 项目?
澄清一下:我不想阻止机器人。我不需要 100% 防水的结果。我只是 想从我的统计数据中排除尽可能多的人。在 知道解析 user-Agent 是一个 选项,但将模式保持为 解析是一项艰巨的工作。我 问题是有没有 执行此操作的项目或服务 已经。
赏金:我想我会把它作为这个话题的参考问题。最佳/最原始/技术上最可行的贡献将获得赏金金额。
答:
最简单的方法是检查他们的用户代理是否包含“bot”或“spider”。大多数人都这样做。
评论
=?对不起,误会了。您可以尝试我在我的网站上设置的另一个选项:创建一个具有硬/奇怪名称的非链接网页,并记录对该页面的访问。此页面的大多数(如果不是全部)访问者都是机器人,这样您就可以动态创建机器人列表。
原始答案如下(获得负面评价!
告诉机器人的唯一可靠方法 来自人类的是[CAPTCHAS][1]。您可以 如果适合您,请使用 [reCAPTCHA][2]。
[1]:http://en.wikipedia.org/wiki/Captcha
[2]:http://recaptcha.net/
评论
编辑(10 年后):正如 Lukas 在评论框中所说,今天几乎所有的爬虫都支持 javascript,所以我删除了一段话,即如果网站是基于 JS 的,大多数机器人将被自动剥离。
您可以关注机器人列表并将其用户代理添加到筛选列表中。
这个用户代理列表也相当不错。只需去除所有 B 即可。
编辑:eSniff 所做的惊人工作在这里“以一种可以更容易查询和解析的形式”列出了上面的列表。robotstxt.org/db/all.txt 每个新机器人都由 robot-id:XXX 定义。你应该能够每周下载一次,并将其解析为你的脚本可以使用的东西“,就像你可以在他的评论中读到的那样。
希望对您有所帮助!
评论
在您的页面中有一个 1x1 的 gif 供您跟踪。如果加载,那么它很可能是浏览器。如果它没有被加载,它很可能是一个脚本。
评论
考虑一个伪装成 CSS 背景图像的 PHP 统计脚本(给出正确的响应标头 - 至少是内容类型和缓存控制 - 但写出一个空图像)。
一些机器人解析 JS,但肯定没有人加载 CSS 图像。与JS一样,一个陷阱是,您将排除基于文本的浏览器,但这还不到万维网人口的1%。此外,禁用 CSS 的客户端肯定比禁用 JS 的客户端(手机)少。
为了让更高级的机器人(Google、Yahoo 等)将来可能会抓取它们(非例外)情况更加可靠,请禁止 CSS 图像的路径(无论如何,更好的机器人都会尊重)。robots.txt
评论
与其试图维护一个不可能长的蜘蛛用户代理列表,不如寻找暗示人类行为的东西。其原则是,我们将会话计数分为两个数字:单页会话数和多页会话数。我们删除一个会话 cookie,并使用它来确定多页会话。我们还删除了一个持久的“计算机 ID”cookie;返回用户(找到计算机 ID Cookie)被视为多页会话,即使他们只查看该会话中的一个页面。您可能具有暗示“人类”访问者的其他特征 - 例如,推荐人是 Google(尽管我相信 MS Search 机器人睫毛膏作为标准的 UserAgent 使用现实关键字引用,以检查网站是否显示不同的内容 [给他们的机器人],并且这种行为看起来很像人类!
当然,这并不是不可思议的,特别是如果你有很多人到达并“点击关闭”,这对你来说不是一个好的统计数据,如果你关闭了cookie的人占多数(在我们的例子中,他们将无法使用我们的[购物车]网站没有启用会话cookie)。
从我们的一位客户那里获取数据,我们发现每天的单次会话计数到处都是——每天都有数量级的不同;但是,如果我们每天从多页会话中减去 1,000 个,那么每个订单下达 4 个多页会话/每个篮子两个会话的近乎线性的比率。我真的不知道每天其他 1,000 个多页会话是什么!
我很惊讶没有人建议实施图灵测试。只需在另一端与人类建立一个聊天框即可。
编程解决方案是行不通的:看看当 PARRY 遇到 DOCTOR 时会发生什么
这两个“角色”都是在 70 年代的 AI 研究过程中编写的“喋喋不休”机器人:看看它们能欺骗一个真实的人多久,让他们认为他们也是一个人。PARRY 角色被塑造成一个偏执型精神分裂症患者,而 THE DOCTOR 则被塑造成一个刻板的心理治疗师。
这里有一些背景
评论
To clarify: I'm not looking to block bots
使用 javascript 记录鼠标移动和滚动。您可以从记录的数据中判断它是人类还是机器人。除非机器人真的非常复杂,并且模仿人类的鼠标动作。
评论
先决条件 - 设置反向链接
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 日志中引用者的哈希值应与图像名称一致
评论
我目前使用 AWstats 和 Webalizer 来监控 Apasce2 的日志文件,到目前为止,它们一直做得很好。如果你愿意,你可以看看他们的源代码,因为它是一个开源项目。
您可以在 http://awstats.sourceforge.net 获取源代码,或者查看常见问题解答 http://awstats.sourceforge.net/docs/awstats_faq.html
希望能有所帮助, 雷光
评论
您可以排除来自用户代理的所有请求,该用户代理也请求 。所有表现良好的机器人都会发出这样的请求,但坏机器人会逃避检测。robots.txt
您还会遇到误报的问题 - 作为一个人类,我在浏览器中阅读机器人.txt并不常见,但我当然可以。为避免这些错误地显示为机器人,您可以将一些常见的浏览器用户代理列入白名单,并将它们视为始终是人类。但这只会变成为浏览器维护用户代理列表,而不是为机器人维护用户代理列表。
因此,这种“他们请求机器人.txt”方法肯定不会提供100%无懈可击的结果,但它可能会提供一些启发式方法,以提供完整的解决方案。
人类和机器人会做类似的事情,但机器人会做人类不会做的事情。让我们试着识别这些东西。在我们研究行为之前,让我们接受 RayQuang 的评论是有用的。如果访客具有机器人的用户代理字符串,则可能是机器人。我无法想象任何人将“Google Crawler”(或类似的东西)作为 UA,除非他们正在努力破坏某些东西。我知道您不想手动更新列表,但自动拉取该列表应该很好,即使它在接下来的 10 年内保持陈旧,也会有所帮助。
有些人已经提到了 Javascript 和图像加载,但 Google 会两者兼而有之。我们必须假设现在有几个机器人可以同时执行这两个操作,因此这些不再是人类指标。然而,机器人仍然会独特地做,那就是遵循一个“不可见”的链接。以一种非常偷偷摸摸的方式链接到一个页面,我作为用户看不到。如果遵循这一点,我们就有了一个机器人。
机器人通常会(但并非总是)尊重机器人.txt。用户不关心机器人.txt,我们可以假设任何检索机器人.txt的人都是机器人。不过,我们可以更进一步,将虚拟CSS页面链接到被robots.txt排除的页面。如果我们的普通 CSS 被加载,但我们的虚拟 CSS 没有加载,那么它肯定是一个机器人。您必须按 IP 构建(可能是内存中的)负载表,并执行未包含在匹配中,但这应该是一个非常可靠的说明。
因此,要使用所有这些:按 IP 地址维护机器人的数据库表,可能有时间戳限制。添加任何跟随您的不可见链接的内容,添加任何加载“真实”CSS但忽略机器人.txt CSS的内容。也许还可以添加所有机器人.txt下载器。过滤用户代理字符串作为最后一步,并考虑使用它进行快速统计分析,看看这些方法在识别我们知道是机器人的东西方面的作用有多大。
评论
save IP address
检查用户代理会提醒您注意诚实的机器人,但不会提醒垃圾邮件发送者。
要判断哪些请求是由不诚实的机器人发出的,最好的选择(基于这个家伙的有趣研究)是捕捉一个 Javascript 焦点事件 .
如果焦点事件触发,则几乎可以肯定该页面是由人类加载的。
- 编辑:确实,关闭 Javascript 的人不会以人类的身份出现,但这并不是网络用户的很大比例。
- 编辑2:当前的机器人也可以执行Javascript,至少谷歌可以。
评论
我将以下内容用于我的统计/计数器应用程序:
<?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!";
?>
我删除了指向原始代码源的链接,因为它现在重定向到食品应用程序。
评论
现在我们有各种无头浏览器。Chrome、Firefox 或其他将执行您网站上的任何 JS。因此,任何基于 JS 的检测都不起作用。
我认为最自信的方法是跟踪现场行为。如果我要编写一个机器人并想绕过检查,我会用无头 chrome 模拟滚动、鼠标移动、悬停、浏览器历史记录等事件。为了更上一层楼,即使无头 chrome 在请求中添加了一些关于“无头”模式的提示,我也可以分叉 chrome 存储库,进行更改并构建我自己的二进制文件,这些二进制文件不会留下任何痕迹。
我认为这可能是最接近真实检测的答案,如果它是人类的,或者不是访问者的任何行动:
https://developers.google.com/recaptcha/docs/invisible
我不确定这背后的技术,但我相信谷歌做得很好,他们用他们的ML算法分析了数十亿个请求,以检测这种行为是人类行为还是机器人行为。
虽然这是一个额外的 HTTP 请求,但它不会检测到快速退回的访问者,因此需要记住这一点。
评论