前言:该题主要是考对fontTools.ttLib.TTFont的操作,另外就是对字典互相映射的操作
一、woff文件存储
from fontTools.ttLib import TTFont #pip install fontTools
def save_woff(response):woff = response['woff']woff_file = base64.b64decode(woff.encode())with open('aim.woff', 'wb') as f:f.write(woff_file)
二、可视化woff文件
1.首先要把woff文件存成xml格式
from fontTools.ttLib import TTFont# 加载字体文件:font = TTFont('ami.woff')# 保存为xml文件:font.saveXML('local_fonts.xml')
2.利用网站查看
Iconfont Previewiconfont preview for web, Momo's Blog, LuckyMomohttps://blog.luckly-mjw.cn/tool-show/iconfont-preview/index.html
通过这两步可以建立初始化的name与num列表
三、抓取一页建立woff中flag与数字之间的关系
1.利用可视化网站手动输出woff中name与数字的关系
r_map = {'unic543': 0, 'unib928': 1, 'unic193': 2, 'unib958': 3, 'unia257': 4, 'unic829': 5, 'unib716': 6, 'unic182': 7,'unic387': 8, 'unib718': 9} # 数字映射字典
2.输出name与flag的关系
def base_font_map(woff):"""构造基本on数组映射模板"""ttobj = TTFont(woff)tt_names = ttobj.getGlyphNames()[1:] # 获取所有name值cmap = {}for i in tt_names:cmap[tuple(ttobj['glyf'][i].flags)] = i # 构造基本映射on数组模板return cmap
print(base_font_map('aim.woff'))
3.建立flag(on)与数字的关系
def on_num(on_name,name_num):onnum={}for key,value in on_name.items():onnum[key]=name_num[value]return onnum
四、处理一页response.data数据
def page_data(data,page_name_num): #data=每一页解析的data数据,page_name_num=每一页解析出的name与num的对应关系nums=[]for d_v in data:name_list=d_v['value'].replace('&#x','uni').split(' ')if name_list[-1]=='':name_list.pop()point=''for name in name_list:point+=str(page_name_num[name])nums.append(point)return nums
五、处理一页woff值中name与num的对应关系
def name_num(onnum,nameon):namenum={}for key,value in nameon.items():namenum[key]=onnum[value]return namenum
六、返回一页的point点
def page_point(page):url = f"https://match.yuanrenxue.cn/api/match/7?page={page}"response = requests.get(url, headers=headers, cookies=cookies).json()data = response['data']woff = response['woff']save_woff(woff, page)nameon = base_font_map(f'{page}.woff')namenum = name_num(onnum, nameon)page_point_list = page_data(data, namenum)return page_point_list
七、获取全部数据
def main(name_list):point_list = []for page in range(1, 6):point_list.extend(page_point(page))print(point_list) print(max(point_list))print(name_list[point_list.index(max(point_list)) + 1])
最后有一点网页里名字的索引是从1开始的,所以point的最大值索引要+1才是名字的索引。