一些网站 会将部分内容进行加密,防止爬虫简单的获取到信息
最近 在爬取58同城的品牌公寓时 遇到租房信息里的价格 爬下来是看不懂的字体

爬虫 解析 加密字体 例子58 同城
一些数据在浏览器里面显示是正常的, 但是渲染前和渲染后的html源码都看不到字体, 渲染前看到的是16进制的4位字符, 渲染后看到的是一些方块.
然后分析了一下网站的源码,发现他是由base64 加密之后生成的字体
爬虫 解析 加密字体 例子58 同城
那我们就可以通过正则匹配出来进行处理
首先在html源码里面找到woff字体的base4编码, 保存成”font.woff”字体文件, 用fontTools库将这个字体文件存储为”font.xml”文件.
爬虫 解析 加密字体 例子58 同城
爬虫 解析 加密字体 例子58 同城

爬虫 解析 加密字体 例子58 同城
然后在xml里面找到TTGlyph字段, 这个字段下面的 子字段都是用来画字符(包括中英文数字)的坐标. 同一个字符的坐标是一样的. 解析xml, 然后把这些坐标的属性字典按顺序都存到一个list里面, 然后序列化成json(加sort_keys=True参数)字符串. 用这个字符串当key, value是实际的字符, 存成一个constant_dict. 每次遇到新网页, 取出这个字符串, 然后根据字符串从constant_dict获取实际的字符.

我们也可以借助一个FontCreator 软件 将font.woff”字体文件查看
爬虫 解析 加密字体 例子58 同城
每个字体都对应了一个uni字符,和上面方法一样序列化成json(加sort_keys=True参数)字符串. 用这个字符串当key, value是实际的字符, 存成一个constant_dict. 每次遇到新网页, 取出这个字符串, 然后根据字符串从constant_dict获取实际的字符.

但是 事实并没有这么简单 ,它的每个网页都是变化的 对应关系并不是完全一致。所以这个时候我们就可以借助tesseract工具 来识别字体。
爬虫 解析 加密字体 例子58 同城

这个例子还是相比较简单点的,我们还可以根据每个字符的点阵,找出对应关系,但是如果字体样子改变,对应关系也就乱了。

分类:

技术点:

相关文章: