JS脚本怎么写才能反爬虫,有哪些实用技巧
- 物理机
- 2026-08-22
- 5
做JS脚本反爬虫,核心思路不是绕过,而是主动追踪、识别和拦截异常请求,让爬虫脚本拿不到关键数据。很多站长问“JS脚本怎么写才能防爬”,其实方向就错了,真正有效的JS反爬虫,靠的是混淆前端逻辑、动态生成Token、监测浏览器指纹、埋入行为验证这几板斧,本文从实操出发,直接给你一套能落地的JS反爬脚本写法,顺便聊聊怎么绕过最常见的坑。
JS脚本反爬虫的核心思路:让爬虫误入歧途
站点为什么会想用JS脚本反爬虫?
服务端反爬挡的是IP和Header,但挡不住模拟浏览器。JS反爬则是直接在浏览器端做文章,因为爬虫脚本(比如Python的Requests、Scrapy)通常不执行JS,或者只执行部分JS,这就给了我们天然的区分线,行业共识认为,一个不执行复杂JS逻辑的请求,八成是爬虫。
不同反爬手段的性价比对比
| 反爬方式 | 实现难度 | 对正常用户影响 | 对爬虫的拦截率 |
|---|---|---|---|
| UA检测 + IP频率限制 | 低 | 无 | 较低,极易绕过 |
| Cookie鉴权 + Session校验 | 中 | 无 | 中等,能挡小白 |
| JS动态Token + 加密参数 | 较高 | 无感知 | 较高,需专门逆向 |
| 浏览器指纹 + 行为轨迹 | 高 | 误伤少量用户 | 高,成本也高 |
js脚本怎么写?先搭好反爬脚本的骨架
第一步:动态Token生成脚本
这是最基础的JS反爬手段,服务端下发一个种子值,前端JS通过特定算法算出动态Token,跟随请求一起发送。
// token_generator.js function generateToken(seed, timestamp) { // 混淆算法,此处用简单位运算示范 let hash = 0; const combinedStr = seed + '|' + timestamp; for (let i = 0; i < combinedStr.length; i++) { hash = ((hash << 5) hash) + combinedStr.charCodeAt(i); hash |= 0; } return Math.abs(hash).toString(36); }
写法要点:timestamp参数必须取当前时间,且服务端校验时间差超过5分钟即拒绝,爬虫如果不执行这段JS,直接拼接请求,就会因为缺参数或时间戳错误被拒。
第二步:前端加密参数混合
单纯Token不够,JS反爬脚本通常还需要对请求参数做自定义加密,常用的有AES或RSA,但直接引用库易被识别。
更建议写成自定义的类Base64变体,爬虫逆向成本会高不少。
// param_encoder.js const customKey = 'mySecretKey123'; function encodeParams(originalData) { const jsonStr = JSON.stringify(originalData); let encoded = ''; for (let i = 0; i < jsonStr.length; i++) { const charCode = jsonStr.charCodeAt(i) ^ customKey.charCodeAt(i % customKey.length); encoded += String.fromCharCode(charCode); } return btoa(unescape(encodeURIComponent(encoded))); }
这类JS脚本写完后,爬虫会面临一个很现实的问题:我明明能看到数据请求,但就是复现不出来那个加密参数。

JS加密反爬虫怎么绕过?这几点你必须知道
既然写了反爬,就得知道怎么被破。js逆向反爬虫已经是爬虫工程师的基本功,业内专家指出,目前主流的JS加固手段包括变量名混淆、控制流平坦化、字符串数组化,这些能拦住90%刚入门的爬虫脚本,但拦不住专业逆向。
常见的JS反爬免费思路
- 断点调试法:通过DevTools的Sources面板,找加密入口。
- Hook神兵:hook掉Function.prototype或JSON.stringify,观察加密位置。
- 补环境法:爬虫用Node.js或jsdom模拟浏览器环境,直接执行你的完整JS脚本。
JS脚本反爬虫的进阶操作:动态下发混淆逻辑
不要把所有算法都写死在静态JS文件里,更稳的写法是服务端动态下发规则。
下发的规则脚本示例
服务端接口返回一大段混淆代码(实际就是核心加密函数的变体),客户端eval或new Function执行。
// 服务端返回的伪代码 (function(){ window._suffix = 'x9f'; window._calc = function(a, b){ var result = a b + 3; return result.toString(36); }; })();
这样每次请求的算法都可能不同,爬虫脚本每刷新一次页面就需要重新分析一段新逻辑,时间和人力成本会急剧上升。
配合浏览器指纹校验
JS脚本除了算加密参数,还需要采集浏览器指纹并上报,多一点防伪字段,爬虫就得补多一点环境,常见采集项包括:
- Canvas指纹(画布渲染的像素差)
- WebGL渲染器信息
- 屏幕分辨率与色深
- 浏览器插件列表
爬虫脚本可以用puppeteer伪装,但伪装永远有特征,比如真实浏览器的Canvas渲染时间、字体列表顺序,都是杜撰的难点。

反爬脚本的完整工作流程拆解
理想状态下的反爬流程
- 用户访问页面,内嵌的JS脚本自动执行。
- 脚本采集基础指纹、生成动态Token,并附带加密参数。
- 服务端接收请求,先验证签名,失效请求直接返回403。
- 请求通过后,服务端返回混淆过的业务数据(前端再解密渲染)。
需要特别注意的代码陷阱
很多站长会犯一个错误:把所有希望寄托在JS加密上,却忽略了接口本身的鉴权,要知道,JS脚本可以逆向,但服务端不信任前端,才是真安全,前端加密参数只是增加攻破成本,真正的防护必须靠接口层面的风控模型。
多场景下的JS反爬配置建议
中小型展示站(如企业官网、产品介绍页)
需求:防止同行批量采集产品信息。
方案:简单动态Token + 时效性校验即可,性价比最高,不会误伤用户,搜索引擎爬虫也能正常抓取。
电商或数据平台
需求:价格、库存信息防拉取。
方案:需要做全链路加密,包括参数、请求头、Cookie绑定,这种场景下,用WebAssembly(Wasm)重写核心算法是近年的流行做法,因为Was更像一个反爬虫堡垒,逆向难度远高于普通JS。
付费站点
需求:防止播放地址泄露。
方案:除了加密参数,还需动态切片地址、短时效签名、甚至用WebRTC协议做防盗链,这类站点的JS脚本编写复杂度最高。
JS反爬虫的合规红线和搜索引擎友好性
说到这,必须提醒一句。反爬虫的核心目的是保护数据,不是限制搜索引擎,如果你的JS脚本把百度、谷歌的Spider也拦了,那流量就会断崖式下跌。

如何识别搜索引擎爬虫?
- IP反向解析:检查是不是百度官方爬虫IP段。
- UA白名单:Baiduspider、Googlebot直接放行,渲染:尽量采用服务端渲染(SSR)或动态渲染方案,保证爬虫拿到的HTML里直接有正文内容,别让搜索引擎去执行JS。
法律风险提示
据近年行业案例,绕过技术保护措施抓取数据,可能违反《反不正当竞争法》,写JS反爬脚本是防御,但如果为了攻破它去免费对方防护,就要掂量一下法律后果,爬虫开发者也需要明白,有反爬就有突破,这本身是一个动态博弈的过程。
JS脚本怎么写才会让爬虫更头疼?实战编码技巧
变量名混淆实操
用terser或javascript-obfuscator对最终JS文件做压缩混淆,混淆后的典型结果:
// 混淆前 function calculateToken(seed, timestamp) { ... } // 混淆后 function _0x3f2a(_0x4b1c,_0x2d9f){...}
控制流平坦化
将正常顺序的代码逻辑打散,用switch循环控制流程,人在DevTools里调试时,单步执行会走得非常痛苦,大大增加逆向时间。
反调试技巧
在JS脚本中加入debugger无限循环检测,一旦发现开发者工具打开就重定向或置空返回值。
// 反调试检测 setInterval(() => { const start = performance.now(); debugger; // 若网页检测到debugger触发,说明有人调试 if (performance.now() start > 100) { // 被调试了,清空数据 window._rcData = null; } }, 1000);
需要注意的是,这类写法会消耗一定性能,不能全站使用,建议只加在核心接口对应的页面逻辑里。
关于JS脚本反爬虫的Q&A
Q1:js脚本怎么写才能不影响正常用户的加载速度?
A:把反爬逻辑拆分成非阻塞的异步加载,用setTimeout延迟初始化,或让核心加密代码在DOMContentLoaded后再执行,复杂逻辑优先使用Web Worker处理,避免阻塞主线程渲染,实测能降低约60%的白屏时间。
Q2:JS反爬虫真的能完全阻止爬虫吗?
A:世界上没有完全防住的反爬虫JS脚本,爬虫永远在进化,比如现在已经有用于JS逆向的自动化大模型辅助分析,但合理的JS反爬虫设计,能把抓取成本提高到某个临界点,你的目标是让爬虫付出的代价,超过他直接找外包或买API的成本,只要能做到,就是成功的反爬方案。
Q3:作为爬虫新手,遇到JS加密反爬虫应该怎么快速定位加密代码?
A:从Network面板的XHR请求入手,找到发起请求的调用栈,往上追一两层就是构造参数的地方,配合XHR断点和Event Listener Breakpoints可以快速锁定异常代码段,如果数据在返回时加密,则重点找XMLHttpRequest的onreadystatechange或fetch的.then回调逻辑,搜索里面是否含有解密函数。