赞
踩
在爬网站时候,有时会遇到类似以下代码
<span class="stonefont">.</span>
然而网页上显示的是数字’9.5’,这其实是一种反扒机制–字体反爬。
字体反爬,就是网站将一些关键字替换为网站自己的字体,这样在网页上字体会正常显示,但是当爬取下来的时候,经过字体加密的字符都是乱码的,无法查看。
应对这种反爬机制的思路就是找到html上的数字源码和实际字体之间的映射关系。
通常这类网站都会定义@font-face,其中包含了网站的字体文件,名称是随机的。
在浏览器的开发者工具中选择“字体”,也能直接找到字体文件。
要了解字体反爬机制,就必须好好了解一下字体文件。这里以woff为例。
打开woff文件,网上有推荐用百度字体编辑器,不过我打开会报错,所以还是推荐使用fontcreator。
上图是打开11.woff文件后显示内容。
一共就2行,下面一行忽略前2个格子,后面10个格子就是数字字体,上面一行是每个字体对应的编码。这个编码和本文开头的html源码中的编码是可以对应起来的。
<span class="stonefont">.</span>
如果把&#x去掉后,后面4位和11.woff中编码的后4位一致,就能找到对应的数字。
-->$f6c7-->9
-->$e807-->5
所以,.-->9.5
下面就是要在程序中操作字体文件。python中可以用fontTools来实现。
这个库很重要,必须好好研究才能理解反爬实现原理。
先简单操作一下
font = TTFont('./fonts/11.woff')
gly_list = font.getGlyphOrder()[2:]
print gly_list
结果如下
['uniF6C7', 'uniF7C5', 'uniF53B', 'uniE765', 'uniF2E2', 'uniE764', 'uniF638', 'uniE807', 'uniE919', 'uniEB35']
和fontcreator中显示的略有不同,但是很容易可以发现对应关系。
进一步研究
在fontcreator中双击9字,显示如下
在图的最下方显示"2 contours,57 points"
contours这个词如果学习过opencv会很熟悉,意思是轮廓,opencv很多内容都是在研究这个词。
2 contours,57 points表示11.woff文件中用2个轮廓57个点来表示“9”这个数字。
上图中沿着9字边缘的小方块和小圆圈就是这些点。
这些点构成了9字的轮廓。
在上图中点住9,可以移动,显示如下
看到嘛,有2个图层。
左边包含15个点,右边这个包含42个点。
现在知道“9”字为什么有2个轮廓了吧。
继续利用fontTools,看看字体"9"的具体信息
font = TTFont('./fonts/11.woff')
print font['glyf']['uniF6C7'].__dict__
结果如下
{'numberOfContours': 2, 'yMax': 711, 'coordinates': GlyphCoordinates([(142, 151),(164, 89),(215, 35),(264, 35),(307, 32),(337, 54),(368, 73),(376, 105),(408, 137),(422, 191),(428, 217),(435, 273),(435, 300),(435, 3
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。