检测“隐形”网络爬虫

时间:2008-10-24 11:46:52

标签: web-crawler

有哪些选项可以检测不希望被检测到的网页抓取工具?

(我知道列表检测技术将允许智能隐形爬虫程序员制作更好的蜘蛛,但我认为我们无论如何都不能阻止智能隐形爬虫,只会犯错误。 )

我不是在谈论像googlebot和Yahoo!这样漂亮的抓取工具。啜食。 我认为机器人很好,如果它:

  1. 将自己标识为用户代理字符串中的机器人
  2. 读取robots.txt(并遵守它)
  3. 我正在谈论糟糕的抓取工具,躲在普通用户代理后面,使用我的带宽,从不给我任何回报。

    有一些陷阱可以构建更新列表(感谢Chris,gs)

    1. 在robots.txt中添加仅列出(标记为禁止)的目录,
    2. 添加不可见的链接(可能标记为rel =“nofollow”?),
      • style =“display:none;”在链接或父容器上
      • 放置在具有更高z-index
      • 的另一个元素下面
    3. 检测谁不理解大写,
    4. 检测谁试图发布回复,但始终使Captcha失败。
    5. 检测对仅POST资源的GET请求
    6. 检测请求之间的间隔
    7. 检测所请求页面的顺序
    8. 检测谁(一致地)通过http
    9. 请求https资源
    10. 检测谁没有请求图像文件(这与已知图像浏览器的用户代理列表相结合,效果出奇的好)
    11. 一些陷阱将由“好”和“坏”机器人触发。 你可以把它们与白名单结合起来:

      1. 触发陷阱
      2. 请求robots.txt
      3. 它不会触发另一个陷阱,因为它服从robots.txt
      4. 另一个重要的事情是:
        请考虑盲人使用屏幕阅读器:给人们一种联系方式,或解决(非图像)Captcha继续浏览。

        有哪些方法可以自动检测尝试将自己屏蔽为普通人类访问者的网络抓取工具。

        更新
        问题不是:如何捕获每个爬虫。问题是:如何最大限度地发现爬虫的机会。

        有些蜘蛛真的很好,实际上解析和理解html,xhtml,css javascript,VB脚本等...... 我没有幻想:我无法击败他们。

        然而,你会惊讶于一些爬虫是多么愚蠢。愚蠢的最好例子(在我看来)是:在请求之前将所有URL强制转换为小写。

        然后有一大堆爬虫只是“不够好”以避免各种陷阱。

11 个答案:

答案 0 :(得分:15)

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

我在6个月左右的时间里没有和那个客户谈过,但是,最后我听说,系统的表现非常有效。

侧点:如果您正在考虑基于命中率限制执行类似的检测系统,请务必使用至少一分钟(最好至少五分钟)的总计。我看到很多人都在谈论这些类型的方案,他们希望阻止任何一秒钟达到5-10次点击率的人,这可能会在图像繁重的页面上产生误报(除非图像从计数中排除)和当像我这样的人找到一个他想要阅读的有趣网站时,会产生误报,所以他打开了标签中的所有链接,在他读取第一个链接时加载到后台。

答案 1 :(得分:14)

参见Project Honeypot - 他们正在大规模设置僵尸陷阱(并且DNSRBL及其IP)。

使用棘手的网址和HTML:

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

在HTML中,你可以使用大量的注释,CDATA元素,实体等技巧:

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

答案 2 :(得分:9)

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

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

当然,您应该期待一些查看源代码的人会关注该链接,以了解它所处的位置。但是你可以为这些用户提供验证码......

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

答案 3 :(得分:6)

您没有列出的一件事,通常用于检测不良抓取工具。

命中速度,良好的网络抓取工具将打破他们的命中,因此他们不会使请求的网站泛滥。坏人会做三件事之一:

  1. 一个接一个地点击顺序链接
  2. 以某个并列序列命中顺序链接(一次2个或更多)。
  3. 以固定间隔点击顺序链接
  4. 此外,一些离线浏览程序会淹没多个页面,我不确定您想要使用什么样的阈值,以便通过IP地址开始阻止。

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

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

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

    隐藏链接的更新

    就隐藏链接而言,你可以将一个div放在另一个下面,用CSS(将它放在绘图顺序中)并可能设置z顺序。机器人不能忽略它,不解析你的所有JavaScript,看它是否是一个菜单。在某种程度上,如果没有机器人解析所有的javascript,也无法忽略隐形DIV元素内的链接。

    将这个想法完成后,可能会显示隐藏元素的未经调用的javascript可能会欺骗javascript解析机器人的子集。而且,实施起来并不是很多。

答案 4 :(得分:4)

我听说过一种简单的机器人检测方法是隐藏输入技术。如果您正在尝试保护表单,请在表单中输入一个看起来完全合法的ID。然后在外部文件中使用css来隐藏它。或者,如果你真的是偏执狂,设置类似jquery的东西来隐藏页面加载时的输入框。如果你这样做我认为机器人很难弄明白。你知道那些机器人有自然填充页面上的所有内容,特别是如果你给你的隐藏输入id为id =“fname”等。

答案 5 :(得分:3)

未经测试,但这里有一个很好的用户代理列表,你可以用它来制作正则表达式。可以帮助你完成大部分工作:

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/

答案 6 :(得分:2)

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

我不知道这可以自动化多远,但至少它是一个与众不同的东西。

答案 7 :(得分:1)

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

根据我的经验,我们的网络抓取工具的头号拦截器(当然使用IE或Firefox UA并且不遵守robots.txt。Duh。)是故意托管恶意软件的网站。这是一个痛苦,因为该网站然后回归到必须手动加载网站,对其进行分类并检查它是否恶意软件的人。

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

当然,如果他们非常粗鲁并且吸收了大量的带宽,那么这是一个不同的故事,因为那时你有充分的理由。

答案 8 :(得分:1)

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

  

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

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

我不会这样做。你可以最终被谷歌黑名单SEO列入黑名单:)

答案 9 :(得分:1)

人们会继续关注广泛的搜寻器,而不是专门针对您的网站的搜寻器。

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

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

例如
如果每2秒看到一次IP X连接到foo.com/cars/*.html,但没有其他任何页面,则很可能是机器人或饥饿的超级用户。

或者,有各种各样的JavaScript挑战可以作为保护(例如Cloudflare的反机器人系统),但是这些挑战很容易解决,您可以编写自定义内容,并且可能具有威慑力,这对于爬虫来说并不值得。

但是,您必须问一个问题,您是否愿意假冒合法用户并给他们带来不便,以防止漫游器流量。保护公共数据是不可能的悖论。

答案 10 :(得分:-1)

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