字体反爬破解

    • 1、通过 f12 查看网页相关信息
      • ① 搜索“python”相关岗位,想爬取下来作为分析,但是看到html源码为特殊字符,而不是页面上直观能看到的文字信息
      • ②点击对应的css样式查看css源码,通过源码解析字体加密过程
    • 2、通过 Domain+URI 获取到该字体文件
      • ① 这里没有后缀,我们只能去试是那一种格式的
      • ② 直至试出来文件格式为woff
    • 3、检验字体文件对应关系是否正确
    • 4、使用 python 进行字体映射
      • ① 将woff转换为xml查看逻辑
      • ② 主要观察\里的对应关系
      • ③ 使用字典完成映射关系
    • 5、根据映射对网页源码进行对应替换

这里以实习僧为具体案例

1、通过 f12 查看网页相关信息

① 搜索“python”相关岗位,想爬取下来作为分析,但是看到html源码为特殊字符,而不是页面上直观能看到的文字信息

字体反爬破解_第1张图片
关闭对应的css样式可以看到,确实是做了字体反爬
字体反爬破解_第2张图片

②点击对应的css样式查看css源码,通过源码解析字体加密过程

字体反爬破解_第3张图片

字体反爬破解_第4张图片

查看 font-family 是由 myFont 传值生成,继续找 myFont 变量
字体反爬破解_第5张图片

2、通过 Domain+URI 获取到该字体文件

https://www.shixiseng.com/interns/iconfonts/file?rand=0.5135261623696619
字体反爬破解_第6张图片

① 这里没有后缀,我们只能去试是那一种格式的

一般常见的为:ttf、eot、otf、woff、svg,可以使用在线工具去检验
字体反爬破解_第7张图片
字体反爬破解_第8张图片

② 直至试出来文件格式为woff

在这里插入图片描述

字体反爬破解_第9张图片

3、检验字体文件对应关系是否正确

字体反爬破解_第10张图片
字体反爬破解_第11张图片
这里判断正确无误,底层通过css转换就是这个文件的文字

4、使用 python 进行字体映射

pip3 install fontTools

① 将woff转换为xml查看逻辑

from fontTools.ttLib import TTFont

font = TTFont('./font-file.woff')
font.saveXML('sxsfont.xml')

字体反爬破解_第12张图片

② 主要观察里的对应关系

字体反爬破解_第13张图片
例如 这里python工程师
字体反爬破解_第14张图片
在这里插入图片描述

网页显示:  
xml中的code值:0xed53 0xea63 0xe4e5
xml中的name值:uni5DE5 uni7A0B uni5E08
通过观察可以得出:网页显示后四位与xml中的code值后四位一样,对应的name值看起来也是unicode编码,也是拿后四位去验证
字体反爬破解_第15张图片

③ 使用字典完成映射关系

from fontTools.ttLib import TTFont

font = TTFont('./font-file.woff')
cmap = font.get('cmap').getBestCmap()
print(cmap)

finish_font = {}
for k,v in cmap.items():
    if v[3:]:
        values = '\\u00' + v[3:] if len(v[3:]) ==2 else '\\u' + v[3:]
        real_values = values.encode().decode('unicode-escape')
        real_keys = hex(k).replace('0x','&#x')
        print(real_keys ,real_values)
        finish_font[real_keys]= real_values
print(finish_font)

字体反爬破解_第16张图片

5、根据映射对网页源码进行对应替换

for k, v in finish_font.items():
	html_text = html_text.replace(k, v)

字体反爬破解_第17张图片

你可能感兴趣的:(Python爬虫,python)