Python字体映射讲解:解决网页字体反爬问题
·
一、前言
在网络爬虫开发过程中,我们经常会遇到字体反爬的情况:网页上显示的数字、文字看似正常,但查看源码时却是一堆乱码或特殊编码,这是网站通过自定义字体文件(如.woff、.ttf)映射字符,从而阻止爬虫直接提取数据的手段。
本文将通过一个实战案例,讲解如何使用 Python 的fontTools库解析字体文件,建立字符映射关系,最终破解字体反爬,提取出真实数据。
二、核心原理
字体反爬的核心是自定义字体映射表:网站通过修改字体文件中GlyphID(字形 ID)、cmap(字符编码映射)等标签的对应关系,让浏览器按照自定义规则渲染字符,而爬虫直接提取源码只能得到映射后的 “假字符”。
我们的破解思路是:
- 解析字体文件,提取
cmap标签的编码 - 名称映射; - 提取
GlyphID标签的ID - 名称映射; - 结合网页渲染逻辑,建立假字符 - 真实字符的最终映射;
- 通过映射关系,转换爬取到的 “假字符” 为真实数据;
三、环境准备
首先安装依赖库:footTools

四、代码实现:破解网页字体映射
首先从网站的网络--字体中下载.woff文件

再将这个文件转为xml格式

这时运行后我们将看见这个字体文件中的内容,这是我们就可以分析其结构,从中提取出想要的内容,先读取文件,再使用正则表达式提取出cmap标签下的所有元素

cmap里是这样的:
可以看见是在一个列表当中,故使用for循环,使他变成一个字典

('0x30', 'zero')变成('zero','0'),即把 cmap 里的 “编码 - 名称” 对,转换成一个字典 item,键是名称(如 "eight"),值是对应的字符(如 "8")

同理,再来处理GlyphID标签

代码如下:

需要注意的是,最后的结果是将上面cmap标签里获得的 ('*.217': '里' ) 换成(‘里’:8)这样的,故使用item[lst[1]]
如此print(result)即可获得解密后的字体映射字典
五、总代码

更多推荐


所有评论(0)