字体反爬指的就是浏览器页面上的字符和调试窗口或者源码中的内容,显示的不一样,这就是字体反爬。
用爬虫直接去取 1300 或 复制页面的数字,得到的结果龤驋麣麣,要理解字体反爬,先要理解字符集编码的原理。
二进制,字节,字符
- Bit 0 或 1 二进制位
- Byte 01010101 或 0x55 八个连续的二进制位,或二个16进制数表示
- 字符 是指计算机中使用的字母、数字、字和符号
ASCII编码对照表
**ASCII码 **
ASCII 码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码,使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。
Unicode编号
Unicode码
Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。例如:“马”的Unicode是U+9A6C。它是一种规定,Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。
理论上可以直接把Unicode编号直接转换成二进制进行存储,而Unicode并不是这么操作,因为除了这种直接转换成二进制的方案外,还有其他方案,主要有UTF-8,UTF-16,UTF-32,gbk。(UTF-8、UTF-16、UTF-32……都是 Unicode编码 的一种实现。)
UTF-8编码方式
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。这里的关系是,UTF-8 是 Unicode 的实现方式之一。
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8 的编码规则很简单,只有二条:
-
对于单字节的符号,字节的第一位设为
0
,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。 -
对于
n
字节的符号(n > 1
),第一个字节的前n
位都设为1
,第n + 1
位设为0
,后面字节的前两位一律设为10
。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
汉字的UTF-8编码表示
- 获取汉字unicode编号
- 转化为二进制数
- 根据UTF-8编码格式,将二进制数据填充到指定位置
- 将填充好的新二进制数据,转换成16进制
编号与编码
<img src="字体反爬\号码2.png" alt="号码2 " style="zoom: 50%;" />[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RhYQfqR-1614496042897)(字体反爬\号码3.png)]
一个字的Unicode编号是固定的,但是在计算机上的字节码,取决于编码方案的实现方式。一个汉字在Unicode中的编号的
16进制数,跟utf8编码后的16进制数不是一回事。
字符矢量图
字体可以理解为通过unicode编号,对应的自定义图形
字符对应关系
传递字符 4 ,有两种方案,
第一种是传递字符4的字节码:浏览器拿到字节码,转换成unicode编号,在没有指定字体文件的前提下,通过unicode编号在到系统自带字体中寻找字符矢量图,得到 ‘4’
第二种是,传递另一个繁体字的字节码,同时,传递一个自定义的字体。浏览器拿到繁体字的字节码,转换成unicode编码,到css指定的字体文件中查找,找到字符矢量图 ‘4’。
第二种情况下,浏览器后台和爬虫拿到的繁体字的字节码,只能在正常字体中查找字符矢量图,所以只能看到 鱀