前言
最近在网上冲浪,看到有喜欢的网页内容,开开心心的复制内容打算发给我的好兄弟看,但是一看发出去的内容和网站上的内容不一样,当时我就奇了怪了,怎么回事呢。在经过半天的调研时间,我发现原来这一类技术叫做字体反爬。有了目标那么就明白了,直接分析是个什么情况
出带着十六岁化女儿发作寺庙祈福。 # 复制的内容
我带着十六岁的女儿来到寺庙祈福。 # 网站显示内容
过程
很快啊,我就在网页源代码上看到了特别的东西
仔细一看 font-face 元素。这是什么呢?
问的好!上百度!
@ font-face的是一个CSS规则,允许你输入自己的字体出现在网站上,即使在特定的字体在访问者的计算机上没有安装。这条规则最重要的是,它为设计师打开了一个全新的世界。您可以使用任何你喜欢的字体。
简单来讲,就是这个css元素来修改了网站上的显示内容和原内容。
来看看font-face里面都有什么吧
- font-family # 不管
- font-display # 不管
- font-weufgt # 不管
- font-style # 不管
- src # 关键内容
前四个都是无关紧要的,最后一个才是最重要的。那么它又是什么呢?
问的好!
它是一个网络链接,指向外部的网络链接。是一个字体库文件,在这个字体库文件里能够找到隐藏的文字和显示的文字。
当然,看网页源代码未免也太枯燥了,抓包也能够达到一样的效果。在前言提到这是关于字体反爬,那么我们选择font找到文件下载到本地也是可以的,具体步骤请看图
很快啊,我就下载过来了。但是怎么打开呢?
问的好!
下载一个FontCreator能够打开,当然,用vscode安装一些插件也能够直接打开(不愧是最强的vscode啊
这里就用FontCreator 打开了,请看图
是不是感觉无从下手?
我也是这么想的,那就先放在这里了。先吃饭
很快啊,过了两个半小时,我脑子突然灵光一闪,文字的code-points对应的是什么呢?
又是两个半小时,我知道了!
code-points对应的是文字的映射内容!
打个比方,以上图为例,文字不它的code-points是什么呢?
没错,是$7406
这又代表什么呢?
我们用FontCreator来搜索一下
结果是理。这代表着在网站上显示的文字和审查元素里的文字分别不和理。
懂了这个字体后那么就好办多了,能够用python来批量获取原始文字和映射文字了
实现
模块 TTFont
安装:TTFont
导入:from fontTools.ttLib import TTFont
一个小函数
def font():
dict_translate = {}
# 加载字体文件:
font = TTFont('1.woff') # 需自己下载或者正则匹配字体文件
# 获取字体编码:
font_map = font.getBestCmap() # 获取它的unicode和映射的unicode(code-points)
# 获取字体编码对应的字体:
font_map = {hex(k): v for k, v in font_map.items()}
for key, value in font_map.items():
# print(key, value)
key = chr(int(key, 16)) # 把得到的十六进制转换为中文字符
value = value.replace('uni', '\\u')
values = value.encode().decode('unicode_escape') # unicode转中文
dict_translate[key] = values
return dict_translate
把得到的映射字典再作为返回值甩到另外一个函数里
def translate_strs(font_dict, strs): # 参数为上一个函数的字典和需要翻译的内容
for i in range(0, len(strs)):
if strs[i] in font_dict.keys():
strs = strs.replace(strs[i], font_dict[strs[i]]) # 进行替换
print(strs)
那么到这里也就差不多结束了,剩下的就是python的工作了,我就又可以继续网上冲浪了
结言
字体反爬从来就不是一个很难的内容,相比验证码,那真是小巫见大巫。而随着反爬和爬虫的高速发展使,很有可能今天的内容对于明天就是无用功,一直学习下去才能够不被淘汰。
最后,相关类型的网站有很多,在这里就不提供了。我只提供思路,代码也不能对所有的网页都生效。不过,持之以恒的学习能够让代码一直的更新迭代,一直的有效!