一、前言

在网络爬虫开发过程中,我们经常会遇到字体反爬的情况:网页上显示的数字、文字看似正常,但查看源码时却是一堆乱码或特殊编码,这是网站通过自定义字体文件(如.woff.ttf)映射字符,从而阻止爬虫直接提取数据的手段。

本文将通过一个实战案例,讲解如何使用 Python 的fontTools库解析字体文件,建立字符映射关系,最终破解字体反爬,提取出真实数据。

二、核心原理

字体反爬的核心是自定义字体映射表:网站通过修改字体文件中GlyphID(字形 ID)、cmap(字符编码映射)等标签的对应关系,让浏览器按照自定义规则渲染字符,而爬虫直接提取源码只能得到映射后的 “假字符”。

我们的破解思路是:

  1. 解析字体文件,提取cmap标签的编码 - 名称映射;
  2. 提取GlyphID标签的ID - 名称映射;
  3. 结合网页渲染逻辑,建立假字符 - 真实字符的最终映射;
  4. 通过映射关系,转换爬取到的 “假字符” 为真实数据;

三、环境准备

首先安装依赖库:footTools

四、代码实现:破解网页字体映射

首先从网站的网络--字体中下载.woff文件

再将这个文件转为xml格式

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

cmap里是这样的:

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

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

同理,再来处理GlyphID标签

代码如下:

需要注意的是,最后的结果是将上面cmap标签里获得的   ('*.217': '里' )  换成(‘里’:8)这样的,故使用item[lst[1]]

如此print(result)即可获得解密后的字体映射字典

五、总代码

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