字体反爬详解

目前网页的字体多样化完全可以自定义,常见有eot,woff,ttf格式类型

本次爬虫就针对以woff格式的字体而言:

先看看不做措施造成的影响:

http://maoyan.com/ 以猫*票房信息为例

调试模式下票房数字是乱码的,在源代码中则是“&#xxxxx”的一窜字符

 

 

字体反爬详解_第1张图片

字体反爬详解_第2张图片

故,不做措施直接爬取的数据是乱码的,就是调试模式中看的内容

 

怎么做

 

在源码中我们可以看到有woff的踪迹

字体反爬详解_第3张图片

这个woff的连接就是该网站数字采用的字体,我们要解析就必须下载该字体

字体反爬详解_第4张图片

下载下来后,我们可以借助font creator工具打开woff查看样式

字体反爬详解_第5张图片

可以看到两个部分,uniE5B3 对应着6,其实将uniE5B3做一些处理比如去掉uni后,剩下的4位就是源码里的,可是代码并不知道这个对应的就是6,

而且,我们发现一个问题,就是这个woff文件并不是唯一的,每次刷新网站,再次查看源码时,woff文件是不一样的,也就说明数字6并不是只有一个uniE5B3相对应

我们将多个woff文件下载下来转换成xml格式做个对比

怎么转换呢,可以借助TTFont库

字体反爬详解_第6张图片

 

我们打开xml比较,发现坐标相同数字的xy是不变的

字体反爬详解_第7张图片字体反爬详解_第8张图片

所以,在保存一个woff文件作为bsaefonts的情况下,下载爬取网站的woff文件,匹配坐标不变对应的uniXXXX,来取出正确的数字

下载第一份woff作为basefonts,并将uniXXXX和对应的数字记录到base_fonts和base_nums中,而实际爬取中的woff作为onlinefonts

字体反爬详解_第9张图片

字体反爬详解_第10张图片

我们要对比坐标xy即字体轮廓,来判断数字的取值

依次循环比较ffont['glyf'][name]即可,这里的name就是字符集编码unixxxx

若两者的轮廓相等,即可以做替换,将base_fonts对应的base_num替换给源码页面中的字符“&#xXXXX”(暂且称之为源码符),这里将所有能构成的0-9的源码符和对应的正确数字做成字典,后续爬取出来的,用字典替换即可

字体反爬详解_第11张图片

完整代码:

字体反爬详解_第12张图片字体反爬详解_第13张图片

点击下载完整代码

你可能感兴趣的:(python,爬虫)