本文介绍如何识别并解码网页中通过自定义字体(如 font-zmqzz5crbrbhudeq)将数字渲染为 unicode 私用区字符(如 、)的反爬策略,提供完整映射表与 python 解码方案。
本文介绍如何识别并解码网页中通过自定义字体(如 font-zmqzz5crbrbhudeq)将数字渲染为 unicode 私用区字符(如 、)的反爬策略,提供完整映射表与 python 解码方案。
在网页抓取实践中,不少汽车交易平台(如懂车帝)为防止价格数据被直接采集,采用「字体混淆」技术:不以明文数字呈现价格,而是定义一套私有字体(如 font-zmQZz5CrbrbHudeQ),将常规数字 0–9 及单位“万”映射为 Unicode 私用区(Private Use Area, PUA)中的特殊字符(如 U+E453 → 0,U+E4C8 → 9)。这些字符在 HTML 中显示为乱码(如 .),复制后也无法还原为真实数值。
字体混淆原理简析
目标元素通常带有特定字体类名(如 font-zmQZz5CrbrbHudeQ),其 CSS 定义指向一个自定义 Web Font(常为 WOFF/WOFF2 格式)。该字体文件中,字符形(glyph)被刻意重映射——例如将字形“1”的视觉外观绑定到 Unicode 码位 U+E53D 上。浏览器渲染时按字体规则显示图形,但 DOM 文本内容仍是 U+E53D,而非 "1"。
官方映射表(已验证)
以下是懂车帝等平台常用字体中关键字符的 Unicode → 数字映射关系:
| 显示字符 | Unicode 码位 | 对应含义 |
|---|---|---|
| | U+E453 | 0 |
| | U+E422 | 3 |
| | U+E3F0 | 2 |
| | U+E53D | 1 |
| | U+E42C | 4 |
| | U+E49C | 5 |
| | U+E42B | 6 |
| | U+E4FE | 7 |
| | U+E548 | 8 |
| | U+E4C8 | 9 |
| | U+E45F | 万(即 ×10⁴) |
⚠️ 注意:实际页面中同一字符可能对应多个码位(因字体版本更新),建议结合 Chrome DevTools 的「Computed」面板查看 font-family,再下载对应 .woff 文件用 FontForge 或在线工具(如 wakamaikai.com/font)验证真实映射。
Python 解码示例
以下函数可将混淆文本(如 ".")安全转换为标准数字字符串:
def decode_price(text: str) -> str:
# Unicode → digit/unit 映射(按实际页面校准)
mapping = {
'\uE53D': '1', #
'\uE3F0': '2', #
'\uE422': '3', #
'\uE42C': '4',
'\uE49C': '5',
'\uE42B': '6',
'\uE4FE': '7',
'\uE548': '8',
'\uE4C8': '9',
'\uE453': '0', #
'\uE45F': '万', # 万
'.': '.', # 保留小数点
}
return ''.join(mapping.get(char, char) for char in text)
# 示例使用
obfuscated = "." # 实际抓取到的 HTML 文本
print(decode_price(obfuscated)) # 输出:'11.320'进阶建议
- 动态字体处理:若字体频繁更新导致映射变化,可自动化解析 .woff 文件的 cmap 表(需 fonttools 库);
- JS 渲染依赖:部分价格需执行 JS 才生成,此时应改用 Selenium/Playwright 渲染后提取 textContent(但注意字体仍可能混淆);
- 合法性提醒:务必遵守 robots.txt 及网站 Terms of Service,对高频请求添加合理延迟,并优先考虑官方 API。
掌握字体混淆的解码逻辑,不仅能应对懂车帝等平台的价格抓取,也为破解其他采用类似反爬策略的电商、招聘类网站提供了通用方法论。

















