一种让爬虫抓狂、用户无感的轻量级反爬方案
你是否也经历过这样的痛?
熬夜整理的导航站,上线没几天,内容就被竞品爬虫一锅端。链接、描述、分类,一字不差地出现在别人网站上。而你除了骂两句,似乎什么都做不了。
传统的反爬手段——验证码、频率限制、IP封禁——要么影响用户体验,要么成本高昂,要么道高一尺魔高一丈。
今天,我想和你分享一个「四两拨千斤」的方案:自定义加密字体。
它的核心逻辑简单到令人意外:让浏览器正常显示文字,但爬虫抓到的源码全是乱码。整个过程完全免费,无需写代码,10分钟就能搞定第一版。
先看一眼最终效果:
- 你看到的网页:AI写作工具、AI图像生成
- 爬虫抓到的源码:
  —— 一串毫无意义的私有编码
这就是加密字体的魔力。下面,我从原理到实操,完整拆解给你。
一、先理解原理:为什么几个字符能挡住爬虫?
要理解加密字体,我们得先回到文字显示的最底层。
正常情况下的文字显示:
每个字符在计算机世界都有一个唯一的「身份证号」,也就是 Unicode 编码。比如:
- 字母 A → U+0041
- 数字 1 → U+0031
- 汉字"测" → U+6D4B
普通字体文件的作用,就是在这些标准编码位置上,放上对应的字形图案。浏览器读取到 U+0041,就去字体里找到那个位置,把"A"画出来。爬虫抓取源码时,自然也拿到的是明文。
加密字体做了什么?
这里引入一个关键概念:Unicode 私有空白区域(U+E000 ~ U+F8FF)。
这是 Unicode 标准里专门预留的一段编码空间,没有任何系统默认字体覆盖。普通环境下,这些编码对应的位置是空的,浏览器只能显示方框或问号。
加密字体的核心策略,就是「鸠占鹊巢」:
- 前端代码写的是正常明文:ChatGPT、AI导航、工具
- CSS 指定使用自定义加密字体
- 字体内部做了强制映射:把"A"的字形从标准位置 U+0041,搬到了私有区域 U+E073;把"工"的字形从 U+5DE5,搬到了 U+E331
- 同时删掉原位置的字形:标准编码 U+0041 的位置变成空白
于是产生了奇妙的双面效果:
- 普通爬虫/默认字体下 → 访问私有编码区域 → 乱码/方框
- 你的网页 + 专属加密字体 → 正确读取私有区域字形 → 完美显示
就像你给所有文字换了锁,只有你的网站拿着对应的钥匙。
二、第一步:确定你要保护哪些字符
加密字体不是越大越好,恰恰相反——越小越好。
每多一个字符,字体文件就大一点,加载就慢一点。所以我们要精打细算,只加密「真正需要保护」的内容。
对于大多数导航站,三类字符就够了:
1. 大小写英文字母:a-z A-Z
2. 数字:0-9
3. 导航常用中文(精简到极致):
AI导航、电商、素材、开发、办公、智能体、
聊天、模型、设计、工具、资源、免费、付费、
官网、链接、搜索、推荐、热门、最新
4. 常用符号:/ : . - _ @
按照这个范围精简,最终字体文件只有 20~80KB。作为对比,一个普通中文字体动辄 5MB 以上。这个体积对网页加载几乎没影响,放到 CDN 上更是秒开。
三、方案一:在线可视化制作(零基础首选)
如果你不想安装任何软件,这套方案 10 分钟就能跑通。
用到的工具(全部免费):
- Glyphr Studio 在线字体编辑器:glyphr.studio/
- 任意 Unicode 编码查询网站(百度搜一下就有)
完整制作步骤:
步骤1:导入基础字体骨架
打开 Glyphr Studio,新建一个空白字体项目。给它起个名字,比如 mysite-encrypt-font。
然后导入一个轻量级的基础字体作为骨架。推荐用 Inter(英文)或 思源黑体精简版(中英文)。这个基础字体只是提供初始字形轮廓,后面会被我们大幅改造。
步骤2:清空私有编码区
这是最关键的一步。
在左侧字形列表里,找到编码范围 E000 到 EFFF。这些就是我们要利用的私有区域。把它们全部清空,确保每个位置都是空白画布。
步骤3:建立字符映射表
现在,我们需要决定每个文字搬到哪个私有编码位置。
这条是安全核心——映射必须随机打乱,绝不能顺序排列。
❌ 错误示范(顺序递增,容易被逆向推演):
A → E001
B → E002
C → E003
✅ 正确做法(完全随机乱序):
A → E073
B → E219
C → E156
工具 → E331 / E092
AI导航 → E400 / E512 / E087
你完全可以自己设计一套只有你知道的映射规则。就算扔个骰子随机分配,也比顺序排列安全百倍。
这是我推荐的一套映射结构,你可以直接参考:
| 原文字 | 标准编码 | 私有加密编码 |
|---|---|---|
| A | U+0041 | U+E073 |
| I | U+0049 | U+E219 |
| 导 | U+5BFC | U+E087 |
| 航 | U+822A | U+E512 |
| 工 | U+5DE5 | U+E331 |
| 具 | U+5177 | U+E092 |
| 1 | U+0031 | U+E201 |
| . | U+002E | U+E3A1 |
具体操作:
- 在编辑器里选中正常文字"A"的字形
- 复制这个字形
- 跳到私有编码
U+E073的画布,粘贴进去 - 重复这个过程,把你需要的所有文字都「搬家」到各自的私有编码位置
步骤4:删掉原位置的字形
所有文字都搬完家后,回到它们的标准编码位置(U+0041、U+5DE5 等),把这些位置的原始字形全部删除。
这一步相当于「毁掉原路」——任何使用标准编码来访问你字体的人,只能看到一片空白。
步骤5:导出字体文件
顶部菜单选择导出,格式务必选 WOFF2。这是专门为网页优化的字体格式,体积最小,兼容性也好。
下载下来,你得到了一个 encrypt.woff2 文件。这就是你的专属加密武器。
四、方案二:FontForge 专业工具(适合长期维护)
如果你需要加密的字符特别多,或者计划定期更换加密方案,推荐用 FontForge。
下载地址:fontforge.org/ 免费开源,Windows 和 Mac 都能用。
它的核心操作逻辑和在线版完全一致,但支持批量操作:
- 打开字体文件
- 批量选中需要加密的字符
- 「编辑 → 复制字形」
- 跳转到 Private Use Area(U+E000 ~ F8FF)
- 批量粘贴并重新绑定编码
- 删除原生编码位置的原始字形
- 压缩并导出 woff2
FontForge 的学习曲线稍陡,但一旦上手,制作一套新映射字体只需几分钟。适合需要定期轮换加密方案的场景。
五、进阶安全:让破解者无从下手
加密字体的原理决定了它有天然的安全性,但想做得更稳妥,还有几件事值得注意。
1. 映射关系的随机性
再次强调:不要有任何可循的规律。不要按字母顺序,不要按拼音顺序,不要用简单算法。最安全的方式就是真随机——把要保护的字符列表扔进随机数生成器,随机分配私有编码位置。
2. 定期轮换加密方案
任何防御都不是一劳永逸的。如果有心人花大量时间手工对比你的网页显示和源码输出,理论上可以逐渐还原映射表。
但你可以让这个成本变得高到不划算:
- 每 30 天重新制作一套新的映射字体
- R2 上替换文件,前端改一行 CSS 链接
- 映射规则全部重排,旧的爬虫规则立刻失效
维护成本几乎为零,但破解者的积累全部归零。
3. 字体文件的极致精简
再强调一次:只打包你真正用到的字符。
全量中文字体 5MB+,精简到导航常用字 30KB 以内。这不仅提升了加载速度,也减少了字体文件被反编译分析的风险面。
4. SEO 的平衡处理
加密字体主要针对的是恶意爬虫,而不是搜索引擎。如果你的站点依赖 SEO 流量,可以加一层中间件判断:
- 识别百度/谷歌爬虫的 User-Agent → 返回纯文本版本,不加载加密字体
- 普通无头浏览器/未知爬虫 → 走加密字体渲染
这样既保护了内容不被同行抓取,又不影响正常收录。
六、前端接入:三步上线
制作好的字体怎么部署到网站上?非常简单。
步骤1:上传字体到 Cloudflare R2
在 Cloudflare 后台新建一个 R2 存储桶,把 encrypt.woff2 上传进去,开启公开访问权限。
你会得到一个直链地址,类似:
https://xxx.r2.cloudflarestorage.com/fonts/encrypt.woff2
R2 有每月 10GB 的免费流量额度,对字体文件这种小体积资源完全够用。如果你习惯用其他对象存储(阿里云 OSS、腾讯云 COS 等),流程一样。
步骤2:在 CSS 中声明加密字体
@font-face {
font-family: 'site-encrypt';
src: url('https://你的R2地址/fonts/encrypt.woff2') format('woff2');
font-weight: normal;
font-style: normal;
/* 指定字体生效的编码范围 */
unicode-range: U+0030-007A, U+4E00-9FA5, U+E000-F8FF;
font-display: swap;
}
.text-encrypt {
font-family: 'site-encrypt' !important;
/* 额外保护:禁止选中文本 */
user-select: none;
}
步骤3:给需要保护的文字加上类名
<!-- 源码里是明文,但渲染出来的效果取决于字体 -->
<div class="text-encrypt">
AI写作工具、AI图像生成、https://idao.fun
</div>
就这么简单。你的 HTML 代码里写的仍然是正常文字,方便维护。但在浏览器渲染层面,走的已经是加密字体的私有编码映射。
七、验证效果:眼见为实
部署完成后,你可以从三个角度验证:
普通用户视角: 打开你的网页,文字显示完全正常。字体、大小、颜色、主题适配——一切如常,用户感知不到任何差异。
爬虫视角(右键查看网页源码):
你看到的不是 AI写作工具,而是一堆类似   的乱码字符串。爬虫无法从中提取可读的站点名称、链接描述等结构化信息。
开发者工具检测:
打开 F12,检查被保护的文字元素。你会看到浏览器实际渲染的是私有编码区域的内容,但 CSS 的 font-family 指向了你的加密字体,所以显示正常。
八、关于这个方案的一些补充说明
这种加密字体方案的本质,是增加了爬虫批量提取内容的成本,而不是绝对阻止。
如果对方真的铁了心要爬你的站,可以通过截图 OCR、手工比对等方式逐步还原。但对绝大多数批量抓取、自动采集的爬虫而言,这个额外成本足以让它们放弃你的站点,转向更轻松的猎物。
对于个人开发者和小团队来说,这是一个性价比极高的方案:零成本、低维护、不影响用户体验、不需要写复杂反爬逻辑。
你只需要花 10 分钟制作一个字体文件,就可以一劳永逸地保护你的导航站资源。
也许多年以后回头看,今天花在设置防爬上的这半小时,会是你整个项目里 ROI 最高的半小时。