天天看点

glidedsky挑战-字体反爬2

为了避免某某官方网站,本次记录同样也是 "glidedsky" 网站中的反爬虫题目,只要明白,其它网站理论都差不一样。

相关网站:http://glidedsky.com/level/web/crawler-font-puzzle-2

网站截图

glidedsky挑战-字体反爬2

打开页面是这样的

glidedsky挑战-字体反爬2

页面h5参数是这样的

glidedsky挑战-字体反爬2

蒙蔽中。。。

探究过程:

这个跟我们需要的0-9个阿拉伯数字有什么关系?

没办法了,找与中文汉字相关的信息吧。

找个这个信息:

glidedsky挑战-字体反爬2

字体的样式。那就开始找对应的css样式,看看到底是什么

于是找到了这个:

glidedsky挑战-字体反爬2

可以看到,这是一个字体数据。使用的base64编码。

这时我们就把很长的一段数据,通过解码,写入到文件,看看里面,到底是什么。

# 获取字体数据
ttf_str = re.search(r'base64,(.*?)\) format',woff_str).group(1)
 # 将字体数据保存到本地
with open('font2.ttf', 'wb',) as fw:
    fw.write(base64.b64decode(ttf_str))
           

使用High-Logic FontCreator工具打开font.ttf文件看看里面是什么字体格式

glidedsky挑战-字体反爬2

打开,再和网页中显示对比一下,0-9果然一致。

那么肯定是通过一定的关系映射到页面中的。

查看关联关系:

glidedsky挑战-字体反爬2

看看这三个是否有关系:

把字体中的编码取出来。解析一下,

glidedsky挑战-字体反爬2

果不其然。

到这里可以明白,这个映射关系是:

页面中的中文字的编码,就是对应字体集合中的字体,同时通过页面映射到页面显示出来。

解题思路:

1、从页面中把字体下载下来,保存起来。

2、获取页面中对应的映射中文字符。

3、解析字体文件,获取字体中的编码。

4、通过映射,找到对应的字体,解析出数字。

解题过程:

既然如此,那就干呗!!!

下载字体(部分代码):

glidedsky挑战-字体反爬2

获取中文字符(部分代码):

glidedsky挑战-字体反爬2

解析字体(部分代码):

这里说明下,0-9的数字是自己通过对应的关系生成的。 在字体库中,0-9数字的位置都是在[1,10]的位置

glidedsky挑战-字体反爬2

可以得出这样的信息:

glidedsky挑战-字体反爬2

字体间映射(部分代码):

我这里是通过字典去映射的,key为字体,value为数字值:

glidedsky挑战-字体反爬2

产生结果:

glidedsky挑战-字体反爬2

其它说明:

还是那句话:应于网站要求,这里只说思路和提供部分代码。

在解析字体过程中,注意字体编码问题,有些看起来同一字,但是编码不同

glidedsky挑战-字体反爬2

这个问题,我也不很明白,可能是在请求页面时,编码是utf-8编码,而我用的是通过chr()进行ascii编码,具体深入没研究,有明白的欢迎留言。

继续阅读