Home

Awesome

js_block

研究各种拦截:反爬虫、拦截广告、防止脚本注入或广告注入(防XSS)、斗黄牛等各种功能研究

nodejs 实现反爬虫

学习 http://geek.csdn.net/news/detail/85333

感谢作者的分享,还不知道他大名呢,因为之前也在思考这个问题(思考过加密解密,但由于前端源码可见,我们未做实施,这里给了很好的策略-即使加解密手段可见,但需要花费一定精力处理,而且反爬虫可以工作量少,而做爬虫工作量多,于是方案才具备可行性),当然我们不是针对反爬价格这种需求,而是反黄牛砍价这种需求,而且后台也不是前端技术,这次分享是较成熟的方案。

关键思想

爬虫必须执行一下js 代码,才能取得动态 key,爬虫实现执行 js 的模拟环境(模拟真实浏览器)成为破解的关键。

关键的几个学习点,

反爬虫方法:

除此之外,还可以引入 浏览器和 node 环境差异,来反 node 爬虫。最关键的是,后台的随机算法,我们时不时地变更;或者时不时新增一两个环境差异变量区别

进一步复杂化,做浏览器检测

破解之法 —— 能否一法破万法

所有的加密、混淆等等各种处理,都不能影响正常浏览器的渲染,然后呢,如果在一个正常浏览器的环境下,获取数据或请求 ajax,那么,以上所有的反爬虫手段失效(jsDom PhantomJS CasperJS cheerio 有些可以有些不可以,这里不说了)

但如果是我来做爬虫,而且知道了对方使用了此种技术,呵呵,那我肯定会想到这种方法,肯定能解决他。而从发爬虫的角度来考虑,这里要辅助封 IP、浏览器相同特征检测、黑名单等各种手段同时使用才能凑效。如此来看,各种技术综合在一起,效果才最大,如此难度等级一步步提高上来,初级爬虫就全死掉了,而对高级爬虫的博弈,则是一场持久战。

试想的一法破万法的手段,大批的 IP 地址随机用,node 环境下真实模拟各种浏览器客户端(具备浏览器功能、环境变量、且 UA 随机可变,此时在处理ajax 请求时,封装起来,不让其访问 node 环境变量),也许就可以了,如果他要求属性检测——做个动画呢,这难度又提高了,于是终极手段,就要直接操作真实浏览器了,把任务丢给他。如此,解决 UA 变化的问题,以及 IP 地址问题,就可以了(理论上可行的)。实现难度上去了,值得与否看各自需求啦。

而事实上,反爬虫的手段,还有两点在上面没提到:

此时我突然想到一个问题,关于地图的经纬度加密,比如百度坐标、火星坐标等,其本质上,只是对一个接口来加密,但能防住吗?这是显而易见的。

最终,这些综合方法,总是不断提升门槛。总体上我觉得应该还是防守来的容易吧。

应该搭建个服务,让大家来做攻防练习就好了,这个我去找个免费 nodejs 服务器看看。

我抓到你了——然后怎么办

其他问题

问题思考?

如果我们服务器端使用的不是 nodejs,那么算法 OK 么?

答:同样OK,服务器端最终返回 jsonp 形式的字符串数据,能让客户端执行就行了。怎么维护,就只能手动维护或提供个简单管理界面,直接编辑各种加解密算法,生成对应的 jsonp 内容。

如果用在app客户端呢?

答:由于以上算法,使用加解密以及 eval,是 js 操作的过程,如在 app 中起作用,需要为其单独处理下,否则只能 webview 种处理。

其他优化:对于同一个客户端类型(各种相同参数)限制请求阈值,超过即返回服务器忙

以上反爬虫方法,同样可针对黄牛砍价行为(其最可能就是使用模拟器对 api 接口直接请求处理,如此可阻止其行为)

扩展思考

要做普适性推广,我要写很多请求任务做测试,于是出了这个需求,我在文本框写一个请求任务的代码,点运行,就可以发起一个请求任务,这样我就非常方便测试了

并且还可以增加很多任务,一块儿做,可把任务存入本地缓存中,即使刷新也不会丢失自己刚写的代码(还可以维护一个任务列表)

如此我就新建任务就很方便了。此需求实现也很简单,引入 query,然后运行文本框代码即可。