讲师中心 微信公众号
AI工具推荐 视频效率加速

Python爬虫如何应对字体加密反爬_利用FontTools解析偏移字体映射

老丽姑娘_9194

老丽姑娘_9194

发布时间:2026-04-23 15:37:06

|

1102人浏览过

|

来源于php中文网

原创

字体加密反爬的本质是字体映射混淆,即网页用自定义字体将乱码字符(如 ሴ)通过 .woff/.ttf 的 cmap 表映射为真实数字,HTML 中实际存储的是 Unicode 码点而非明文。

python爬虫如何应对字体加密反爬_利用fonttools解析偏移字体映射

字体加密反爬的本质是什么

网页用自定义字体渲染数字或文字,实际 HTML 里是乱码字符(如 ሴ),但浏览器通过加载的 .woff 或 .ttf 文件把它们映射成真实文本。Python 爬虫直接解析 HTML 拿到的是 Unicode 码点,不是原意——这根本不是“加密”,而是“字体映射混淆”。

关键判断:只要页面没用 canvas/svg/图片绘字,且字体文件可下载,就一定能还原。难点不在解密,而在准确提取字体中的 cmap 表映射关系。

用 FontTools 提取 cmap 映射的最小可行步骤

FontTools 是最轻量、最可控的方案,比 OCR 或图像识别稳定得多,也比硬写 TTF 解析器靠谱。

  • 确保已安装:pip install fonttools
  • 下载字体文件(注意:URL 可能带时间戳或 token,需复现请求头,尤其是 Referer 和 User-Agent)
  • 用 TTFont 加载后,优先查 getBestCmap(),它自动选最常用编码表(通常是 platformID=3, platEncID=1,即 Windows Unicode)
  • 遍历返回的 dict,键是 Unicode 码点(int),值是字形名(str);部分字体用 glyf 表偏移+命名规则反推数字,但多数情况字形名含数字(如 uniE001 → 实际对应数字 1)
from fontTools.ttLib import TTFont
<p>font = TTFont("example.woff")
cmap = font.getBestCmap()  # 返回 {69633: 'uniE001', 69634: 'uniE002', ...}
reverse_map = {v: k for k, v in cmap.items()}</p><h1>若字形名有规律,比如 uniE001 ~ uniE009 对应 1~9,则:</h1><p>num_map = {name: int(name[-1]) for name in reverse_map if name.startswith('uniE0')}</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/xiazai/skill8910" title="361SCAN security check your skill python scripts"><img
                                                                                src="https://img.php.cn/upload/skill/000/000/081/179231049778675.jpg" alt="361SCAN security check your skill python scripts" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/xiazai/skill8910" title="361SCAN security check your skill python scripts">361SCAN security check your skill python scripts</a>
                                                                        <p>扫描并分析已安装技能,用于查看指定技能目录的名称、描述和详情,或列出所有已安装的技能。</p>
                                                                </div>
                                                                <a href="/xiazai/skill8910" title="361SCAN security check your skill python scripts" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p>

常见翻车点:cmap 为空、映射不全、动态字体更新
  • cmap 为空?检查字体是否损坏,或是否用了非标准编码(尝试 font['cmap'].tables 手动遍历所有子表,找 platformID==3 and platEncID in (1, 10))
  • 映射不全?有些字体把数字映射到私有区(U+E000–U+F8FF),但 HTML 里写的却是另一套码点(比如服务端做了二次转换),此时要对比网页源码里的 ... 值和字体中实际存在的码点
  • 动态字体更新?每次访问返回不同字体文件(hash 变、内容微调),不能本地缓存一个字体一劳永逸。必须每次请求时下载对应字体,并做哈希校验或版本提取(比如从字体 name 表里读 Version 字段)

如何把 HTML 中的乱码字符转成真实数字

核心是:HTML 实体 → Unicode 码点 → 字形名 → 真实字符。中间任何一环断掉都会失败。

  • 解析 HTML 实体要用 html.unescape(),别用正则硬拆 ...,否则会漏掉十进制写法(Ӓ)
  • 得到字符后,用 ord(char) 转码点,再查 cmap 得字形名
  • 如果字形名无数字规律(如叫 glyph00012),就得结合 glyf 表坐标偏移或提前准备的映射样本(比如爬几次固定页面,人工标注几组对应关系,训练简单匹配逻辑)
import html
<p>text = "¥&#xE001;&#xE003;&#xE002;"
clean = html.unescape(text)  # '¥'
for c in clean[1:]:  # 跳过 ¥
codepoint = ord(c)
glyph_name = cmap.get(codepoint)
if glyph_name and glyph_name.startswith('uniE'):
digit = int(glyph_name[-1])
print(digit, end='')  # 输出 132</p>

字体映射本身不难,难的是每次遇到新站点都要重新确认 cmap 表结构、字形命名习惯、以及服务端是否在字体外加了额外混淆层(比如先 base64 再嵌入 CSS)。别迷信“通用映射表”,现场分析才是常态。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1771

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4604

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1729

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

27237

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3287

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3307

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1203

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

100

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn