当前位置:   article > 正文

2019-12-21 爬网页13-字体反爬(woff,fontTools,sklearn(knn))_反爬在class利用woff

反爬在class利用woff

在爬网站时候,有时会遇到类似以下代码

<span class="stonefont">&#xf6c7;.&#xe807;</span>
  • 1

然而网页上显示的是数字’9.5’,这其实是一种反扒机制–字体反爬

字体反爬,就是网站将一些关键字替换为网站自己的字体,这样在网页上字体会正常显示,但是当爬取下来的时候,经过字体加密的字符都是乱码的,无法查看。

应对这种反爬机制的思路就是找到html上的数字源码和实际字体之间的映射关系。

通常这类网站都会定义@font-face,其中包含了网站的字体文件,名称是随机的。
在浏览器的开发者工具中选择“字体”,也能直接找到字体文件。

要了解字体反爬机制,就必须好好了解一下字体文件。这里以woff为例。

打开woff文件,网上有推荐用百度字体编辑器,不过我打开会报错,所以还是推荐使用fontcreator。
图一上图是打开11.woff文件后显示内容。
一共就2行,下面一行忽略前2个格子,后面10个格子就是数字字体,上面一行是每个字体对应的编码。这个编码和本文开头的html源码中的编码是可以对应起来的。

<span class="stonefont">&#xf6c7;.&#xe807;</span>
  • 1

如果把&#x去掉后,后面4位和11.woff中编码的后4位一致,就能找到对应的数字。

&#xf6c7-->$f6c7-->9
&#xe807-->$e807-->5
所以,&#xf6c7;.&#xe807;-->9.5
  • 1
  • 2
  • 3

下面就是要在程序中操作字体文件。python中可以用fontTools来实现。
这个库很重要,必须好好研究才能理解反爬实现原理。

先简单操作一下

font = TTFont('./fonts/11.woff')
gly_list = font.getGlyphOrder()[2:]
print gly_list
  • 1
  • 2
  • 3

结果如下

['uniF6C7', 'uniF7C5', 'uniF53B', 'uniE765', 'uniF2E2', 'uniE764', 'uniF638', 'uniE807', 'uniE919', 'uniEB35']
  • 1

和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__
  • 1
  • 2

结果如下

{'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
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/998585
    推荐阅读
    相关标签
      

    闽ICP备14008679号