将机器人与人类访客分开以获取统计信息?

IT技术 php javascript web-services analytics
2021-02-01 16:22:37

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

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

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

澄清一下我不想阻止机器人。我不需要 100% 防水的结果我只想从我的统计数据中排除尽可能多的内容。知道解析用户代理是一种选择,但维护要解析的模式需要大量工作。我的问题是是否有任何项目或服务已经这样做了。

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

6个回答

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

有些人已经提到了 Javascript 和图像加载,但谷歌会同时做。我们必须假设现在有几个机器人可以同时执行这两项任务,因此这些不再是人类指标。然而,机器人仍将独特地做的是遵循“隐形”链接。以一种非常狡猾的方式链接到我作为用户无法看到的页面。如果遵循这一点,我们就有了一个机器人。

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

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

@JeffFerland 在 NSA 进行大规模间谍活动时,我们需要完全不保存 IP 的受信任站点
2021-03-27 16:22:37
大约 2% 的人口是盲人。在老年人中,这一比例上升到约 6%。盲人经常使用不加载图像、样式表或 JavaScript 的浏览器上网。如果您的网站对盲人有任何兴趣,请在分析日志文件时不要忘记它们。谢谢你。
2021-04-07 16:22:37
我不喜欢这个save IP address部分
2021-04-13 16:22:37

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

合法的人这样做。坏的(例如,电子邮件收集器)只会从 Web 浏览器劫持用户代理字符串。
2021-03-15 16:22:37
唔。有那么容易吗?但是,还有像 wget 或 getleft 这样的用户代理也很容易识别。仍然 - +1
2021-03-31 16:22:37
而那些不希望你知道他们无论如何都是机器人的人。
2021-04-08 16:22:37

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

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

看看这个机器人列表。

这个用户代理列表也很不错。只需去掉所有的 B就可以了。

编辑:通过完成惊人的工作eSniff此上面的列表中可以查询和分析更容易形式robotstxt.org/db/all.txt每一个新的机器人由机器人-ID定义:XXX你应该可以。每周下载一次并将其解析为您的脚本可以使用的内容“就像您可以在他的评论中阅读的那样。

希望能帮助到你!

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

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

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

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

@Kristen:如果您添加无缓存标头,则不会。
2021-03-24 16:22:37
是否可以在后续访问时缓存 CSS 背景图像而不重新请求?
2021-03-26 16:22:37
如果您将统计信息存储在数据库中,这是否需要两个单独的数据库连接?
2021-04-03 16:22:37

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

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

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