反爬虫技术

引言

网站服务器会消耗很多的资源用于给爬虫提供服务,所以一些网站将反爬虫作为网站优化的手段之一;
另外,一些以内容提供为主的网站,会利用反爬虫技术防止网站内容被盗用。

反爬虫技术

以下是总结的一些反爬虫的手段:

通过爬虫的特有行为模式来发现爬虫:(链接并发度,访问频率,访问数据的范围)

  1. 用netstat检查80端口的连接:
    sh netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n
    这行shell可以按照80端口连接数量对来源IP进行排序,这样可以直观的判断出来网页爬虫。一般来说爬虫的并发连接非常高。 直接封锁爬虫所在的C网段地址。这是因为一般爬虫都是运行在托管机房里面,可能在一个C段里面的多台服务器上面都有爬虫,而这个C段不可能是用户宽带上网,封锁C段可以很大程度上解决问题。
  2. 频率限制,每分钟超过N次访问的IP封掉,如3小时访问量超过50次时,弹出验证框,验证内容输入错误,则计入黑名单
  3. 爬虫爬取网页的频率都是比较固定的,不像人去访问网页,中间的间隔时间比较无规则,
    所以我们可以给每个IP地址建立一个时间窗口,记录IP地址最近12次访问时间,每记录一次就滑动一次窗口,比较最近访问时间和当前时间,
    如果间隔时间很长判断不是爬虫,清除时间窗口,如果间隔不长,就回溯计算指定时间段的访问频率,如果访问频率超过阀值,就转向验证码页面让用户填写验证码
  4. 爬虫一般不抓取css、js等资源文件
  5. 如果是垂直爬虫,往往访问数据具有明显的目的性,如果返现某些IP访问某些数据超过正常频次,且这些这些IP并没有访问其他任何资源,则可以断定是爬虫
  6. 搞个计数器,把特定ip一天内的总次数和每秒内的频率记录下来,达到实时拦截的目的(这个类似淘宝的TMD,用分布式缓存计数,超出规则,要么直接拒绝,要么跳到输入验证码的页面)
  7. 把apache或nginx日志分析和js埋点对比来分析,爬虫请求在无法模拟浏览器请求的时候,无法执行js代码,页面没有埋点,但是这个请求,会在web日志中留下,js有小问题,就是用户请求的时候,如果浏览器有缓存,实际上没有请求服务器端,但是js确埋了一个点,对比分析,效果会好很多

诱捕

比如用一些人类看不到的链接,让爬虫进去,然后封禁对应ip。

使爬虫无法识别内容

是把链接变成其他标签,用js监听点击、键盘等事件,然后跳转,爬虫不具备这样的交互能力,就找不到了。或者全站用ajax,反seo。或者把部分文字变成图片,这是百度反360爬虫的策略,把能破坏语义的高频文字(比如的、是、不等)替换成图片,不影响人类阅读。

利用http请求头部信息

  1. useragent=JavaClient1.6(HttpClient的爬虫)
  2. 同一个IP有使用过多个useragent
  3. 请求是否含有refer:refer表示该请求从哪里跳转而来,很多爬虫没有这个字段
  4. 利用cookie,每次请求重新种一个,下次请求验证这个cookie;或者定时更改cookie

为了避免误伤某些搜索引擎的爬虫,例如将百度等爬虫设置在白名单中,通过hostname检测请求IP是否属于百度

反反爬虫

有矛就有盾:

  1. ip次数限制:每个请求都用代理,还用不同的代理。
  2. 复杂的js交互:用code开浏览器,模拟各种鼠标键盘事件。
  3. 验证码:OCR或者用在线人工打码的服务。
  4. token: 买email地址/买token/使用用户的toke
posted @ 2016-01-11 17:43  OllieO  阅读(3267)  评论(0编辑  收藏  举报