本文详解如何识别并解码汽车之家等网站通过自定义字体(web font)隐藏的真实价格数字,提供 unicode 映射表与 python 自动化解码方案。 从事网页爬虫开发的同行,大概率都遇到过这类令人抓狂的场景——页面明明显示着清晰的价格,爬取下来却是一串乱码字符。例如在汽车之家、懂车帝等二手车详情
汽车之家二手车被自定义字体混淆的价格数字解析
时间:2026-07-05
浏览:81
文章目录
本文详解如何识别并解码汽车之家等网站通过自定义字体(web font)隐藏的真实价格数字,提供 unicode 映射表与 python 自动化解码方案。
从事网页爬虫开发的同行,大概率都遇到过这类令人抓狂的场景——页面明明显示着清晰的价格,爬取下来却是一串乱码字符。例如在汽车之家、懂车帝等二手车详情页中,价格字段经常出现类似 . 的字符。这并非编码错误,而是网站故意部署的反爬措施。
核心原理相当直接:网站通过自定义 Web Font 字体,将真实数字映射到 Unicode 私有区域的特殊字形上。浏览器能够正常渲染显示,但直接抓取 HTML 文本时,拿到的只是一堆“假字符”。
核心原理:字体映射替代数字显示
被混淆的目标 元素,通常会携带一个类似 font-zmQZz5CrbrbHudeQ 的类名。其内联 CSS 会指定一个特殊的字体族:
.font-zmQZz5CrbrbHudeQ {
font-family: zmQZz5CrbrbHudeQ;
}
这个字体文件(通常为 .woff 或 .ttf 格式)正是关键所在。它将标准阿拉伯数字(0–9)、小数点甚至“万”这类单位,全部渲染到了特定的 Unicode 码位上。页面 HTML 中存储的是这些“马甲字符”,而非原始数字。这好比一家餐厅的菜单上只写代号,只有知情者才知道真正的菜品名称。
Unicode 到数字映射表(已验证)
以下表格基于当前页面快照整理得出映射关系,可直接参考:
| 显示字符 | Unicode 码点 | 对应含义 |
|---|---|---|
| U+E53D | 1 | |
| U+E3F0 | 2 | |
| U+E422 | 3 | |
| (重复) | U+E42C | 4 |
| (重复) | U+E49C | 5 |
| (重复) | U+E42B | 6 |
| (重复) | U+E4FE | 7 |
| (重复) | U+E548 | 8 |
| (重复) | U+E4C8 | 9 |
| (重复) | U+E453 | 0 |
| (重复) | U+E45F | 万(中文“万”,即 ×10) |
注意:实际页面中,同一视觉字符可能对应多个数字(如上表所示),必须严格依据 Unicode 码点区分,仅凭视觉效果无法准确识别。
Python 解码示例代码
理解映射关系后,解码工作便容易处理。以下函数可将混淆字符还原为标准数字字符串,并兼容“万”单位的转换:
def decode_price(text: str) -> str:
mapping = {
'uE53D': '1', #
'uE3F0': '2', # (注意:此码点为2,非其他)
'uE422': '3', #
'uE42C': '4',
'uE49C': '5',
'uE42B': '6',
'uE4FE': '7',
'uE548': '8',
'uE4C8': '9',
'uE453': '0',
'uE45F': '万',
'.': '.', # 保留小数点
}
decoded = ''.join(mapping.get(c, c) for c in text)
return decoded
# 示例使用
raw_price = "." # 实际抓取到的字符串(注意:可能为其他映射,需根据实际字体文件补充)
# 若已知对应'1',则补充:'uE402': '1'(需动态分析字体文件确认)
print(decode_price(raw_price)) # 输出:'11.231'
关键注意事项
上述映射表并非万能,实际应用中有几个关键点需特别留意:
- 字体文件需动态分析:不同页面、不同时间点,网站可能随时更换字体名称及码点。最可靠的方式是使用浏览器开发者工具中的 Network 面板,过滤出 .woff 或 .ttf 文件,下载后用 FontForge 或在线工具(如 Transfonter)查看 glyph 到 Unicode 的映射关系。
- 避免硬编码,风险过高:生产环境中,建议编写自动化字体解析模块,动态生成映射表,而非依赖静态查表。
- 留意 JavaScript 渲染:如果价格由 JavaScript 动态写入,则 requests 等工具无法获取。需借助 Selenium 或 Playwright 等工具,先执行完 JavaScript 后再提取 HTML,否则连混淆字符都无法抓到。
- 单位转换:字符串中的“万”需转换为数值,例如 "15.8万" 实际对应 158000.0,后续统一转为浮点数以便计算。
掌握字体混淆机制后,不仅能破解汽车之家的价格字段,还可迁移至知乎、贝壳找房等同样采用 Web Font 反爬的平台。核心思路只有一条:视觉呈现 ≠ 文本内容,认清这一本质,多数反爬手段便失去效力。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。