当前位置:   article > 正文

猿人学第七题-动态字体-随风漂移

猿人学第七题-动态字体-随风漂移

前言:该题主要是考对fontTools.ttLib.TTFont的操作,另外就是对字典互相映射的操作

一、woff文件存储

  1. from fontTools.ttLib import TTFont #pip install fontTools
  2. def save_woff(response):
  3. woff = response['woff']
  4. woff_file = base64.b64decode(woff.encode())
  5. with open('aim.woff', 'wb') as f:
  6. f.write(woff_file)

二、可视化woff文件

1.首先要把woff文件存成xml格式

  1. from fontTools.ttLib import TTFont
  2. # 加载字体文件:
  3. font = TTFont('ami.woff')
  4. # 保存为xml文件:
  5. font.saveXML('local_fonts.xml')

2.利用网站查看

Iconfont Previewiconfont preview for web, Momo's Blog, LuckyMomoicon-default.png?t=N7T8https://blog.luckly-mjw.cn/tool-show/iconfont-preview/index.html

        通过这两步可以建立初始化的name与num列表

三、抓取一页建立woff中flag与数字之间的关系

1.利用可视化网站手动输出woff中name与数字的关系

  1. r_map = {'unic543': 0, 'unib928': 1, 'unic193': 2, 'unib958': 3, 'unia257': 4, 'unic829': 5, 'unib716': 6, 'unic182': 7,
  2. 'unic387': 8, 'unib718': 9} # 数字映射字典

2.输出name与flag的关系

  1. def base_font_map(woff):
  2. """构造基本on数组映射模板"""
  3. ttobj = TTFont(woff)
  4. tt_names = ttobj.getGlyphNames()[1:] # 获取所有name值
  5. cmap = {}
  6. for i in tt_names:
  7. cmap[tuple(ttobj['glyf'][i].flags)] = i # 构造基本映射on数组模板
  8. return cmap
  9. print(base_font_map('aim.woff'))

3.建立flag(on)与数字的关系

  1. def on_num(on_name,name_num):
  2. onnum={}
  3. for key,value in on_name.items():
  4. onnum[key]=name_num[value]
  5. return onnum

四、处理一页response.data数据

  1. def page_data(data,page_name_num): #data=每一页解析的data数据,page_name_num=每一页解析出的name与num的对应关系
  2. nums=[]
  3. for d_v in data:
  4. name_list=d_v['value'].replace('&#x','uni').split(' ')
  5. if name_list[-1]=='':
  6. name_list.pop()
  7. point=''
  8. for name in name_list:
  9. point+=str(page_name_num[name])
  10. nums.append(point)
  11. return nums

五、处理一页woff值中name与num的对应关系

  1. def name_num(onnum,nameon):
  2. namenum={}
  3. for key,value in nameon.items():
  4. namenum[key]=onnum[value]
  5. return namenum

六、返回一页的point点

  1. def page_point(page):
  2. url = f"https://match.yuanrenxue.cn/api/match/7?page={page}"
  3. response = requests.get(url, headers=headers, cookies=cookies).json()
  4. data = response['data']
  5. woff = response['woff']
  6. save_woff(woff, page)
  7. nameon = base_font_map(f'{page}.woff')
  8. namenum = name_num(onnum, nameon)
  9. page_point_list = page_data(data, namenum)
  10. return page_point_list

七、获取全部数据

  1. def main(name_list):
  2. point_list = []
  3. for page in range(1, 6):
  4. point_list.extend(page_point(page))
  5. print(point_list)
  6. print(max(point_list))
  7. print(name_list[point_list.index(max(point_list)) + 1])

最后有一点网页里名字的索引是从1开始的,所以point的最大值索引要+1才是名字的索引。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/545132
推荐阅读
相关标签
  

闽ICP备14008679号