字体反爬

1.页面看到的文字实际由另一个字经过字体库映射而得 

2.网页会在加载的时候载入字体库 (可能有多个字体库),将此字体下载下来,通过font creator(字体工具)打开可以看到对应表,遍找到了映射关系。(笨方法到这直接对着写map就可以了)

3.用python 将.woff的字体文件 转成 XML 读取其中的映射。下图为第一层映射,根据code 可以得到 name (简单的一步映射就直接能得到结果)。

4.天眼查这个还需要再做一层,如图将上一步得到的name值 映射得到id值 ,这个id值就是 刚才fontcreator 看到的汉字的排序。在这里做个map对应即可得到映射汉字。

5.上述方法也还是要写一个map 。下图是"_#103" 所对应的字形,python的这个库肯定有一个方法直接根据字形得到汉字的 ,不然贼蠢,但我没找到。。。欢迎大家补充一下。

附录代码:

from fontTools import unichr
from fontTools.ttLib import TTFont
import re

'''
解析字体方法1:
'''
font = TTFont('./tyc-num.woff')  # 打开文件
# font.saveXML('./tyc-num.xml')

mappings = {}
for k, v in font.getBestCmap().items():
    if v.startswith('uni'):
        # 形如 <map code="0xe040" name="uni45"/>  可直接转换得到结果
        mappings['{:x}'.format(k)] = unichr(int(v[3:], 16))
    else:
        mappings['{:x}'.format(k)] = v

key = re.search('.*u([0-9a-f]{4}).*', str('电'.encode('unicode_escape'))).group(1)
value = mappings[key]
# 得到另一个映射
id = font.getGlyphID(value)

# 根据下载的字体弄个map 再根据 id做key  获取对应value
maps = {'1': '苏', '2': '你'}

猜你喜欢

转载自blog.csdn.net/xkx_07_10/article/details/82429812