高频访问IP限制 --Openresty(nginx + lua) [反爬虫之旅]

前言

嗯….本人是从写爬虫开始编程的,不过后面做web写网站去了,好了,最近web要搞反爬虫了,哈哈哈,总算有机会把之以前做爬虫时候见识过的反爬一点点给现在的网站用上了~ 做爬虫的同志,有怪莫怪喽~还有求别打死 > <

首先要提一下AJAX,现在普天下网页几乎都是往特定的数据接口请求数据了,除了什么首屏渲染这种服务端渲染好html以外,几乎没有什么静态网页了。我看了有一些帖子说AJAX让爬虫难做,可是我觉得结合一些工具(比如chrome的开发者工具),找到AJAX所请求的后端数据接口一点也不难,而且现在自己也写过一段时间的web后端数据接口,发现接口的设计往往都是往简单易懂的方向做,外加从2000年出现REST风格,更是让接口设计越来越简明了。所以其实如果一个web站点没有察觉到有爬虫的存在,或者察觉到了,但是没有想要做一点数据保护措施,它是不会再AJAX上做文章的,那么如果单纯的AJAX,其实并没有任何反爬的作用,所以别再说AJAX反爬什么的了,何况AJAX生出来就不是为了反爬的

然而在现在的前后端分离的时代,前端反爬还是有的搞的,基于我不太懂JavaScript,就不展开来说,我只是听说过什么参数加密啊,数据混淆什么的,但其实概括起来都是一种对数据接口的隐藏,这让一些不太懂js的人,也跟着懵逼了(比如说我 : <),但是你要知道,前端代码最终还是要请求一个url的,无论它把这个过程拆开成多散,弄得多复杂都好,只要是需要数据,就必然需要请求一个后端接口(这个接口可以是SOAP,不过21世纪恐怕更多的是RESTful的),所以对于数据保护而言,更加需要重点关注的是后端数据接口的保护。

本反爬虫之旅系列将会一点点从各个方面垒高数据保护墙,但是请记住,因为网站数据的公开性,所以,只是延缓被盗库的时间而已,想自己在网站上公开的数据完全不被爬走是不可能的。那么我们的目标就是:让盗库耗时被延缓到一个比较长的时间里面,那么对于爬取数据方而言,这些数据的价值将会随着时间的增加而降低,数据的价值=利用价值 - (爬取成本+数据贬值速度) * 爬取时间(不用纠结来源了,我说的)

这一篇就讲最基础的“给过频IP弹验证码”这种入门级防护实现,虽然花钱买点代理IP就可以搞定这种实现,但是至少也让他们增加了成本,但是我们相对地并没有花费多少成本,而且过频IP弹验证码除了能反爬,也能抵御一部分的CC攻击(短时间大量的爬虫请求堪比CC攻击啊),虽然没有多大的作用,但是起码比裸奔强!这也算是功能上的复用吧

反爬虫之旅预告:
1. 过频IP弹验证码[应用外]
2. 数据接口的url设计(uuid)和内容横向范围限制(参考angel.co)[应用内]
3. 用户可见(参考微博)以及内容纵向切割(盈利点思考)[应用内]


统览

这里写图片描述

高频访问IP弹验证码架构图

P.s. csdn默认水印real丑,直接去掉图片地址的watermark就可以了


OpenResty

我不准备在web应用中做ip的统计和查封,应用就应该只做业务功能,这些基础东西应该由我们应用的前部——专业的Nginx实现

Nginx本身就有根据ip访问频率的设置,比如“服务器访问频率限制和IP限制”就有提到。不过Nginx只能强硬地返回个403状态码什么的,但是我们这次ip封禁时间比较久,那么如果误伤到用户,我们仅仅强硬地返回个403,用户将会毫无办法证明自己是人,然后要等很久,那就伤用户就伤得很深了,因此我们需要一种可以让被误伤的用户能及时自行解封的策略,验证码就是一个不错的选择,可是Nginx该怎么接入验证码呢?

在说明怎么Nginx接入验证码之前,我想先说说验证码本身,其实就基础防护来说,(封IP+验证码)是性价比比较高的一般性基础组合了,比较低廉的成本就能给爬虫制造麻烦,基于这种组合就能筛选掉一部分廉价爬虫。而虽然说至今为止,很多验证码都被破解了,甚至连新型的基于行为的验证码(比如极验的拖条验证和谷大哥的reCaptcha),都有人提出了破解方案(我今天谷歌一下,居然不止是方案,已经有两三页的教程了- -||| 我得找个时间学习一下了),但是,这种破解方案却不是谁都可以完美丝滑地应用到自己的爬虫上,这是需要一定功力的,那么换个角度思考,我们在某种程度上已经赢了,毕竟我们只是调用别人一个接口而已,甚至就算我们自己DIY一个汉字的图片验证码也不费多大功夫(汉字字符粘连+带随机噪点+干扰线并不特别难,实在不懂可以参考这篇“Python 随机生成中文验证码”就有现成代码~大概长这样这里写图片描述),而爬虫要搞定验证码要么自己花钱第三方识别,要么就自己的团队开发识别验证码的工具,总之又提高了他们爬取成本,杀敌一千,自伤只有五百

虽然有现成的免费的图片验证码生成程序,但是我们在这篇博文里面还是来点新潮的”基于行为”的验证码吧,比如说极验,而关于极验的部署后面还是会提到,个人觉得他们的官方文档后端部署的python那部分讲的不清不楚,后面得自己测试跑一次才知道怎么改….

那么回归Nginx接入验证码的问题,我们需要Lua,Lua是一个高性能的脚本语言,我感觉和Python很像,但是灵活性比不上Python,而执行速度却比Python快。Lua和C/C++是很亲和的,是补充C/C++灵活性的存在,因为有Lua,只要我们在C/C++中向外引入Lua脚本,那么如若Lua脚本发生了修改,我们也并不需要因此重新编译一次C/C++程序。Nginx本身便是由C/C++编写,所以自然和Lua亲和,而后又有OpenResty项目的存在(捆绑了nginx和lua并自带常用lua模块),让Lua在扩展Nginx上成为头号选择。

P.s.补充一点,其实Lua在Nginx的应用只是Lua应用中很小的一个点而已,它在游戏中才是被广泛地应用,因为:第一,游戏在乎性能体验,所以很多Engine都是用C/C&#

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值