
本文介绍如何识别并解码网页中通过自定义字体(如 font-zmqzz5crbrbhudeq)将数字渲染为 unicode 私用区字符(如 u+e53d)的反爬策略,提供完整的映射表与 python 解码示例。
本文介绍如何识别并解码网页中通过自定义字体(如 font-zmqzz5crbrbhudeq)将数字渲染为 unicode 私用区字符(如 u+e53d)的反爬策略,提供完整的映射表与 python 解码示例。
在汽车之家、懂车帝等垂直平台的二手车页面中,价格常以「」「」等看似乱码的字符呈现(例如 <p class="font-zmQZz5CrbrbHudeQ">.</p>)。这并非编码错误,而是一种典型的前端反爬手段:网站通过自定义 Web Font 将真实数字(0–9、万)映射到 Unicode 私用区(PUA, Private Use Area)字符,使直接文本提取失效。
关键线索在于 CSS 类名 font-zmQZz5CrbrbHudeQ —— 它声明了专用字体族。查看内联样式或字体文件(通常为 .woff/.woff2),可确认该字体将特定 Unicode 码点渲染为对应数字图形。虽然原始 HTML 中不包含明文数字,但字符与数字存在确定性映射关系:
| 显示字符 | Unicode 码点 | 对应数字/单位 |
|---|---|---|
| | U+E53D | 1 |
| | U+E3F0 | 2 |
| | U+E422 | 3 |
| (其余详见下表) |
完整映射表如下(含单位“万”):
PRICE_CHAR_MAP = {
'\uE53D': '1', #
'\uE3F0': '2', #
'\uE422': '3', #
'\uE42C': '4', #
'\uE49C': '5', # (注:实际需按页面校验,此处为示意)
'\uE42B': '6',
'\uE4FE': '7',
'\uE548': '8',
'\uE4C8': '9',
'\uE453': '0',
'\uE45F': '万', # 注意:“万”是中文单位,非数字
}Python 解码示例:
def decode_price(encoded_str: str) -> str:
"""将含私用区字符的价格字符串转换为可读数字字符串"""
decoded = ""
for char in encoded_str:
if char in PRICE_CHAR_MAP:
decoded += PRICE_CHAR_MAP[char]
else:
decoded += char # 保留小数点、空格等非数字字符
return decoded
# 示例使用
raw_html_text = "." # 实际从HTML中提取的文本
print(decode_price(raw_html_text)) # 输出:'11.231'(需结合上下文判断是否含'万')⚠️ 注意事项:
- 字体映射可能随页面更新动态变更,建议每次抓取前动态解析 CSS 或字体文件(如用 fonttools 解析 .woff2 获取 glyph-to-Unicode 表);
- 注意单位处理:如 .万 应解码为 "11.231万",后续需统一转为元(×10000);
- 避免硬编码映射表——更健壮的方式是下载字体文件,提取 cmap 表生成实时映射(适用于长期维护项目);
- 若 JS 渲染依赖复杂逻辑(如 canvas 绘制或 SVG 路径),则需启用无头浏览器(如 Playwright)执行渲染后提取。
总结:面对此类字体混淆型反爬,核心思路是「识别字体 → 提取映射 → 文本替换」。掌握 Unicode 私用区原理与字体解析能力,是突破前端混淆的关键一步。

















