检测"隐形"网络爬虫

Jac*_*cco 107 web-crawler

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

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

我不是在谈论像googlebot和Yahoo!这样的好爬虫.啜食.我认为机器人很好,如果它:

  1. 将自己标识为用户代理字符串中的bot
  2. 读robots.txt(并服从它)

我正在谈论坏的爬虫,躲在普通用户代理后面,使用我的带宽,从不给我任何回报.

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

  1. 添加仅在robots.txt中列出(标记为禁止)的目录,
  2. 添加不可见的链接(可能标记为rel ="nofollow"?),
    • style ="display:none;" 在链接或父容器上
    • 放在另一个具有更高z-index的元素下面
  3. 检测谁不懂大写,
  4. 检测谁试图发布回复但总是失败的验证码.
  5. 检测对仅POST资源的GET请求
  6. 检测请求之间的间隔
  7. 检测请求的页面顺序
  8. 检测谁(一致地)通过http请求https资源
  9. 检测谁没有请求图像文件(这与已知图像功能的浏览器的用户代理列表组合工作惊人的好)

一些陷阱将由"好"和"坏"机器人触发.你可以把它们与白名单结合起来:

  1. 它触发陷阱
  2. 它要求robots.txt
  3. 它不会触发另一个陷阱因为它服从了 robots.txt

另一个重要的事情是:
请考虑盲人使用屏幕阅读器:给人们一种联系方式,或解决(非图像)Captcha继续浏览.

有哪些方法可以自动检测试图将自己屏蔽为正常人类访问者的网络爬虫.

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

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

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

然后有一大堆爬虫只是"不够好",以避免各种陷门.

Dav*_*man 15

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

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

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

  • 我发现由于阻止网络爬虫而导致的误报绝对会杀死网络流量。基本上,您是在惹恼99.8%的用户,这是一种很糟糕的尝试,它阻碍了可以轻松绕过上述简单方法的爬虫。拒绝或阻止用户访问绝对不是一个好主意,因为它破坏了您网站的用户体验。 (5认同)

Kor*_*nel 14

请参阅项目Honeypot - 他们正在大规模设置僵尸陷阱(并且DNSRBL及其IP).

使用棘手的URL和HTML:

<a href="//example.com/"> = http://example.com/ on http pages.
<a href="page&amp;&#x23;hash"> = page& + #hash
Run Code Online (Sandbox Code Playgroud)

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

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


Geo*_*lly 9

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

<a href="iamabot.script" style="display:none;">Don't click me!</a>
Run Code Online (Sandbox Code Playgroud)

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

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


Chr*_*ris 6

你没有列出的一件事,通常用于检测坏的爬虫.

命中速度,良好的网络爬虫将打破他们的命中,所以他们不会泛滥请求的网站.坏人会做三件事之一:

  1. 一个接一个地点击顺序链接
  2. 在一些并行序列中命中顺序链接(一次2个或更多).
  3. 以固定间隔命中顺序链接

此外,一些离线浏览程序会淹没多个页面,我不确定你想要使用什么样的阈值,开始按IP地址阻止.

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

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

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

隐藏链接的更新

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

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

  • "忽略JavaScript意味着你是一个机器人"方法的主要缺陷:我们中的一些人使用NoScript插件.没有网站在我身上运行JavaScript,除非我将网站列入白名单并且我很确定我不是机器人. (16认同)
  • 机器人现在可以执行Javascript ...这是2013年的基督圣经.所以这就是整个论点.谁说网络抓取工具在顺序选择中访问网站?另一个巨大的假设 (2认同)