【爬虫进阶】猿人学任务七之字体反爬(难度2.0)

2023-11-18

前言

往期有讲解过某团字体反爬,感觉效果不太好,所以本章重新找了个例子,希望能帮助大家理解透彻!再遇到直接手撕。

特此说明

如果涉及到版权问题,请立刻联系博主删除!

分析

首先,我们看题目,要求是找出胜点最高的召唤师,意思我们需要先获取胜点

在这里插入图片描述

找到数据接口,发现字体都加密了,怎么破呢?这就是本文所要讲解的核心内容!

在这里插入图片描述在这里插入图片描述

先找到字体文件,他这里是动态加载的,每次请求结果都不一样,请求一次就保存一次,实时获取!

在这里插入图片描述

这里就已经保存本地了,pycharm不能直接读取woff文件,所以需要通过fontTools库操作woff

pip install fontTools

在这里插入图片描述

解密之后,保存为xml文件,为后面找出字体与编码的对应关系

在这里插入图片描述

代码过程

  • 请求数据接口

    def get_html(page):
        headers = {
            "user-agent": "yuanrenxue.project" # 题目要求,必须加上请求头
        }
        url = f"https://match.yuanrenxue.com/api/match/7?page={page}" # 数据有5页,通过遍历实现
        print(url)
        req = requests.get(url=url, headers=headers)
        return req.json() # 返回json格式
    
    
  • 获取woff字体文件

    def with_ttf(woff):
        b64_code = woff
        with open('font.woff', 'wb') as f:
            f.write(base64.decodebytes(b64_code.encode())) # 解码
    

解析字体文件,处理编码与字体的对应关系,这一步是关键点,所以着重说明:接口中字体前三位字符是&#x,而woff文件中前三位是uni,后面四位字符则其对应,所以我们需要将一方转换成另一方,这样才方便我们后续匹配
在这里插入图片描述
在这里插入图片描述
处理对应关系,我们根据编码找出对应的glfy值,无论编码如何变化,值是不会改变的

在这里插入图片描述

  • 保存xml文件
    def get_xml(data):
        font = TTFont('font.woff') # 打开woff文件
        font.saveXML('movie.xml') # 保存xml文件
        data_value = data.get('value').strip().replace('&#x', 'uni') # 替换&#x为uni
        data_value_list = data_value.split(" ") # 去除空格
        map_num_list = []
        for data_v in data_value_list:
            flags_num = list(font['glyf'][data_v].flags)  # 得到编码映射的值
            flags_num_str = "".join([str(flag) for flag in flags_num])  # 列表推导式
            print(flags_num_str)

结果:通过得到的值对比网页数据,就能找到对应的关系

在这里插入图片描述

在这里插入图片描述

下面就是对应的字体,然后我们进行匹配

 map_num = {
     "10100100100101010010010010": '0',
     "100110101001010101011110101000": '2',
     "111111111111111": '4',
     "1110101001001010110101010100101011111": '5',
     "1001101111": '1',
     "10010101001110101011010101010101000100100": '9',
     "101010101101010001010101101010101010010010010101001000010": '8',
     "10101100101000111100010101011010100101010100": '3',
     "1111111": '7',
     "10101010100001010111010101101010010101000": '6'
 }
  • 获取字体编码映射值
def get_xml(data):
   	font = TTFont('font.woff') # 打开woff文件
    font.saveXML('movie.xml') # 保存xml文件
    data_value = data.get('value').strip().replace('&#x', 'uni') # 替换&#x为uni
    data_value_list = data_value.split(" ") # 去除空格
    map_num_list = []
    for data_v in data_value_list:
        map_num = {
            "10100100100101010010010010": '0',
            "100110101001010101011110101000": '2',
            "111111111111111": '4',
            "1110101001001010110101010100101011111": '5',
            "1001101111": '1',
            "10010101001110101011010101010101000100100": '9',
            "101010101101010001010101101010101010010010010101001000010": '8',
            "10101100101000111100010101011010100101010100": '3',
            "1111111": '7',
            "10101010100001010111010101101010010101000": '6'
        }  # 映射值
        flags_num = list(font['glyf'][data_v].flags)  # 每个编码对应的值
        flags_num_str = "".join([str(flag) for flag in flags_num])  # 列表推导式
        map_num_list.append(map_num[flags_num_str]) # 匹配成功后,添加到刘表
    return "".join(map_num_list)

成果

在这里插入图片描述

完整源码

from fontTools.ttLib import TTFont
import requests
import json
import base64


def get_html(page):

    headers = {
        "user-agent": "yuanrenxue.project",
    }
    url = f"https://match.yuanrenxue.com/api/match/7?page={page}"
    print(url)
    req = requests.get(url=url, headers=headers).json()
    return req


def with_ttf(woff):
    b64_code = woff
    with open('font.woff', 'wb') as f:
        f.write(base64.decodebytes(b64_code.encode()))


def get_xml(data):
    font = TTFont('font.woff')
    font.saveXML('movie.xml')
    data_value = data.get('value').strip().replace('&#x', 'uni')
    data_value_list = data_value.split(" ")
    map_num_list = []
    for data_v in data_value_list:
        map_num = {
            "10100100100101010010010010": '0',
            "100110101001010101011110101000": '2',
            "111111111111111": '4',
            "1110101001001010110101010100101011111": '5',
            "1001101111": '1',
            "10010101001110101011010101010101000100100": '9',
            "101010101101010001010101101010101010010010010101001000010": '8',
            "10101100101000111100010101011010100101010100": '3',
            "1111111": '7',
            "10101010100001010111010101101010010101000": '6'
        }
        flags_num = list(font['glyf'][data_v].flags)
        flags_num_str = "".join([str(flag) for flag in flags_num])
        map_num_list.append(map_num[flags_num_str])
    return "".join(map_num_list)


if __name__ == '__main__':
    for page in range(1,6):
        res = get_html(page)
        woff = res.get('woff')
        with_ttf(woff)
        data_num = []
        for data in res.get('data'):
            map_num_str = get_xml(data)
            data_num.append(map_num_str)

        print(data_num)
        print(f'最大值:{max(data_num)}')

点关注不迷路,本文若对你有帮助,烦请三连支持一下 ❤️❤️❤️
各位的支持和认可就是我最大的动力❤️❤️❤️

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【爬虫进阶】猿人学任务七之字体反爬(难度2.0) 的相关文章

