只要你的网站能通过浏览器合法访问,就不可能百分百的阻止爬虫,只能尽可能的去增加对方的爬虫代价。
由于工作原因,像某里系,某度,某字母站,某乎,某电影网站...等等的页面数据我都爬过。既然他们都防止不了,何况我们呢?
![](https://i-blog.csdnimg.cn/blog_migrate/126d17fbdeea0ec4960b9682bdb6c243.png)
一般的反爬策略
前后端制定加密签名策略
前端每次发送请求的时候都携带一个动态签名,后端根据相同的规则生成签名,两下一对比,如果正确,放行,如果不正确,抛回非法请求
举例一种策略
前端每次都生成一个随机字符串比如 125432
前后端约定一个密钥 比如 secert123987
再加上一些常用的请求头 比如 User-Agent
当前请求的api地址 比如:"/api/user/get"
那么就是这样 :
{随机字符串}+{User-Agent}+{api地址}+{密钥}
125432Mozilla/5.0 (Windows NT 10.0; Win64)/api/user/getsecert123987
然后在对上面的一串字符串进行签名校验,比如md5。也可以用上面的密钥进行sha256,mac加密
其实每个签名加密都是有规则的,有经验的程序员,一眼都能看出来,不过最多的还是md5加密,因为最快
这个方式对老手没啥大用,因为再怎么样,你的签名策略也是摆在浏览器中的,仔细找肯定能找到
除非你自己研究属于自己的签名策略,不过按道理来说应该对大神也没用。
隐写术
添加0宽字符进行混淆
https://juejin.cn/post/6867319399947681806
这篇写隐写术的蛮好的
混淆js
不用多说,现在前端工程应该都有webpack和vite
不过混淆js的最大目的还是压缩前端代码,最防爬虫只是有很小的帮助。
robots.txt
君子协定,懂的都懂
验证码
每次请求都找后端要一个验证码,将验证码再进行签名策略,,不过对于爬虫人员来说也只是多了一步而已。因为请求验证码的api爬虫人员也是能看到的。
如果是图形化的验证码的话,就像StackOverflow等的,每次搜几个问题都会跳出来几张图片让你回答问题,判断你是不是机器人。,那该多烦人,我们的网站一般不会那样做的
应该没了吧?
用wasm进行签名生成
WebAssembly 对于传统的web开发而言,这个技术应该95%都用不到吧。
WebAssembly,简单来说其实就是将c语言,rust语言等高级语言编译成wasm文件,让浏览器直接就能用,,
那么。。。
我们可以用rust语言写加密策略,让js代码调用wasm生成签名,不但更加安全,而且签名策略用rust写,运行相比js会更快
也就是相当于将 加密策略 加密了一下。。好绕,我们是看不懂wasm文件中的内容的,也就不清楚加密策略了。
当然了,应该也是有工具将wasm再次反编译的,,我没去找哦,,,,哎~~~~~
rust语言编译成wasm
当然了,用c也可以。。我c早忘了。。
相关技术,
rust
wasm-pack
https://rustwasm.github.io/wasm-pack/installer/
将rust编译城wasm的工具
vite-plugin-wasm-pack
引入wasm的工具
自己捣鼓吧
字体加密
上面的所有所有都躲不过一个东西,就是python的Selenium,或者java的jcef之类的自动化爬虫,就是人家真的就是打开了一个网页,这怎么防啊。
那就将网站上的文字加密吧,现在好多网站都有这种策略
效果
![](https://i-blog.csdnimg.cn/blog_migrate/f6e4af03a6c115ababb83bb3e2bf7d41.png)
上下两排的文字是不一样的哦,,
![](https://i-blog.csdnimg.cn/blog_migrate/749930e1ec5616dd9b64624f53953e9b.png)
首先你需要下载一些需要加密的字体,不用下全,因为我们不可能将中国很多很多的汉字全加密,那样的话光下载字体文件就要占网站很大的流量,一般就英文+数字就可以了,格式可以为 fft woff woff2
2、用FontCreator这个工具更改掉原始的unicode编码,
比如 16进制的30 代表0 我们可以改成16进制的59910
![](https://i-blog.csdnimg.cn/blog_migrate/8f6b42240a506640ceb5f7a9bd7ce374.png)
然后将你需要加密的文字的编码改成自定义的编码就好了
比如0的流程就是
\u0030 ->0 -> ''
我是写了一个转换的指令directive,
第一次写,不知道什么才是最好的,就不展示directive代码了,
但是肯定不能将后台的所有api的数据全部转换一遍,,那样应该好浪费性能,也没必要,只需要将重要的文字内容加密一下就好了
添加字体属性
@font-face {
font-family: 'XXXXX';
font-size: 16px;
src: url('../fonts/XXXX.woff2');
}
然后再转换后的内容标签上加上 style css属性font-family:XXXX就好了啦啦啦啦。
又要泼冷水了
上面的还是不能防止爬虫,因为我们可以将网站上的字体文件下载下来,一分析,就知道哪个是哪个了,,,,~~~~,,
而且如果实我,我还会用谷歌插件去爬虫,在api显示到页面之前就给你拦截掉,
限流、ip黑名单做起来。~~