目前网页的字体多样化完全可以自定义,常见有eot,woff,ttf格式类型
本次爬虫就针对以woff格式的字体而言:
先看看不做措施造成的影响:
http://maoyan.com/ 以猫*票房信息为例
调试模式下票房数字是乱码的,在源代码中则是“&#xxxxx”的一窜字符
故,不做措施直接爬取的数据是乱码的,就是调试模式中看的内容
怎么做
在源码中我们可以看到有woff的踪迹
这个woff的连接就是该网站数字采用的字体,我们要解析就必须下载该字体
下载下来后,我们可以借助font creator工具打开woff查看样式
可以看到两个部分,uniE5B3 对应着6,其实将uniE5B3做一些处理比如去掉uni后,剩下的4位就是源码里的,可是代码并不知道这个对应的就是6,
而且,我们发现一个问题,就是这个woff文件并不是唯一的,每次刷新网站,再次查看源码时,woff文件是不一样的,也就说明数字6并不是只有一个uniE5B3相对应
我们将多个woff文件下载下来转换成xml格式做个对比
怎么转换呢,可以借助TTFont库
我们打开xml比较,发现坐标相同数字的xy是不变的
所以,在保存一个woff文件作为bsaefonts的情况下,下载爬取网站的woff文件,匹配坐标不变对应的uniXXXX,来取出正确的数字
下载第一份woff作为basefonts,并将uniXXXX和对应的数字记录到base_fonts和base_nums中,而实际爬取中的woff作为onlinefonts
我们要对比坐标xy即字体轮廓,来判断数字的取值
依次循环比较ffont['glyf'][name]即可,这里的name就是字符集编码unixxxx
若两者的轮廓相等,即可以做替换,将base_fonts对应的base_num替换给源码页面中的字符“&#xXXXX”(暂且称之为源码符),这里将所有能构成的0-9的源码符和对应的正确数字做成字典,后续爬取出来的,用字典替换即可
完整代码: