当前位置:首页 > 物理机 > 正文

JS脚本怎么写才能反爬虫,有哪些实用技巧

做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脚本怎么写才能反爬虫,有哪些实用技巧 第1张

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脚本怎么写才能反爬虫,有哪些实用技巧 第2张

反爬脚本的完整工作流程拆解

理想状态下的反爬流程

  1. 用户访问页面,内嵌的JS脚本自动执行
  2. 脚本采集基础指纹、生成动态Token,并附带加密参数。
  3. 服务端接收请求,先验证签名,失效请求直接返回403。
  4. 请求通过后,服务端返回混淆过的业务数据(前端再解密渲染)。

需要特别注意的代码陷阱

很多站长会犯一个错误:把所有希望寄托在JS加密上,却忽略了接口本身的鉴权,要知道,JS脚本可以逆向,但服务端不信任前端,才是真安全,前端加密参数只是增加攻破成本,真正的防护必须靠接口层面的风控模型。

多场景下的JS反爬配置建议

中小型展示站(如企业官网、产品介绍页)

需求:防止同行批量采集产品信息。

方案:简单动态Token + 时效性校验即可,性价比最高,不会误伤用户,搜索引擎爬虫也能正常抓取。

电商或数据平台

需求:价格、库存信息防拉取。

方案:需要做全链路加密,包括参数、请求头、Cookie绑定,这种场景下,用WebAssembly(Wasm)重写核心算法是近年的流行做法,因为Was更像一个反爬虫堡垒,逆向难度远高于普通JS。

付费站点

需求:防止播放地址泄露。

方案:除了加密参数,还需动态切片地址、短时效签名、甚至用WebRTC协议做防盗链,这类站点的JS脚本编写复杂度最高。

JS反爬虫的合规红线和搜索引擎友好性

说到这,必须提醒一句。反爬虫的核心目的是保护数据,不是限制搜索引擎,如果你的JS脚本把百度、谷歌的Spider也拦了,那流量就会断崖式下跌。

JS脚本怎么写才能反爬虫,有哪些实用技巧 第3张

如何识别搜索引擎爬虫?

  • 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回调逻辑,搜索里面是否含有解密函数。

0