爬虫 - 动态字体 -破解
爬取的woff字体动态变化,且字体坐标会随机偏移一点点(如下图1.woff和2.woff),无法形成统一的'unicode——字体坐标矩阵'映射,只能求两矩阵的相识度,这里使用距离相识度(参考机器学习KNN分类算法概念)。
1.woff:

2.woff:

放大后两者是有区别的:


解决办法:
以2.woff为标准,人为设置基础矩阵字体映射,然后读取1.woff,按字体坐标信息与2.woff的最大相识度求出1.woff的字体映射表。
from fontTools.ttLib import TTFont
import numpy as np```
```# 比较两个数组的欧式距离
def compare_axis(axis1, axis2):
# 以坐标(0,0)补填空缺
if len(axis1) < len(axis2):
axis1.extend([0, 0] for _ in range(len(axis2) - len(axis1)))
elif len(axis2) < len(axis1):
axis2.extend([0, 0] for _ in range(len(axis1) - len(axis2)))
# 将列表转换为 Numpy 中的数组
axis1 = np.array(axis1)
axis2 = np.array(axis2)
# 计算并返回欧式距离
return np.sqrt(np.sum(np.square(axis1 - axis2)))```
```# 读取font信息
def read_font(path):
'''
:param path: 文件路径
:return: 读取后的unicode;字体矩阵映射字典
'''
font = TTFont(path)
series = font.getGlyphNames()
arr_dict = {}
for i in series:
arr_dict[i] = list(font['glyf'][i].coordinates)
del arr_dict['.notdef']
return arr_dict```
# 解析woff文件,返回解析后映射字典
```def parse_font_code(woff_path):
'''
:param woff_name: 传入待解码woff文件路径
:return: 解码后的{'unicode':num,...}
'''
# 生成基础矩阵字体映射
base_dict = {
'unia173': 6,
'unie794': 3,
'unif841': 2,
'unia735': 0,
'unif312': 8,
'unif231': 1,
'unic574': 9,
'unic275': 4,
'unic456': 5,
'unif356': 7,
}
base_code_dict = read_font('2.woff')
new_code_dict = read_font(woff_path)
# print(new_code_dict)
res_dict = {}
for new_k, new_v in new_code_dict.items():
res = float('inf')
for base_k, base_v in base_code_dict.items():
dis = compare_axis(new_v, base_v)
if dis < res:
res = dis
res_dict[new_k] = base_k
for i, v in res_dict.items():
res_dict[i] = base_dict[v]
return res_dict```
```if __name__ == '__main__':
print(parse_font_code('1.woff'))```

浙公网安备 33010602011771号