当前位置:网站首页>字体反扒
字体反扒
2022-08-11 02:52:00 【HHYZBC】
什么是字体反扒
以实习僧网站为例,在网页是看数据都是正常的,而查看源代码,则可以发现有部分数据是乱码,这个就是字体反扒了

第一步
请求网页获取源代码,这个太简单了,不过多解释。
第二步
查找并获取字体文件。
在源代码中查找@font-face样式字样,这个就是自定义字体的样式了。

然后打开开发者工具,找到该字体的请求链接进行保存即可。
font_data = requests.get('https://www.shixiseng.com/interns/iconfonts/file?rand=0.4297923496159244',
headers=self.headers).content
with open('实习僧.woff', 'wb') as f:
f.write(font_data)第三步
对字体文件进行解析获取对应关系
引用模块
from fontTools.ttLib import TTFont
import reTTFont模块是处理字体文件的第三库,需要自行下载
# 初始化字体文件
font = TTFont('实习僧.woff')
# 将字体文件保存为xml格式
font.saveXML("./font.xml")
# 读取字体的xml格式文件
with open('./font.xml') as f:
xml = f.read()
# 对xml文件解析
keys = re.findall('<map code="(0x.*?)" name="uni.*?"/>', xml)[:99]
values = re.findall('<map code="0x.*?" name="uni(.*?)"/>', xml)[:99]
# 解析字体文件的关系
for i in range(len(values)):
if len(values[i]) < 4:
values[i] = ('\\u00' + values[i]).encode('utf-8').decode('unicode_escape')
else:
values[i] = ('\\u' + values[i]).encode('utf-8').decode('unicode_escape')
word_dict = dict(zip(keys, values))
print(word_dict)需要注意的是,在使用re模块对xml文件进行解析的使用,需要获取的内容是
<map code="0xe04e" name="uni653F"/>中的code和name属性。 code属性值则是去掉0x这就是在源码中的字样,而name属性则是这个字体的属性,对字体解析则就是对这个属性进行解析获取对应关系的
最后输出的内容则是:

第4步
使用获取到的对应关系将网页上的数据进行替换即可。
边栏推荐
- 全局大喇叭--广播机制
- sql 使用到where和groupby时建立索引结果为啥是这样,原理是什么?
- shell脚本入门
- WeChat public account background management
- YTU 2418: C语言习题 矩阵元素变换
- 2022茶艺师(中级)考试试题及模拟考试
- Economic Misunderstandings in the Crypto World: Is Cash a Savings?Scarcity creates value?
- (CVPR-2017)在身体和潜在部位学习深度上下文感知特征以进行行人重识别
- 基于FPGA状态机的自动售货机功能实现
- PIFuHD配置记录
猜你喜欢

How to solve the problem of Tomcat booting and crashing

关于地图GIS开发事项的一次实践整理(上)

redis学习五redis的持久化RDB,fork,copyonwrite,AOF,RDB&AOF混合使用

TRCX: doping process analysis

Detailed explanation of new features of ES advanced function syntax

Realization of vending machine function based on FPGA state machine

代码 Revert 后再次 Merge 会丢失的问题,已解决

flink The object probably contains or references non serializable fields.

flink The object probably contains or references non serializable fields.

入职数字ic设计后的一些工作心得
随机推荐
解决vim与外界的复制粘贴(不用安装插件)
The negative semantic transformation layer
leetcode:358. K 距离间隔重排字符串
The practice of alibaba data synchronization component canal
SQL 开发的十个高级概念
对加密世界的经济误解:现金是储蓄?稀缺性创造价值?
报错处理:org.xml.sax.SAXParseException: 不允许有匹配 “[xX][mM][lL]“ 的处理指令目标
思念家乡的月亮
Fatal error in launcher: Unable to create process using xxx --logdir logs(tensorboard使用)
this question in js
GBJ3510-ASEMI家电电源用整流桥GBJ3510
[4G/5G/6G专题基础-154]: 5G无线准入控制RAC(Radio Admission Control)
Idea (优选)cherry-pick操作
comp3331-9331-21t1-midterm复习
DOM树的遍历-----修改样式,选择元素,创建和删除节点
正式发布丨VS Code 1.70
关于地图GIS的一次实践整理(下) Redis的GIS实践
What does the sanction of the mixer Tornado mean for the DeFi market?
MSP430如何给板子下载程序?(IAR MSPFET CCS)
CC0 vs. commercial IP: which model is better for NFTs?