二手车行业就是一个充满爬虫的行业,你Pa我,我Pa你,生生不息,永无尽头,每天半夜的时候看着服务器的资源反而比白天还要多的状况,看着日志里一行一行机器人的痕迹,曾经,我痛苦过,惋惜过,但是现在我却默默不语,掩面微笑。
对付爬虫,分两大部分:
我们反着来讲。
通常,识别出爬虫,会简单的block掉或者返回一个报错,这就too young了,天下没有什么事能难道爬虫,当我发现爬不到信息的时候,老大肯定要发火了啊,“赶紧去改爬虫规则,无论如何要实现对新接口的适配”。无论是你设置了接口频率限制,还是user-agent判断,统统没有卵用,我有ip库快速切换,user-agent照着你客户端的请求规则适配。什么?你还有动态token?too simple,搞个服务专门hack token,提供给爬虫用,分分钟破解,有意思么?
所以说,一个好的反爬虫系统,是不会让对方轻易发现你发现了他们的!!
怎么说?也就是一开始,你最好假装自己的系统是毫无防护的(或者因为安全意识太差一开始就是这样的状态,例如我们),让别人用最简单的爬虫代码来爬你,这时候,爬虫的特征通常很明显,甚至不经过任何伪装,这就叫引狼入室了。
狼进来了之后,让他先开心一段时间,接下来就有好戏看了,给他爬几天吧,然后接下来重点来了!喂他吃加错乱的数据!这些数据跟真实数据可以一模一样,但是里面一定要有几个字段是随机乱写的,难以发现,却又破坏规则。 至于假数据如何生成,这是另一个话题了,可以取出真实数据然后做处理,但是最好不要让爬虫进到真正的业务逻辑里去,自己做个备用库,专门给爬虫伪装假数据用,这样业务数据也会看起来正常很多。
一些基本手段:user-agent ,ip,调用同样接口同样参数的频率,某个token一天调用的接口次数(并且是否集中在列表或者详情的接口)。
以上数据,可以通过日志系统收集(ELK),然后人工做简单的筛选,kibana的搜索功能还是很强大的。
有了数据之后,在代码里做一个全局的钩子,把爬虫识别并且引流到特殊的route中,简直太棒。
不过,手动发现爬虫还是很累的,而且一些复杂的分析没法做的很好,例如分析某个请求的频率,某个token的调用。
针对这些逻辑,可以单独开一类日志。在全局的中间件中,记录接口的调用,调用者token,调用者ip,将这些数据写入redis,在另外一个定时脚本里,定时分析redis里这些简单的数据,把上述规则的请求发现出来,然后记录到日志系统中。这样在日志系统中直接筛选此类别日志,就能看到所有的识别爬虫了,将这些爬虫特征加入处理程序中即可。
当然,整套系统可以做成自动化,将定时分析的爬虫特征再反向灌入到主应用中。不过为了安全起见,开始做成手动化即可,人工做一些筛选,防止误判。(毕竟昨晚还发生某内网应用导数据频繁请求node接口的案例)
希望这个世界没有爬虫