为了避免某某官方网站,本次记录同样也是 "glidedsky" 网站中的反爬虫题目,只要明白,其它网站理论都差不一样。
相关网站:http://glidedsky.com/level/web/crawler-font-puzzle-2
网站截图
打开页面是这样的
页面h5参数是这样的
蒙蔽中。。。
探究过程:
这个跟我们需要的0-9个阿拉伯数字有什么关系?
没办法了,找与中文汉字相关的信息吧。
找个这个信息:
字体的样式。那就开始找对应的css样式,看看到底是什么
于是找到了这个:
可以看到,这是一个字体数据。使用的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文件看看里面是什么字体格式
打开,再和网页中显示对比一下,0-9果然一致。
那么肯定是通过一定的关系映射到页面中的。
查看关联关系:
看看这三个是否有关系:
把字体中的编码取出来。解析一下,
果不其然。
到这里可以明白,这个映射关系是:
页面中的中文字的编码,就是对应字体集合中的字体,同时通过页面映射到页面显示出来。
解题思路:
1、从页面中把字体下载下来,保存起来。
2、获取页面中对应的映射中文字符。
3、解析字体文件,获取字体中的编码。
4、通过映射,找到对应的字体,解析出数字。
解题过程:
既然如此,那就干呗!!!
下载字体(部分代码):
获取中文字符(部分代码):
解析字体(部分代码):
这里说明下,0-9的数字是自己通过对应的关系生成的。 在字体库中,0-9数字的位置都是在[1,10]的位置
可以得出这样的信息:
字体间映射(部分代码):
我这里是通过字典去映射的,key为字体,value为数字值:
产生结果:
其它说明:
还是那句话:应于网站要求,这里只说思路和提供部分代码。
在解析字体过程中,注意字体编码问题,有些看起来同一字,但是编码不同
这个问题,我也不很明白,可能是在请求页面时,编码是utf-8编码,而我用的是通过chr()进行ascii编码,具体深入没研究,有明白的欢迎留言。