检测“隐形”网络爬虫

Posted

技术标签:

【中文标题】检测“隐形”网络爬虫【英文标题】:Detecting 'stealth' web-crawlers 【发布时间】:2010-09-18 23:48:07 【问题描述】:

有哪些选项可以检测不想被检测到的网络爬虫?

(我知道列表检测技术可以让聪明的隐形爬行者程序员制作出更好的蜘蛛,但我认为无论如何我们都无法阻止聪明的隐形爬行者,只有那些犯错误的。 )

我说的不是 googlebot 和 Yahoo! 等优秀的爬虫。啜饮。 我认为机器人很好:

    在用户代理字符串中将自己标识为机器人 读取 robots.txt(并遵守它)

我说的是爬虫,隐藏在普通用户代理后面,使用我的带宽,从不给我任何回报。

有一些活板门可以构造更新列表(感谢 Chris,gs)

    添加仅在 robots.txt 中列出(标记为不允许)的目录, 添加不可见链接(可能标记为 rel="nofollow"?), style="显示:无;"在链接或父容器上 放置在另一个具有更高 z-index 的元素下方 检测谁不了解 CapitaLiSaTioN, 检测谁尝试发布回复但始终未能通过验证码。 检测对仅 POST 资源的 GET 请求 检测请求之间的间隔 检测请求页面的顺序 检测谁(始终)通过 http 请求 https 资源 检测谁不请求图像文件(这与已知支持图像的浏览器的用户代理列表结合起来效果非常好)

“好”和“坏”机器人都会触发一些陷阱。 您可以将它们与白名单结合起来:

    触发陷阱 请求robots.txt? 它不会触发另一个陷阱,因为它服从了robots.txt

这里还有一个重要的事情是: 请考虑使用屏幕阅读器的盲人:为人们提供与您联系的方式,或解决(非图像)验证码以继续浏览。

有哪些方法可以自动检测网络爬虫试图将自己伪装成普通人类访问者。

更新 问题不是:我如何捕获每个爬虫。 问题是:我怎样才能最大限度地检测到爬虫。

有些蜘蛛真的很厉害,居然能解析理解html、xhtml、css javascript、VB脚本等... 我没有幻想:我无法打败他们。

但是,您会惊讶于某些爬虫是多么愚蠢。最好的愚蠢示例(在我看来)是:在请求之前将所有 URL 转换为小写。

还有一大堆爬虫“不够好”,无法避开各种活板门。

【问题讨论】:

【参考方案1】:

不久前,我与一家小型托管公司合作,帮助他们实施解决方案。我开发的系统检查了来自任何给定 IP 地址的过度活动的 Web 服务器日志,并发布了防火墙规则来阻止违规者。它包括基于http://www.iplists.com/ 的 IP 地址/范围白名单,然后通过检查声称的用户代理字符串根据需要自动更新,如果客户端声称是合法蜘蛛但不在白名单上,它执行 DNS/反向-DNS 查找以验证源 IP 地址是否与声称的机器人所有者相对应。作为故障保险,这些操作已通过电子邮件报告给管理员,并附有将地址列入黑/白名单的链接,以防评估不正确。

我已经 6 个月左右没有与那个客户交谈了,但是,我上次听说,系统运行得非常有效。

支点:如果您正在考虑使用基于命中率限制的类似检测系统,请务必使用至少一分钟(最好至少五分钟)的总计。我看到很多人在谈论这类计划,他们希望阻止任何在一秒钟内点击次数超过 5-10 的人,这可能会在图片较多的页面上产生误报(除非图片被排除在统计之外)和 当像我这样的人发现他想要阅读所有有趣的网站时会产生误报,因此他会在阅读第一个链接时打开选项卡中的所有链接以在后台加载。

【讨论】:

我发现由于阻止网络爬虫而导致的误报绝对会扼杀网络流量。您基本上是在激怒 99.8% 的用户,以阻止爬虫,这些爬虫可以轻松绕过所描述的这种幼稚的方法。拒绝或阻碍用户访问绝不是一个好主意,因为这会破坏用户对您网站的体验。【参考方案2】:

请参阅 Project Honeypot - 他们正在大规模设置机器人陷阱(并使用 DNSRBL 及其 IP)。

使用棘手的 URL 和 HTML:

<a href="//example.com/"> = http://example.com/ on http pages.
<a href="page&amp;&#x23;hash"> = page& + #hash

在 HTML 中,您可以对 cme​​ts、CDATA 元素、实体等使用大量技巧:

<a href="foo<!--bar-->"> (comment should not be removed)
<script>var haha = '<a href="bot">'</script>
<script>// <!-- </script> <!--><a href="bot"> <!-->