随机推荐

  • 将yyyy-MM-dd hh:mm:ss转化为yyyy-MM-dd

    Date currentTime new Date SimpleDateFormat formatter new SimpleDateFormat yyyy MM dd Date strtodate String datas try str
  • Java异常和处理机制

    棒棒有言 追逐梦想的过程就像是一个人在走一条黑暗 幽深而又漫长的隧道 多少次跌倒又爬起 经历了多少个暗无天日的黑夜与白天 一路上沉淀着难以计数的汗水与泪水 不断地自我暗示 只要自己坚持 只要勇敢地一向往前走 就必须能找到出口 必须会看到光明
  • 读书笔记 摘自:《思维导图攻略:快速上手与落地实践》

    思维导图攻略 快速上手与落地实践 王健文 出版 2019 01 01 7 3万字 内容提要 无落地 不导图 思维导图的学习并不在于思维导图的绘制本身 而是在于实际应用和思维提升 第一章 精英人士自我提升的思维利器 第一节 提升大脑学习力的秘
  • 广州华锐互动:利用VR复原文化遗址,沉浸式体验历史文物古迹的魅力

    在过去的几十年里 科技发展飞速 为我们打开了无数新的视角和可能性 其中 虚拟现实 Virtual Reality 简称VR 技术的崭新应用 为我们提供了一种全新的 近乎身临其境的体验历史的方式 本文将重点探讨VR技术在复原历史古迹方面的应用
  • How to use tar command to complete file compression and decompression in Ubuntu

    TAR 1 GNU TAR Manual TAR 1 NAME tar an archiving utility SYNOPSIS Traditional usage tar A
  • beam search的例子

    看了一下网上对beam search的讲解 感觉都说的太杂了 我试图用一个最简单的例子来帮助读者理解 见下图 假设我有一个模型 能够根据当前词输出下一个词的概率分布 最后依次这样就能生成一大串文本 以上面的图为例 The 的下一个词的最大概
  • Spring StateMachine使用笔记

    Spring StateMachine使用笔记 配置状态机 状态 分层状态 withStates 配置状态 states状态列表 可以使用多个withStates进行parent分层 配置区域 当相同的分层状态机具有多组状态时 每个都具有初
  • 系统移植开发阶段部署

    开发阶段部署阶段 uboot镜像 ubootpak bin flash SD linux内核镜像 uImage tftp下载 根文件系统 rootfs nfs挂载 本文操作需要用到uboot命令进行镜像搬移和根文件系统挂载 uboot中常用
  • EPS学习笔记3----------常用地物采集方法(房屋,斜坡,台阶)

    1 三维模型中房屋绘制方法 面状地物 五点房 不会自动弹出房屋属性录入窗口 任意绘制法 绘制结束弹出房屋属性录入窗口 多点法 1 首先在房屋某一面用鼠标左键选择一点 2 鼠标移到房屋屋檐处 利用shift A将前一节点高程移到屋檐高程 3
  • 前端开发常见面试题第三篇(Vue和React)

    文章目录 1 Vue中直接获取组件内的DOM元素或子组件实例 2 生命周期 3 双向绑定原理 4 v if和v show的区别 5 Vue导航钩子 6 路由跳转的方式 7 vuex常用的是什么 怎么使用 8 父子组件之间通信 9 跨域处理
  • Java排序算法:选择排序

    Java排序算法 选择排序 选择排序它的主要思想是 在未排序的数组中选择最小的元素 然后将其放置在数组的起始位置 再在剩余的未排序数组中选择最小元素 并将其放置在已排序部分的末尾 重复此过程 直到整个数组排序完成 选择排序的步骤如下 1 从
  • 15款业界公认的最佳视频处理软件

    因为需要购买昂贵的视频处理软件和高性能图形计算机 所以视频处理是一项比较耗费金钱的技术活 正是由于这样 一部分人选择使用性能较好的免费在线编辑软件 无需太多视频处理知识便可在浏览器中剪切和编辑视频 然而 当我们无法连接网络或网络很慢的时候
  • IC卡片使用基础

    一 卡片基本概念 集成电路卡 即日常生活中常使用的卡片 可以根据读写特性分为两类 ID卡和IC卡 ID卡 全称身份识别卡 是一种不可写入的感应卡 含固定编号 卡内除了卡号外 无任何保密功能 其 卡号 是公开 裸漏的 IC卡 带有存储器 又称
  • redis缓存击穿、缓存穿透、缓存雪崩、缓存一致性解决方案的代码实现

    1 0 缓存击穿 概念 一些redis的key过期 同时大量数据请求过期的key或者redis不存在的key 导致大量请求打到数据库 导致数据库瘫痪 解决方案 1 设置热点数据永不过期 2 对热点数据加锁 分布式锁 代码实现 初始化项目 商
  • 【笔记】有点麻烦的MatConvNet的dagnn的debug过程

    尝试用MatConvNet训练 然而遇到了以下bug 一脸懵逼折腾了四天 No public property dilate exists for class dagnn Conv Error in dagnn Layer load lin
  • javaweb课程设计之商品后台管理系统

    主要技术 layui框架 html5 jsp oracle数据库 servlet session filter 功能说明 基于java开发的商品管理系统 管理员在后台进行添加商品 修改商品 删除商品 批量删除商品 设置商品上下架功能等 完美
  • webSocket的使用

    在Spring Boot项目中使用Java WebSocket 添加依赖 在项目的构建文件 如pom xml 中添加Java WebSocket的依赖项 可以使用Java EE的WebSocket API或者其他第三方库 例如 Tyrus
  • MATLAB绘制局部放大图

    在数据处理时 当曲线出现跳变的时间极短 出于观察跳变时间段波形的需要 需要对曲线跳变处进行局部放大处理 本文给出了此种情况下MATLAB绘制局部放大图的流程 同时 当曲线的峰值数据与平均值相差一个数量级时 如峰值12 平均值范围落在是 1间
  • awk内置函数

    http blog csdn net nuoline article details 8610679
  • 【爬虫进阶】猿人学任务七之字体反爬(难度2.0)

    目录 前言 特此说明 分析 代码过程 成果 完整源码 前言 往期有讲解过某团字体反爬 感觉效果不太好 所以本章重新找了个例子 希望能帮助大家理解透彻 再遇到直接手撕 特此说明 如果涉及到版权问题 请立刻联系博主删除 分析 首先 我们看题目