Python字体反爬双实战 R30

举报
梦想橡皮擦 发表于 2022/05/31 09:28:25 2022/05/31
【摘要】 ⛳️ 实战场景本次要采集的站点是某供应商平台,域名如下所示:aHR0cHM6Ly9jbi5jaGluYS5jbg==这次要采集的是公开的电话号码,注意是公开的,不是隐私数据哦~通过开发者工具得到上图所示内容,仅数字部分进行了字体反爬。字体文件分析在网页源码寻找字体文件相关内容,得到的结果如下图所示。而我们下载字体文件,打开发现并不是一个固定的字体文件。该文件中仅包含了号码中存在的数字,再次...

⛳️ 实战场景

本次要采集的站点是某供应商平台,域名如下所示:

aHR0cHM6Ly9jbi5jaGluYS5jbg==

这次要采集的是公开的电话号码,注意是公开的,不是隐私数据哦~

通过开发者工具得到上图所示内容,仅数字部分进行了字体反爬。

字体文件分析
在网页源码寻找字体文件相关内容,得到的结果如下图所示。

而我们下载字体文件,打开发现并不是一个固定的字体文件。

该文件中仅包含了号码中存在的数字,再次打开一页详情,查看其字体文件。

每次刷新之后,得到的字体文件和编码全部不同,本案例难度就提高了一点点。

⛳️ 供应商字体反爬 实战场景

通过 font 模块加载字体文件,分别解析两个文件,对比数字一的矢量图部分内容,发现编码不一致,但是内容是完全相同的。

import re
from fontTools.ttLib import TTFont
from hashlib import md5

font = TTFont('./fonts/112.woff')
font.saveXML('./112.xml')

下面我们复制一段目标站点响应的源码,其表示的电话如下所示:

<span class="secret">&#x100ce;&#x100cf;&#x100cf; &#x100cf;&#x100cf;&#x100ce;&#x100d0; &#x100d0;&#x100d1;&#x100d2;&#x100d2;</span>

我们在字体文件中读取一下上图所示内容。

import re
from fontTools.ttLib import TTFont
from hashlib import md5

# font = TTFont('./fonts/112.woff')
# font.saveXML('./112.xml')
# 读取字体文件
font = TTFont('./fonts/112.woff')
# 读取 cmap
cmap = font.getBestCmap()
with open('./112.xml','r',encoding='utf8') as f:
    ret = f.read()
ret = ret.replace('\n','').replace(' ','')
# print(ret)

for i in cmap:
    # 查询目标数据
    data = re.findall(f'<CharStringname="{cmap[i]}">(.*?)</CharString>', ret)[0]
    # print(data)
    # 将查询到的结果进行 md5 编码
    char_md5 = md5(data.encode('utf8')).hexdigest()
    print(char_md5)

得到结果如下所示,下图所有值都经过 md5 加密之后得到的,便于后续对比。

下面你就要通过测试,获取所有的数字编码。

⛳️ 易 实战场景 车

本次字体反爬案例对应的是【易车】点评频道,该站点使用了字体反爬技术,并且是中文字符反爬,可以重点研究下。

站点地址如下所示(全角字符)

https://dianping.yiche.com/

打开目标站点任意链接之后,可以通过开发者工具发现,其文字部分存在大量的混淆字符。

既然已经发现了字体混淆,那接下来我们再夯实一下字符矢量图相关知识,下载易车的一个字体文件。

字体文件是通过 unicode 编码,然后对应字体文件。
浏览器实现原理是通过传递字符的字节码,转换成 unicode 编号,然后在字体文件中找到字体矢量图,如果没有字体文件,会在系统自带的字体中寻找矢量图。

上图中 uni6211 对应的就是汉字 的编码。

⛳️ 易 实战编码 车

有了多篇字体反爬的经验,我们很容易发现本次的目标站点使用了固定的字体文件,名称为 yc-ft.woff,其中包含了 473 个特殊汉字。

接下来只需要将字体文件编码和汉字的对一个关系读取出来即可。

from fontTools.ttLib import TTFont

font = TTFont('fonts/yc-ft.woff')
print(font)

font_map = font['cmap'].getBestCmap()
print(font_map)

网页响应的源码格式如下所示:

<em class='iconfont'>&#xe3d0;</em>车也

其中 &#xe3d0; 就是对应的字符,然后 e3d0 对应到字体矢量图中,对应的是 字。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。