【讨论】:

【参考方案3】:

一个简单的解决方案是创建一个链接并使其不可见

<a href="iamabot.script" style="display:none;">Don't click me!</a>

当然,您应该期望某些查看源代码的人会点击该链接,只是为了了解它的方向。但是您可以向这些用户提供验证码...

当然,有效的爬虫也会跟随链接。但是你不应该实现 rel=nofollow,而是寻找有效爬虫的标志。 (如用户代理)

【讨论】:

除非机器人检查链接的 CSS 属性并且不跟随链接,因为它对人类用户不可见...... 将链接标记为“不要点击我”会更好。如果有人禁用了 CSS(或不支持 CSS),则链接将可见.. 好主意。也许将文本更改为“。”以及与背景相匹配的 css 样式 - 使其对大多数用户不可见?或者,运行一个脚本在 1 秒后隐藏它,让它只对无法将 javascript hide 命令链接到链接的机器人可见? 从 SEO 角度提防黑帽惩罚。【参考方案4】:

您没有列出的一件事,通常用于检测不良爬虫。

点击速度,优秀的网络爬虫会分解他们的点击,这样他们就不会用请求淹没网站。坏人会做以下三件事之一:

    依次点击顺序链接 以某种并行顺序(一次 2 个或更多)点击顺序链接。 以固定间隔点击顺序链接

另外,一些离线浏览程序会占用大量页面,我不确定您要使用什么样的阈值来开始按 IP 地址阻止。

此方法还将捕获镜像程序,如 fmirror 或 wget。

如果机器人随机化时间间隔,您可以检查链接是否以顺序或深度优先方式遍历,或者您可以查看机器人是否正在遍历大量文本(如要阅读的文字) 在太短的时间内。一些网站也限制每小时的请求数。

实际上,我在某个地方听到了一个想法,我不记得在哪里,如果用户获得了太多的数据,以千字节计,他们可以看到一个验证码,要求他们证明他们不是机器人。不过,我从未见过它实现过。

隐藏链接更新

就隐藏链接而言,您可以将一个 div 放在另一个下,使用 CSS(在绘制顺序中将其放在首位)并可能设置 z 顺序。机器人无法忽略这一点,而无需解析所有 javascript 以查看它是否是菜单。在某种程度上,不可见的 DIV 元素中的链接也不能在不解析所有 javascript 的情况下被忽略。

将这个想法付诸实施,可能会显示隐藏元素的未调用 javascript 可能会欺骗一部分 javascript 解析机器人。而且,实施起来也不是很多工作。

【讨论】:

“忽略 JavaScript 意味着你是机器人”方法的主要缺陷:我们中的一些人使用 NoScript 插件。除非我将网站列入白名单并且我很确定自己不是机器人,否则没有网站会在我身上运行 JavaScript。 机器人现在可以执行 Javascript ......看在上帝的份上,现在是 2013 年。所以整个论点就出现了。谁说网络爬虫会按顺序访问网站?另一个巨大的假设。 JavaScript 仅用于显示蜜罐链接。这个想法是机器人解析使蜜罐链接可见的javascript,使它们更有可能跟随链接。然而,对于真正的用户来说,使链接可见的代码永远不会被执行。因此,NoScript 用户以及不随机执行函数的任何人都可以。也就是说,我不确定机器人为什么/如何随机执行代码,如果它正在进行静态分析以确定元素是否可见,那将是一个花哨的机器人。【参考方案5】:

跟上良好的用户代理字符串实际上并不容易。浏览器版本来来去去。通过不同的行为对用户代理字符串进行统计可以揭示有趣的事情。

我不知道这可以自动化到什么程度,但至少这是一件与众不同的事情。

【讨论】:

【参考方案6】:

我听说过一种用于表单的简单机器人检测方法是隐藏输入技术。如果您试图保护表单,请在表单中输入一个看起来完全合法的 id。然后在外部文件中使用 css 来隐藏它。或者,如果您真的很偏执,请设置类似 jquery 的东西来隐藏页面加载时的输入框。如果你做对了,我想机器人很难弄清楚。您知道这些机器人天生就可以填写页面上的所有内容,尤其是如果您为隐藏的输入提供 id="fname" 之类的 id 等。

【讨论】:

如果机器人能够像普通浏览器一样等待 jquery 完成,则不会。这在 00 年代初期会很好用【参考方案7】:

未经测试,但这里有一个不错的用户代理列表,您可以从中制作正则表达式。可以带你去那里的大部分路:

