现在越来越多的网站为了反爬虫已经开始在字体上下功夫了,主要表现为在浏览器上文字显示正常,但是用爬虫抓取下来的却是乱码。比如58同城、猫眼电影、实习僧等网站。不过一般字体反爬只会针对一些数字而不是全部文字,为什么这样?看下面的细节就知道啦。
字体反爬原理:
-
网页开发者自己创造一种字体,因为在字体中每个文字都有其代号,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使获取到了网页中的文本内容,也只是获取到文字的代号,而不是文字本身。
-
因为创造字体费时费力,并且如果把中国3000多常用汉字都实现,那么这个字体将达到几十兆,也会影响网页的加载。一般情况下为了反爬虫,仅会针对0-9以及少数汉字进行自己单独创建,其他的还是使用用户系统中自带的字体。
寻找自定义字体:
-
一般情况下为了考虑网页渲染性能,通常网页开发者会把自定义的字体编码成
base64
的方式,因此我们可以到网页中找到@font-face
属性,然后获取里面的base64
代码,再用Python
代码进行解码,然后再保存本地。示例:view-source:https://www.shixiseng.com/intern/inn_a7xabqqr4f9u
。示例图如下:(点击可查看大图)
-
如果没有使用
base64
,还有另外一种方式,就是直接把字体文件放到服务器上,然后前端通过@font-face
中的url函数进行加载。示例:https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face
。
分析字体:
-
分析字体需要将字体转换成
xml
文件,然后查看其中的cmap
和glyf
中的属性。其中cmap
存储的是code
和name
的映射,而glyf
下存储的是每个name
下的字体绘制规则。cmap存储code和name的关系:
glyf存储字体的形状:
-
从第1步中我们知道了
name
对应的字体的绘制规则,但是还是不知道字体是长什么样子,那么可以通过一款叫做FontCreator
的软件来打开.tff
的字体文件,这样就可以看到每个name
对应的字体最终的呈现效果。(FontCreator是一款制作字体的工具,下载地址:https://www.high-logic.com/FontCreatorSetup-x64.exe
,这款软件有30天的试用期)。 -
字体反爬解决方案:
-
在网页中,直接显示的是字体的
code
,而不是name
。并且网页开发者为了增加爬虫的难度,有可能在多次请求之间code->name->最终字体
的映射会发生改变。但是最终字体的形状是不会改变的,因此我们可以通过形状对比来进行判断。 -
我们可以通过分析字体,得出每个字体形状对应的文字,然后保存到一个字典中。以后再请求网页的时候,就进行反向解析,先获取字体的形状,再通过字体形状反向获取代号所对应的具体文字内容。
大家可以根据本文的分析,自行到58同城,猫眼,包括美团上去看看,用本文的思路,看看能不能解决字体反爬的问题。有疑问欢迎留言~