字体反爬也就是自定义字体反爬,经过调用自定义的woff文件来渲染网页中的文字,而网页中的文字再也不是文字,而是相应的字体编码,经过复制或者简单的采集是没法采集到编码后的文字内容!html
近期在爬取天眼查某公司详情页遇到了字体反爬,通过屡次测试,终于解决了字体反爬python
首先咱们来看一下字体反爬git
此图能够看出源代码数字跟页面显示的内容是不同的,在调试器中看到它有一个类tyc-numwindows
此图能够看出类tyc-num存放的是一个字体,经过network获取这个字体工具
此图能够看出正常的字体数字是1234567890而如今显示的是7540129863它是顺序打乱的,把tyc-num.woff下载过来,下载过来以后发现windows是查看不了的,我用的是在线工具查看测试
在线工具连接:FontEditor字体
此图能够发现索引2对应的是4,说明第4个数字是0,经过Python对woff转换成xml编码
from fontTools.ttLib import TTFont font = TTFont('tyc-num.woff') font.saveXML('tyc-num.xml')
查看xml文件spa
此图发现id2对应是4跟在线查看器是同样的,那就找到了对应关系3d
安装 fontTools
pip install fontTools
上代码(代码更新2019-01-21|19:23:16) PS:发现某些公司时间仍是对不上,代码更新了,上面思路是同样的
#!/usr/bin/env python # -*- coding:utf-8 -*- from fontTools.ttLib import TTFont import re font = TTFont('tyc-num.woff') # 打开tyc-num.woff font.saveXML('tyc-num.xml') # 保存为tyc-num.xml with open('tyc-num.xml', 'r') as f: xml = f.read() # 读取tyc-num.xml赋值给xml GlyphID = re.findall(r'<GlyphID id="(.*?)" name="(\d+)"/>', xml) # 得到对应关系 GlyphIDNameLists = list(set([int(Gname) for Gid, Gname in GlyphID])) # 对应关系数量转换 # print(GlyphIDNameLists) DigitalDicts = {str(i): str(GlyphIDNameLists[i - 2]) for i in range(2, len(GlyphIDNameLists)+2)} # 数字对应关系的字典推导式 # print(DigitalDicts) GlyphIDDicts = {str(Gname): DigitalDicts[Gid] for Gid, Gname in GlyphID} # 经过数字对应关系生成源代码跟页面显示的字典推导式 print('-' * 39 + '数字对应关系的字典推导式' + '-' * 39) print(DigitalDicts) print('-' * 27 + '经过数字对应关系生成源代码跟页面显示的字典推导式' + '-' * 27) print(GlyphIDDicts)
代码运行结果