1.我的目的
- 汽车之家对某些字体进行了反爬虫操作,直接获取是一堆乱码,这次要做的是对这些乱码进行转化,转化为我们想要的符号\汉字
2.前提知识
-
首先得了解一下字体反爬虫是什么意思:
- 当前css可以指定一个@font-face,表示一种从服务器下载的自定义字体,如果需要使用的时候就可以使用font-face;而浏览器一般在加载网页的时候也会自动去下载服务器自定义的字体。
- 不同的浏览器对应不同的声明方式:
@font-face { font-family: '字体名称'; src: url('http://www.example.com/字体名称.eot'); /* IE9 Compat Modes */ src: url('http://www.example.com/字体名称.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('http://www.example.com/字体名称.ttf') format('truetype'), /* Safari, Android, iOS */ url('http://www.example.com/字体名称.woff') format('woff'), /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ url('http://www.example.com/字体名称.svg?#字体名称') format('svg'); /* Legacy iOS */}
-
这个自定义字体是如何做到的:
- 简单的来说就是给特定字符和特定结果做了一个映射关系,每次根据字符去查找,然后将映射的结果返回显示
- 下面就是一个自定义字体的xml文件,name就表示每一种字体,name对象中定义了每一种字体
-
字体反爬虫的手段
- 不同xml文件中的每一种字体的命名每次都会变化
- 不同xml文件中的同一种字体的像素点位置会有变化(这次要应对的是这一种)
- 不同xml文件中的同一种字体的像素点个数会有变化·····
3.实现过程
- 1.在网页源代码处查找font-face,确实是有的,通过它提供的url下载对应自定义字体文件(刷新页面,多下载几个文件进行对比)
- 2.利用fontTools.ttLib.TTFont将字体文件保存为xml文件
font3 = TTFont(r"C:\Users\Desktop\61\1\ChcCQ1sUz1mARY5zAABj6AkntG440..ttf")
font3.saveXML("qiche3.xml")
-
3.可以利用百度字体编辑器查看对应映射关系,如图所示:
-
4.比较多个文件可以看出:
- 每次页面加载的字体文件都不是同一个
- 某一个字体对象的命名方式不一样
- 同一个字体对应的像素坐标会有微妙的变化(观察了多个样本,每个字体像素点xy坐标的差距都不大于55)
- 同一个字体的像素点个数是一样的
-
5.实现思路:
- 将某一个字体样本作为对比标准并建立映射关系,将需要转译的字符对应的字体对象获取,和标准进行对比,如何和某一个字体对象像素点相同且xy像素相差均小于55,则判定为同一个字体,返回这个字体在标准中的映射结果。
- 解析xml文件可以用from xml.dom import minidom,类似xpath功能
4.代码
- 代码地址: https://github.com/zkyws/spider