0%

今天,我终于弄懂了字体反爬是个啥玩意!

大家好,我是四毛,欢迎关注我的公众号。

有什么想要交流的可以在后台第一时间私我。

今天的文章内容主要是关于字体反爬。

目前已知的几个字体反爬的网站是猫眼,汽车之家,天眼查,起点中文网等等。 以前也看过这方面的文章,今天跟个老哥在交流的时候,终于实操了一把,弄懂了字体反爬是个啥玩意。下面听我慢慢道来。

本文用到的第三方库

fontTools

1、目标网站

url = “https://su.58.com/qztech/

2、反爬虫机制

网页上看见的 后台源代码里面的 从上面可以看出,生这个字变成了乱码,请大家特别注意箭头所指的数字。

3、解决

1、确定反爬方法

在看了别人的解析文章之后,确定采取的是字体反爬机制,即网站定义了字体文件,然后进行相应的查找替换,在前端看起来,是没有任何差异的。其实从审查元素的也是可以看到的: 和大众点评的反爬差不多,都是通过 css 搞得。

2、寻找字体文件

以上面方框里的”customfont“为关键词搜了一下,发现就在源代码里面: 而且还有 base64,直接进行解密,但是解密出来的其实是乱码,这个时候其实要做的很简单,把解密后的内容保存为.ttf格式即可。

ttf 文件: *.ttf 是字体文件格式。TTF(TrueTypeFont)是 Apple 公司和 Microsoft 公司共同推出的字体文件格式,随着 windows 的流行,已经变成最常用的一种字体文件表示方式。 @font-face 是 CSS3 中的一个模块,主要是实现将自定义的 Web 字体嵌入到指定网页中去。

因为我们要对字体进行研究,所以必须将它打开,这里我是用的是FontCreator,打开以后是这个样子(其实很多字,在这里为了看的清楚,所以只截了下面的图): 很明显,每个字可以看到字形和字形编码。 观察现在箭头指的地方和前面箭头指的地方的数字是不是一样啊,没错,就是通过这种方法进行映射的。 所以我们现在的思路似乎就是在源代码里找到箭头指的数字,然后再来字体里找到后替换就行了。 恭喜你,如果你也是这么想的,那你就掉坑里了。 因为每次访问,字体字形是不变的,但字符的编码确是变化的。因此,我们需要根据每次访问,动态解析字体文件。 字体 1: 字体 2: 所以想通过写死的方式也是行不通的。 这个时候我们就要对字体文件进行更深一步的研究了。 3、研究字体文件 刚刚的.ttf 文件我们是看不到内部的东西的,所以这个时候我们要对字体文件进行转换格式,将其转换为 xml 格式,然后来查看: 具体操作如下:

1
2
3
from fontTools.ttLib import TTFont
font_1 = TTFont('58_font_1.ttf')
font_base.saveXML('font_1.xml')

xml 的格式如下: 文件很长,我只截取了一部分。 仔细的观察一下,你会发现~这俩下面的 x,y,on 值都是一毛一样的。所以我们的思路就是以一个已知的字体文件为基本,然后将获取到的新的字体文件的每个文字对应的 x,y,on 值进行比较,如果相同,那么说明新的文字对就 可以在基础字体那里找到对应的文字,有点绕,下面举个小例子。 假设: “我” 在基本字体中的名为 uni1,对应的 x=1,y=1,n=1 新的字体文件中,一个名为 uni2 对应的 x,y, n 分别于上面的相等,那么这个时候就可以确定 uni2 对应的文字为”我”。 查资料的时候,发现在特殊情况下,有时候两个字体中的文字对应的 x,y 不相等,但是差距都是在某一个阈值之内,处理方法差不多,只不过上面是相等,这种情况下就是要比较一下。 其实,如果你用画图工具按照上面的 x 与 y 值把点给连起来,你会发现,就是汉字的字形~ 所以,到此总结一下:

一、将某次请求获取到的字体文件保存到本地[基本字体]; 二、用软件打开后,人工的找出每一个数字对应的编码[ 一定要保证顺序的正确,要不然会出事]; 三、我们以后访问网页时,需要保存新字体文件; 四、用 Fonttools 库对基本字体与新字体进行处理,找 到新的字体与基本字体之间的映射; 五、替换;

4、上代码

微信里上代码真的太丑了, 还是算了吧,微信后台关键词“字体加密” 即可获取 github 地址。 看一下成果

总结

其实这个流程最大的问题就是我们人工录入的基本字体的字典数据有可能是会发生变化的,这就导致我们后面还要手动去改。 现在,如果你已经看懂了本文,那么还不快去其他几个网站试试? 如果有任何问题,欢迎交流。