看不见的攻与防

我们生活在信息爆炸的时代,穷尽一个人的一生也无法浏览完万分之一的网络信息。那如果给你猜,你会觉得整个互联网的流量里,非人类的比例有多大?

是20%?

还是30%?

还是40%?

据统计,2013年机器人占互联网访问的比例就已经超过了60%(很遗憾我并没有查到更近时间的数据,但只会多不会少),也就是大部分的互联网流量并不是由人类产生的。这60%孜孜不倦昼夜不息乐此不疲的机器人,我们就称之为爬虫。

爬虫分善良的爬虫和恶意的爬虫。善良的就像搜索引擎蜘蛛,它们扫描整个网络的内容,协助人类索引、保存、组织、排序信息,让人人都成了现代的诸葛亮,足不出户就可以窥探自然宇宙、知道天下兴替。如果你不希望信息被索引,也只需大咧咧写个robot.txt声明,就跟国际法一样神圣不被侵犯。更别说对做数据分析和数据挖掘的,爬虫简直是一门必须学精的手艺。公开的数据、新闻、微博,抓下来输入模型演算一遍,什么趋势、什么分布、什么画像,都尽入掌握,站在大数据之前,你会觉得自己就是这个时代的魔法师,能知前,能知后,能无中生有。

正邪相生。恶意的爬虫远不只偷你的数据那么简单,他们像蝗虫一样盯着用户聚集的地方,忙碌着在你的数据中注入水分,破坏正常用户的体验,损害你服务的处理能力。刷了你的排行榜,让没有价值的信息排到前面去了;打开大厅,游戏玩家看到的满屏都是爬虫留下的广告,或者有害的色情信息;好不容易真金白银做个广告,一群薅羊毛的机器人一拥而上,热心的用户赶了个晚集,反而连渣都没剩下,运营触达的效果大打折扣;竞争对手眼红了,来一波DDOS,利用大量的主机和硬件对你进行流量攻击,网站瘫痪了,正常用户都服务不了。

所以这注定是一场没有硝烟的战争。不管是操纵善良的爬虫攻击,还是阻止恶意的爬虫入侵,都必须要把攻防当成战争看待,一点都大意不得。以下就给一些爬虫战争的Tips:

当你是攻击方时:

  • 了解敌方网站的URL路径
  • 熟悉数据请求和返回的格式(Chrome的控制台和FireBug都是不错的调试工具)
  • 解析目标字段(用BeautifulSoup或者XpathHelper来提高你的效率)
  • 带上正常的User-Agent,让服务器误以为你是人类
  • 代理IP池,每次轮换不同的IP去请求数据
  • 如果敌方网站是通过JS请求数据,那么可以试试Phantomjs这个小工具(这里2shou叔要卖卖自己基于Phantomjs的爬虫组件,欢迎GitHub关注PhantomjsFetcher,目前刚破百Star,求继续支持)
  • 遇到要求登陆的,给敌方一个小点心(Cookies
  • 欲速不达,降低频率慢慢抓,反正可以日夜不停嘛,不妨再设置一个随机的停顿让服务器摸不着头脑

当你是防御方时:

  • 找恶意群体的聚集特征。托尔斯泰说,幸福的家庭是相似的,不幸的家庭则各有不同。区分机器人和人类也是如此,人类多种多样,机器人千人一面。那些IP相同的,那些只索取、不奉献的,那些行为单一的,通通杀个天地间白茫茫真干净
  • 加大关键数据的获取成本,例如使用JS传输(注意这会影响SEO)、先登陆再浏览、JS代码混淆、异或加密甚至非对称加密
  • 涉及到真金白银的,继续加大敌方的获取成本,绑定手机、绑定微信、APP扫码,绑定惟一住址,能上的武器都堆上
  • 防DDOS攻击要从内部做起:不要留无密码或简单密码的Web界面,关注底层组件的漏洞(乌云等平台),关键账号密码不要外泄(GitHub定期扫一扫,看看有没有谁不听话)

有利益在的地方就有战争,企图完全把对方消灭是不可能的,倒不如把恶意的爬虫也作为你的产品生态的一部分,尽可能多掌握这部分人的动态,甚至想方设法让敌方也为你所用,至少能按照你的预测那样去行动。最后一句话说得有点玄乎了,留给懂行的人自己参悟吧。