一. 字体加密原理
- 简单而言就是利用前端技术干扰,页面可以正常展示,而使用爬虫下载后无法提取正常的数据。
- 在 `CSS3 `之前,`Web` 开发者必须使用用户计算机上已有的字体。目前的技术开发者可以使用`@font-face`为网页指定字体,开发者可将心仪的字体文件放在 Web 服务器上,并在` CSS` 样式中使用它。用户使用浏览器访问 `Web应用`时,对应的字体会被浏览器下载到用户的计算机上。
**注:**使用自动化`selenium`也无法获取正常的数据
- 实例:https://www.shixiseng.com/interns?keyword=互联网IT&city=全国&type=intern&from=menu
- 字体加密的特点
- 在网页上显示正常,在源码里面看到的是乱码或者是问号
2. 定位字体位置
- 字体加密会有个映射的字体文件
- 可以在元素面板搜索`@font-face`会通过这个标签指定字体文件,可以直接在页面上搜索,找到他字体的网址
可以直接把字体文件下载下来, 文件可以一般需要自己修改后缀(网页的字体后缀一般选用woff)
1. `TTF`:这是Windows操作系统使用的唯一字体标准,`macintosh`计算机也用`truetype`字体作为系统字体。
2. `OTF`:这是一种开放的字体格式,支持Unicode字符集,可以在多种操作系统和设备上使用。
3. `FON`:这是Windows 95及之前版本使用的字体格式。
4. `TTC`:这是一种字体集合格式,包含多个字体文件,可以一次性安装多个字体。
5. `SHX`:这是CAD系统自带的一种字体文件,符合了CAD的文字标准,但不支持中文等亚洲语言文字。
6. `EOT`:这是早期网页浏览器使用的字体格式,但现在已经很少使用。
7. `WOFF`:这是一种网页字体格式,可以在网页中使用,也可以转换为`.TTF`格式用于桌面应用。
- 查看字体文件
- 在线字体解析网站:https://font.qqe2.com/
- 可以直接把文件拖动到在线网址
3. 找文件与网页对应关系
三. python处理字体
#### 1. 工具库
```
pip install fontTools # 使用这个包处理字体文件
```
#### 2. 字体读取
```python
from fontTools.ttLib import TTFont
# 加载字体文件:
font = TTFont('file.woff')
# 转为xml文件:可以用来查看字体的字形轮廓、字符映射、元数据等字体相关的信息
font.saveXML('file.xml')
```
#### 3. 字体读取
```python
from fontTools.ttLib import TTFont
# 加载字体文件:
font = TTFont('file.woff')
kv = font.keys()
print(kv)
```
字体文件不仅包含字形数据和点信息,还包括字符到字形映射、字体标题、命名和水平指标等,这些信息存在对应的表中:
| 表 | 作用 |
| ---- | -------------- |
| cmap | 字符到字形映射 |
| glyf | 字形数据 |
| head | 字体标题 |
| hhea | 水平标题 |
| hmtx | 水平指标 |
| loca | 索引到位置 |
| maxp | 最大限度的 |
| name | 命名 |
| post | 后记 |
#### 4. 获取请求到的字体code和name的对应关系
```
code_name_map = font_aa.getBestCmap()
```
#### 5. 获取字体坐标信息
```python
font_aa = TTFont('file.woff')
# 获取请求到的字体形状
glyf = font_aa['glyf']
#font['glyf'][字体编码].coordinates
font_aa['glyf']['uni4E94'].coordinates
```