反爬技术之“字体反爬” |
您所在的位置:网站首页 › oppo自定义字体字体在哪 › 反爬技术之“字体反爬” |
本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。 字体反爬的背景字体反爬,也是一种常见的反爬技术,相信很多爬虫工作者都接触过,这其实不是一种常规的反爬手段,它其实是页面和前端字体文件想配合完成的一个反爬策略。 最早使用字体反爬技术的有58同城、汽车之家等,发展到现在很多主流APP也使用了字体反爬技术和爬虫工作者进行对抗,字体反爬从一开始的单纯依靠一个写死的字体文件升级成现在最新动态的字体文件。而字体反爬的功课也有一个开始的解析字体文件做数据映射到现在依靠KNN来做动态映射,算是经历了一个又一个光辉的“升级阶段”。 本篇文章主要讲如何攻克入门级的字体反爬技术。 入门级别的字体反爬技术是通过固定的字体文件进行数据替换的 字体反爬原理首先我们先理解字体反爬的原理,就是前端工程师通过自定义的字体来替换页面中某些关键的数据 因为是自定义的字体,所以如果不使用正确的解码方式来进行匹配,我们爬取的时候就无法获得正确的内容 那么在HTML中如何使用自定义字体呢? 答案就是使用@font-face @font-face { font-family: ; src: [, ]*; ; }里面的font-family也就是一个特定的名字,src就表示你需要引用的具体的文件,而这个文件就是字体文件,一般是ttf类型,eot类型或者是woff类型,woff类型的文件运用比较广泛,所以大家一般碰到的都是woff类型的文件。 那么woff文件中的内容是什么呢?他是怎么把数据进行数据替换的呢? 我们打开一个woff字体文件,需要使用工具辅助。 FontCreator工具 下载地址在线FontEditor工具地址这里我先随便给一个woff字体文件 复制连接打开 //k3.autoimg.cn/g1/M00/D2/8E/wKgHGFsUz0eAJlMWAABj9Bn3RMw39…ttf 我们把FontCreator下载下来,传来一个我们之前准备好的woff文件看看效果
在对抗反爬的时候,解析得到的woff文件得到一定顺序的编码集再结合在FontCreator中的字符集得到字符编码字典,在我们解析HTML源码的时候替换就行了。 这里补充一点就是你每次访问加载的字体文件中的字符的编码可能是变化的,就是说网站有多套的字体文件。 既然编码是不固定的,那就不能用编码的一一对应关系来处理字体反爬。这里要用到上面说的三方库fontTools,利用fontTools可以获取每一个字符对象,这个对象你可以简单的理解为保存着这个字符的形状信息。而且编码可以作为这个对象的id,具有一 一对应的关系。 安装第三方库 fontTools命令: pip install fontTools 模拟对抗字体反爬引用第三方库 from fontTools.ttLib import TTFont这里我们手动把一组编码和字符的对应关系提出来,在实际情况中这种关系在网站自身的字体文件里,要通过程序存进列表里,这里省略一些步骤。 uni_list = ['uniF848', 'uniE2A8', 'uniEA5D', 'uniE51B', 'uniE335', 'uniE42F', 'uniF373', 'uniF649', 'uniE052', 'uniE7A3'] word_list = ['9', '2', '8', '4', '3','1','6','7','5','0']加载字体文件 font1 = TTFont('02.ttf')获取cmap节点code与name值映射,返回字典 print(font1.getBestCmap())#可以看到字体和对应的编码信息下面我们把编码逐个提出来,获取这个编码对应文字的 x、y坐标信息(每个元素是(x,y)元组),放进一个列表中。 在遍历word_list中的每个文字,通过自定义的comp函数比较其坐标,对于一个字符如果每组坐标都相同则说明这个编码与这个字符相对应。 from fontTools.ttLib import TTFont def comp(l1, l2): # 定义一个比较函数,比较两个列表的坐标信息是否相同 if len(l1) != len(l2): return False else: mark = 1 for i in range(len(l1)): if abs(l1[i][0]-l2[i][0]) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |