最近试了下公司网站的反爬,发现用补环境技术半天就可以搞定,如果用jsdom这种伪浏览器,一分钟就可以搞定。于是写下自己这些年来对爬虫的理解,希望对公司的反爬有帮助。
对于一个接口的反爬,可以分两个阶段,一个是请求时做反爬,一个是请求后对请求结果做反爬。
对请求结果做反爬可以有请求结果加密,字体反爬,CSS反爬等等,其中字体反爬和CSS反爬对搜索引擎不友好。
对请求时做反爬,主要是添加请求token, 对请求的token做校验。请求token的生成过程要手机客户端信息,对客户端环境做校验。
对客户端环境做校验主要分为两种,一种是浏览器环境,一种是Node环境。
对于浏览器环境的检测,有Canvas指纹,Webgl指纹,Audio指纹,字体指纹,还有WebRTC指纹等等。WebRTC可以获取到客户端的实际内外网IP,即便浏览器加了代理。对Canvas指纹,Webgl指纹,Audio指纹,字体指纹做校验是为了防止爬虫用程序批量抓取,因为这种批量抓取,指纹大都是一样的。当然对于有经验的爬虫,这些都防不住,指纹可以修改,WebRTC可以禁用。
对于Node环境,主要是检测与浏览器环境的差异,如require, module等关键字是不是存在;还可以检测对象的原型链,如document的原型链是不是和浏览器一致等等;还可以检测函数实现,检测代码是否被格式化,检测异常堆栈,这些都有待反爬工程师去挖掘。
反爬代码写好之后,我们还需对它进行混淆,增加破解难度。目前推荐vmp混淆,但由于vmp性能有问题,只能用在关键算法的加密上,不能用于全部代码。当然自己实现一个vmp有一点难,v_jstools的作者有vmp混淆工具,可以去找找,开源的有Obfuscator混淆,但蔡老板可以一键还原,所以做混淆有点难,目前就没有蔡老板搞不定的混淆(除了vmp)。反爬代码的破解难度不取决于混淆,而取决于反爬代码对环境的检测,检测的越多,越难破解。要知道补环境这种爬虫技术是可以无视混淆的,在补环境过不了反爬时,才需要看混淆代码。
除了环境检测外,还可以增加一些行为事件检测,如鼠标滑动事件,鼠标点击事件,这些都可以增加爬虫的破解难度。
对于token,最好只能请求一次就失效,而不是可以一直请求;对于反爬代码,能做到动态变化最好,这些都会增加爬虫的破解难度。
另外,风控也是反爬的一种,这里就不班门弄斧了。
总体来说,反爬防不住所有人,再难的反爬,也有人能破解,但只要增加了破解反爬的成本,让爬虫放弃抓取,反爬就成功了。