#猫眼电影和实习僧可以练习#
1.什么是字体反爬?
网页中一个数据:333.67万
我们在检查元素中的看到该部分数据是反爬的,即元素中看不出实际数据/文字,如图
进入源代码中,源代码中获取的数据是加密后的数据,如图:
把该串数据分成几部分 ,即
 |  |  | . |  |  |
3 | 3 | 3 | . | 6 | 7 |
2.直接替换replace
直接通过replace将响应中对应的字符串替换成我们看到的未加密的字体,部分网站可以实现,但是工作量很大,不建议使用该方法。
这种具有字体反爬的网页,响应除了源代码还有字体文件(一般后缀.woff或.ttf),字体文件即对应上述加密字符串,我们请求后得到响应可以通过替换还原我们目之所及的数据,但是字体文件具有时效性,也就是过一段时间后再请求,我们看到的加密字符串会变化,加密字符串与原数据对应关系会发生变化。
3.找font-Family
我们在检查元素中找到加密字体的位置,其右侧窗口-样式-font-family,当我们把勾选去掉后会发现网页中该部分字体也看不到未加密数据了,这说明font-family就是设置该部分字体的
3.1方法一:数据在源代码中(推荐该方式)
我们在源代码中找到font-family,把它后面紧跟的地址copy到浏览器并回车,此时浏览器会下载一个文件,这就是下载的字体文件。
若地址不完整,则缺少当前网站的协议与域名,我们将协议与域名添加上补充为一个完整的地址。
下载的字体文件,我们需借助工具来看
3.2方法二:检查>Network>字体(这个方法不好找)
4.python中下载字体文件
4.1获取文件地址
我们每次代码运行下载最新的字体文件,从网页响应中提取font-family的地址(这个操作不好实现,只能用正则来提取),示例如图,将该地址复制到浏览器中,若下载的文件被工具打开后结果正常,说明提取的地址是正确的。
4.2保存字体文件
获取字体文件的字节,以文件形式做一个保存
4.3将字体文件转化为xml文件
需要使用TTFont模块
4.4使用xml中的glyf标签
用于替换对应的数字
4.5找到字体文件内部的对应关系
我们拿0举例,在这个内部对应关系中我们可以找到uni30对应的是59974,也就是现在对应关系为0-uni30-59974,而最开始0的加密后的字符串为,我们发现这些加密后的字符串长得很像是16进制,继而我们发现59974的16进制表示正是ea46.即当前对应关系为ea46-0-uni30-59974
4.6对网页响应做处理
4.6.1在找到对应关系后,我们先将网页响应中的"&#"替换为0,即将“&#x"转换为了0x
4.6.2将对应关系字典中的键全部由10进制转换为16进制,使转换后的键正好与源代码中的加密字符串对应一致。此时键与源代码中0对应,值与glyf对应。
4.6.2将键与值替换
5.字体反爬的函数
这里有2个现成的字体反爬的函数,分别是实习僧(包括字体、字母和数字)和猫眼电影,猫眼电影反爬只有数字0-9,所以当只有0-9字体反爬的网页都可以用这个函数,把代码复制过去即可使用。
5.1同样需要先获取网页源代码,获取字体文件,获取字体对应关系这里用font.getGlyphOrder(返回所有的字体代码,如uni30)
5.2把字体反爬的函数复制过来,传入旧字体,返回新字体
5.3对网页响应结果做对应替换