ADSARobot|ah-ha|almaden|aktuelles|Anarchie|amzn_assoc|ASPSeek|ASSORT|ATHENS|Atomz|attach|attache|autoemailspider|BackWeb|Bandit|BatchFTP|bdfetch|big.brother|BlackWidow|bmclient|Boston\ Project|BravoBrian\ SpiderEngine\ MarcoPolo|Bot\ mailto:craftbot@yahoo.com|Buddy|Bullseye|bumblebee|capture|CherryPicker|ChinaClaw|CICC|clipping|Collector|Copier|Crescent|Crescent\ Internet\ ToolPak|Custo|cyberalert|DA$|Deweb|diagem|Digger|Digimarc|DIIbot|DISCo|DISCo\ Pump|DISCoFinder|Download\ Demon|Download\ Wonder|Downloader|Drip|DSurf15a|DTS.Agent|EasyDL|eCatch|ecollector|efp@gmx\.net|Email\ Extractor|EirGrabber|email|EmailCollector|EmailSiphon|EmailWolf|Express\ WebPictures|ExtractorPro|EyeNetIE|FavOrg|fastlwspider|Favorites\ Sweeper|Fetch|FEZhead|FileHound|FlashGet\ WebWasher|FlickBot|fluffy|FrontPage|GalaxyBot|Generic|Getleft|GetRight|GetSmart|GetWeb!|GetWebPage|gigabaz|Girafabot|Go\!Zilla|Go!Zilla|Go-Ahead-Got-It|GornKer|gotit|Grabber|GrabNet|Grafula|Green\ Research|grub-client|Harvest|hhjhj@yahoo|hloader|HMView|HomePageSearch|http\ generic|HTTrack|httpdown|httrack|ia_archiver|IBM_Planetwide|Image\ Stripper|Image\ Sucker|imagefetch|IncyWincy|Indy*Library|Indy\ Library|informant|Ingelin|InterGET|Internet\ Ninja|InternetLinkagent|Internet\ Ninja|InternetSeer\.com|Iria|Irvine|JBH*agent|JetCar|JOC|JOC\ Web\ Spider|JustView|KWebGet|Lachesis|larbin|LeechFTP|LexiBot|lftp|libwww|likse|Link|Link*Sleuth|LINKS\ ARoMATIZED|LinkWalker|LWP|lwp-trivial|Mag-Net|Magnet|Mac\ Finder|Mag-Net|Mass\ Downloader|MCspider|Memo|Microsoft.URL|MIDown\ tool|Mirror|Missigua\ Locator|Mister\ PiX|MMMtoCrawl\/UrlDispatcherLLL|^Mozilla$|Mozilla.*Indy|Mozilla.*NEWT|Mozilla*MSIECrawler|MS\ FrontPage*|MSFrontPage|MSIECrawler|MSProxy|multithreaddb|nationaldirectory|Navroad|NearSite|NetAnts|NetCarta|NetMechanic|netprospector|NetResearchServer|NetSpider|Net\ Vampire|NetZIP|NetZip\ Downloader|NetZippy|NEWT|NICErsPRO|Ninja|NPBot|Octopus|Offline\ Explorer|Offline\ Navigator|OpaL|Openfind|OpenTextSiteCrawler|OrangeBot|PageGrabber|Papa\ Foto|PackRat|pavuk|pcBrowser|PersonaPilot|Ping|PingALink|Pockey|Proxy|psbot|PSurf|puf|Pump|PushSite|QRVA|RealDownload|Reaper|Recorder|ReGet|replacer|RepoMonkey|Robozilla|Rover|RPT-HTTPClient|Rsync|Scooter|SearchExpress|searchhippo|searchterms\.it|Second\ Street\ Research|Seeker|Shai|Siphon|sitecheck|sitecheck.internetseer.com|SiteSnagger|SlySearch|SmartDownload|snagger|Snake|SpaceBison|Spegla|SpiderBot|sproose|SqWorm|Stripper|Sucker|SuperBot|SuperHTTP|Surfbot|SurfWalker|Szukacz|tAkeOut|tarspider|Teleport\ Pro|Templeton|TrueRobot|TV33_Mercator|UIowaCrawler|UtilMind|URLSpiderPro|URL_Spider_Pro|Vacuum|vagabondo|vayala|visibilitygap|VoidEYE|vspider|Web\ Downloader|w3mir|Web\ Data\ Extractor|Web\ Image\ Collector|Web\ Sucker|Wweb|WebAuto|WebBandit|web\.by\.mail|Webclipping|webcollage|webcollector|WebCopier|webcraft@bea|webdevil|webdownloader|Webdup|WebEMailExtrac|WebFetch|WebGo\ IS|WebHook|Webinator|WebLeacher|WEBMASTERS|WebMiner|WebMirror|webmole|WebReaper|WebSauger|Website|Website\ eXtractor|Website\ Quester|WebSnake|Webster|WebStripper|websucker|webvac|webwalk|webweasel|WebWhacker|WebZIP|Wget|Whacker|whizbang|WhosTalking|Widow|WISEbot|WWWOFFLE|x-Tractor|^Xaldon\ WebSpider|WUMPUS|Xenu|XGET|Zeus.*Webster|Zeus [NC]

