什么是字体反扒
以实习僧网站为例,在网页是看数据都是正常的,而查看源代码,则可以发现有部分数据是乱码,这个就是字体反扒了
第一步
请求网页获取源代码,这个太简单了,不过多解释。
第二步
查找并获取字体文件。
在源代码中查找@font-face样式字样,这个就是自定义字体的样式了。
然后打开开发者工具,找到该字体的请求链接进行保存即可。
font_data = requests.get('https://www.shixiseng.com/interns/iconfonts/file?rand=0.4297923496159244',
headers=self.headers).content
with open('实习僧.woff', 'wb') as f:
f.write(font_data)
第三步
对字体文件进行解析获取对应关系
引用模块
from fontTools.ttLib import TTFont
import re
TTFont模块是处理字体文件的第三库,需要自行下载
# 初始化字体文件
font = TTFont('实习僧.woff')
# 将字体文件保存为xml格式
font.saveXML("./font.xml")
# 读取字体的xml格式文件
with open('./font.xml') as f:
xml = f.read()
# 对xml文件解析
keys = re.findall('<map code="(0x.*?)" name="uni.*?"/>', xml)[:99]
values = re.findall('<map code="0x.*?" name="uni(.*?)"/>', xml)[:99]
# 解析字体文件的关系
for i in range(len(values)):
if len(values[i]) < 4:
values[i] = ('\\u00' + values[i]).encode('utf-8').decode('unicode_escape')
else:
values[i] = ('\\u' + values[i]).encode('utf-8').decode('unicode_escape')
word_dict = dict(zip(keys, values))
print(word_dict)
需要注意的是,在使用re模块对xml文件进行解析的使用,需要获取的内容是
<map code="0xe04e" name="uni653F"/>
中的code和name属性。 code属性值则是去掉0x这就是在源码中的字样,而name属性则是这个字体的属性,对字体解析则就是对这个属性进行解析获取对应关系的
最后输出的内容则是:
第4步
使用获取到的对应关系将网页上的数据进行替换即可。