记一次字体反爬

查看 70|回复 2
作者:仿佛_一念成佛   
前言
最近在网上冲浪,看到有喜欢的网页内容,开开心心的复制内容打算发给我的好兄弟看,但是一看发出去的内容和网站上的内容不一样,当时我就奇了怪了,怎么回事呢。在经过半天的调研时间,我发现原来这一类技术叫做字体反爬。有了目标那么就明白了,直接分析是个什么情况

出带着十六岁化女儿发作寺庙祈福。 # 复制的内容
我带着十六岁的女儿来到寺庙祈福。 # 网站显示内容

过程
很快啊,我就在网页源代码上看到了特别的东西

仔细一看 font-face 元素。这是什么呢?
问的好!上百度!

@ font-face的是一个CSS规则,允许你输入自己的字体出现在网站上,即使在特定的字体在访问者的计算机上没有安装。这条规则最重要的是,它为设计师打开了一个全新的世界。您可以使用任何你喜欢的字体。

简单来讲,就是这个css元素来修改了网站上的显示内容和原内容。
来看看font-face里面都有什么吧
[ol]
  • font-family # 不管
  • font-display # 不管
  • font-weufgt # 不管
  • font-style # 不管
  • src # 关键内容
    [/ol]
    前四个都是无关紧要的,最后一个才是最重要的。那么它又是什么呢?
    问的好!
    它是一个网络链接,指向外部的网络链接。是一个字体库文件,在这个字体库文件里能够找到隐藏的文字和显示的文字
    当然,看网页源代码未免也太枯燥了,抓包也能够达到一样的效果。在前言提到这是关于字体反爬,那么我们选择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 in font_dict.keys():
                strs = strs.replace(strs, font_dict[strs]) # 进行替换
        print(strs)

    那么到这里也就差不多结束了,剩下的就是python的工作了,我就又可以继续网上冲浪了
    结言
    字体反爬从来就不是一个很难的内容,相比验证码,那真是小巫见大巫。而随着反爬和爬虫的高速发展使,很有可能今天的内容对于明天就是无用功,一直学习下去才能够不被淘汰。
    最后,相关类型的网站有很多,在这里就不提供了。我只提供思路,代码也不能对所有的网页都生效。不过,持之以恒的学习能够让代码一直的更新迭代,一直的有效!

    字体, 内容

  • seansyx   

    谢谢分享
    wangguang   

    老哥网站贴个链接
    您需要登录后才可以回帖 登录 | 立即注册