取自: http://perishablepress.com/press/2007/10/15/ultimate-htaccess-blacklist-2-compressed-version/

【讨论】:

【参考方案8】:

您还可以查看推荐。没有推荐可以引起机器人怀疑。错误的推荐意味着它肯定不是浏览器。

添加不可见链接(可能标记为 rel="nofollow"?),

* style="display: none;" on link or parent container
* placed underneath another element with higher z-index

我不会那样做的。您最终可能会被谷歌列入黑帽 SEO 的黑名单 :)

【讨论】:

究竟是什么,为什么会让你被列入黑名单?【参考方案9】:

我目前在一家扫描网站以便对其进行分类的公司工作。我们还会检查网站是否存在恶意软件。

根据我的经验,我们的网络爬虫(当然使用 IE 或 Firefox UA 并且不遵守 robots.txt。Duh.)的排名第一的阻止程序是故意托管恶意软件的网站。这很痛苦,因为该站点随后会退回到必须手动加载站点、对其进行分类并检查是否存在恶意软件的人工。

我只是说,by blocking web crawlers you're putting yourself in some bad company.

当然,如果他们非常粗鲁并占用了您的大量带宽,那就另当别论了,因为您有充分的理由。

【讨论】:

很抱歉,如果您运行的爬虫不遵守 robots.txt,则说明您不遵守规则。如果不遵守规则,您自己将自己置身于一个非常糟糕的公司。如果建议执行网站所有者(在 robots.txt 中)设置的规则是不好的做法,那么您就是错误地将问题颠倒过来。您基本上说您不了解内容的合法所有者是谁。 @Jacco:如果寻找恶意软件的爬虫遵守规则,它将永远找不到。与恶意软件作者交谈。 @Jacco:试图阻止不合规爬虫的合法网站的百分比?低于 1%。恶意软件网站尝试?超过 60%。所以,是的,这很可疑。 @Jacco 实际上不,如果网络上的内容是公开的,则没有所有者。在没有手动复制和粘贴的情况下这样做的人应该受到奖励而不是惩罚。这整个版权概念需要在互联网上废除。只有创造性的创新和信任才能创造价值并值得人们关注,而不是受到不透明法律面纱的威胁。 所有这些异常值都表明运营该网站的人在网站上投入了大量时间和思想,并且他们具有一定程度的技术技能。所以当然排除了大部分钟形曲线。【参考方案10】:

人们一直在使用广泛的爬虫,而不是专门为您的网站设计的爬虫。

我编写隐形爬虫,如果它们是单独构建的,那么再多的蜜罐或隐藏链接都不会产生任何影响 - 检测专用爬虫的唯一真正方法是检查连接模式。

最好的系统使用 AI(例如 Linkedin)使用 AI 来解决这个问题。 最简单的解决方案是编写日志解析器来分析 IP 连接并将这些 IP 列入黑名单或提供验证码,至少是暂时的。

例如 如果每 2 秒看到一次 IP X 连接到 foo.com/cars/*.html 而不是任何其他页面 - 这很可能是机器人或饥饿的高级用户。

另外,还有各种 javascript 挑战可以起到保护作用(例如 Cloudflare 的反机器人系统),但这些挑战很容易解决,您可以编写一些自定义的内容,这可能足以阻止爬虫的努力。

但是,您必须提出一个问题,您是否愿意误报合法用户并为他们带来不便,以防止机器人流量。保护公共数据是一个不可能的悖论。

【讨论】:

【参考方案11】:

简短的回答:如果中级程序员知道他在做什么,您将无法在不影响真实用户的情况下检测到爬虫。公开您的信息,您将无法抵御爬虫……这就像第一修正案一样:)

【讨论】:

以上是关于检测“隐形”网络爬虫的主要内容,如果未能解决你的问题,请参考以下文章

用python写网络爬虫 -从零开始 1 编写第一个网络爬虫

《python3网络爬虫开发实战》--模拟登陆

用python零基础写爬虫--编写第一个网络爬虫

爬虫需要什么HTTP代理

爬虫需要什么HTTP代理

一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程