关于网络爬虫的那些事:干掉伪装的爬虫

在关于网络爬虫的那些事(一)提到,如果爬虫伪装自己的User-Agent信息,就必须寻找新的办法来封杀爬虫了。事实上对网站来说,最大的挑战就是如何准确的甄别一个IP发起的请求,究竟是真实用户访问还是爬虫访问呢?

先说点题外话,在很多年以前(2000年),我就做过网站流量统计系统。主流的网站流量统计系统不外乎两种策略:一种策略是在网页里面嵌入一段js,这段js会向特定的统计服务器发送请求的方式记录访问量;另一种策略是直接分析服务器日志,来统计网站访问量。

在理想的情况下,嵌入js的方式统计的网站流量应该高于分析服务器日志,这是因为用户浏览器会有缓存,不一定每次真实用户访问都会触发服务器的处理。但实际情况是,分析服务器日志得到的网站访问量远远高于嵌入js方式,极端情况下,甚至要高出10倍以上。

现在很多网站喜欢采用awstats来分析服务器日志,来计算网站的访问量,但是当他们一旦采用Google Analytics来统计网站流量的时候,却发现GA统计的流量远远低于awstats,所以开始怀疑GA的准确性。其实GA的统计确实会略低于真实的用户访问量,但数据的真实性比较靠谱,不会偏差特别大。之所以略低是因为GA的服务器有时候用户访问不到,还有一种情况是访问JavaEye的用户所在公司使用了白名单,他能访问JavaEye却无法访问GA服务器,此外也有可能用户还没有等到GA加载就跳转到下一页了,所以统计量没有被GA计算。

那么为什么GA和awstats统计会有这么大差异呢? 罪魁祸首就是把自己伪装成浏览器的网络爬虫。一些网络爬虫为了避免被网站以识别User-Agent的方式封杀,就修改了自己的User-Agent信息,通常伪装成WindowsXP上的IE6浏览器,也有伪装成Firefox浏览器的。这种情况下awstats无法有效的识别了,所以awstats的统计数据会虚高。不过说句公道话,这也怪不了awstats,只怪爬虫太狡猾,不但awstats无法有效识别,就算我们肉眼去查看日志,也往往无法有效识别。

因此作为一个网站来说,如果希望了解自己的网站真实访问量,希望精确了解网站每个频道的访问量和访问用户,开发自己的网站流量统计系统就显得非常有必要性。JavaEye网站就开发了自己的网站流量统计系统,采用在页面里面嵌入js的方式来实现网站流量统计。因此我们可以精确的掌握登录用户和非登录用户的比例,不同的访问偏好,JavaEye每个频道精确的流量和比例,真实的用户数量和分布等GA无法提供的有价值的信息。

JavaEye自己的流量统计系统尽管并不是为了甄别爬虫而编写的,但是他可以帮助甄别网络爬虫。我们知道只有用户使用浏览器访问页面的时候才会执行js,而爬虫并不会执行页面里面的js,所以rails的production.log里面出现的IP地址,却并没有相应的流量统计系统记录这个IP地址,我们可以99%的断定这个IP是个爬虫。如果爬虫编写者专门伪装真实IP向流量统计服务器发起请求的话,流量统计系统也有自己的防范作弊的机制,以及数据分析机制来甄别异常的访问请求,这点就不展开讨论了。

总之有了JavaEye流量统计系统提供的真实IP作为参考标准,我们就可以拿日志里面出现的IP地址进行比较,如果日志里面某个IP发起了大量的请求,在流量统计系统里面却根本找不到,或者即使找得到,可访问量却只有寥寥几个,那么这无疑就是一个网络爬虫,我们可以直接用iptables封杀该C段地址了。

根据这种策略,我们可以重新调整封杀方案。首先统计production.log,统计访问最多的200个C段地址,这仅仅需要一条shell命令:

grep Processing production.log | awk ‘{print $4}’ | awk -F‘。’ ‘{print $1“。”$2“。”$3“.0”}’ | sort | uniq -c | sort -r -n | head -n 200 》 stat_ip.log

这200个C段地址就是我们需要重点考察的对象,网络爬虫就混迹在这200个C段地址之内。它的格式大致如下,显示访问请求最多的C段IP地址和请求次数:

99650 203.208.60.0

55813 123.125.66.0

21131 221.235.58.0

18360 72.14.199.0

14632 121.0.29.0

11789 202.165.185.0

10539 61.135.216.0

10153 65.55.106.0

7001 65.55.211.0

4240 65.55.207.0

3789 219.133.0.0

3721 194.8.74.0

然后我们还需要流量统计系统提供的真实IP地址的C段地址作为参考,这已经由流量统计系统提供给我们了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值