一、使用工具:Pycharm,High-Logic FontCreator(字体解析器)
二、字体反爬原理:将网页上爬取下来的数据进行解密,最后还原成网页最终呈现的效果即为字体反爬。
三、举例-爬取网站: https://www.shixiseng.com/interns/iconfonts/file?rand=0.22862737400022937
https://www.shixiseng.com/interns?keyword=python&city=%E5%85%A8%E5%9B%BD&type=intern
具体思路如下:
- 导入TTFont库
from fontTools.ttLib import TTFont
- 在爬取网站找到并下载爬取网站的字体解析文件(在爬取网站的源码中查找@font-face中url的网址,在搜索框中打开,自动下载的文件即为字体解析文件)
- 将下载的文件保存在项目文件同一级目录中(这样比较方便不用写路径)
- 读取下载后文件,通过ttf.save()将下载文件转化为ttf格式,在High-Logic FontCreator打开即可看到对应字符和对应的字符编码。
# 读取下载后文件 ttf = TTFont('file') # 将下载后文件保存为ttf文件,方便在High-Logic FontCreator中打开 ttf.save('file.ttf')
file.ttf打开文件显示大致如下
- 通过手动操作将字符与编码一一对应(可利用识图软件操作,将数据保存在file.csv文件中),将保存的csv文件读取成字符和字符编码一一对应的字典Unicode_dict。 读取csv文件
打印字典Unicode_dict显示如下with open('ttf.csv', 'r') as f: # 读取csv文件中的Unicode数据 reader = csv.reader(f) unicode_dict = {} for i in reader: unicode_dict[i[0].lower()] = i[1]
- 利用爬虫爬取网页数据
获取到的title值打印显示:# 网页地址 url = 'https://www.shixiseng.com/interns?keyword=web&city=%E5%85%A8%E5%9B%BD&type=intern' # 请求头 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'} # 获取网页源码 res = requests.get(url, headers=headers) # 获取所需内容 title = re.findall('<a href=".*?" title=".*?" target="_blank" class="title ellipsis font" data-v-2d75efc8>(.*?)</a>',res.text)
- 循环title中的值和Unicode_dict中的key值
-
# 保存字体解密成功的数据 title_list = [] # 把title中的每个值都拿出来 for i in title: # 把Unicode_dict中的每个key值都拿出来 for j in unicode_dict.keys(): # 比较 Unicode_dict中的key值是否存在于title中, # 存在就将title中对应的unicode_dict的key值与 # unicode_dict的key对应的value值进行替换 if j in i: i = str(i).replace(j, unicode_dict[j]) # 将整理替换后的title值添加到title_list中 title_list.append(i)
title_list打印结果如下:
-
字体转换前和字体转换后比较
四、总结
字体反爬最麻烦的是将字体解析文件读取出来,并且要想办法让字符与编码一一对应,其中可以通过形成ttf文件进行手动转换,也可以通过形成xml文件找到<cmap>标签,通过读取中间的name和code再想办法转换形成字典,最后在通过将我们所需要转换的数据与字典中的数据一一比对再替换即可。