Python爬虫逆向猿人学刷题系列——第七题

news2024/9/24 17:20:56

题目:采集这5页中胜点列的数据,找出胜点最高的召唤师,将召唤师姓名填入答案中

在这里插入图片描述

地址:https://match.yuanrenxue.cn/match/7

本题主要是考察字体的动态变化,同样也是从字体文件下手构造出映射关系就好,但本题的映射关系相对来说要多出几个步骤。接下来至今进入分析。

在这里插入图片描述

可以看到响应数据中存在一个woff键值对,而它的值是base64编码过的,所以第一步我们可以先将这个woff键的值复制下来进行base64的解码然后写入字体文件之中。

from fontTools.ttLib import TTFont

woff = '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'
woff_file = base64.b64decode(woff.encode())
with open('base.woff', 'wb')as f:
    f.write(woff_file)

然后写一个xml文件来查看一下其映射关系是否能够直接获取明文(这个案例中是无法直接获取的)。

在这里插入图片描述

很明显并没有任何对我们有用的数据,code的值转换成10进制之后也并不是明文数字。那接下来应该怎么办呢?接下来我们来观察一下响应内容和字体文件中是否存在着共同点。

结合上方xml截图和响应数据截图来看相应数据的value就是xml中看到的name值,所以我们可以根据这个关系来构造一个基本的明文数字与name之间的映射模板。

r_map = {'unia813': 3, 'unia643': 2, 'unic195': 6, 'unib671': 5, 'unic268': 0, 'unib519': 4, 'unia594': 1, 'unib713': 9,
       'unia261': 8, 'unib741': 7}  # 数字映射字典

这个模板可以根据页面中看到的明文内容结合响应数据来构造,也可以使用字体文件处理工具来构造

在这里插入图片描述

构造完之后来重新请求一下并获取字体文件,会发现每一次数字映射的name值都是不同的。如第一次请求unia813明文为3的话,下一次请求可能就变成了unia439的明文为3了。所以一直使用一个模板肯定是不行的。但是这里我们对比多次请求获取到的字体文件转换的xml文件会发现每一个数字尽管其对应的name不同,但其坐标点的位置是相同的。

在这里插入图片描述

同一个数字,它在坐标系中的坐标点是相同的,所以我们可以根据on数组是否相同来判断两次请求的数字是否是同一个,如果是同一个的话我们再去映射最先构造好的基本模板(基本模板中也要获取on数组用于和新请求中的on数组进行对比)。

def base_font_map():
    """构造基本on数组映射模板"""
    ttobj = TTFont('base.woff')
    tt_names = ttobj.getGlyphNames()[1:]    # 获取所有name值
    cmap = {}
    for i in tt_names:
        cmap[tuple(ttobj['glyf'][i].flags)] = i # 构造基本映射on数组模板
    return cmap


def aim_font():
    """目标字体文件映射处理"""
    res_num = {}    # 最新请求的明文映射
    cmap = base_font_map()
    response = requests.get(url, headers=headers)
    res_data = response.json()
    woff = res_data['woff']
    woff_file = base64.b64decode(woff.encode())
    with open('aim.woff', 'wb') as f:
        f.write(woff_file)
    ttobj_aim = TTFont('aim.woff')
    tt_names_aim = ttobj_aim.getGlyphNames()[1:]
    for i in tt_names_aim:
        print(tuple(ttobj_aim['glyf'][i].flags))
        print('基本模板的name', cmap[tuple(ttobj_aim['glyf'][i].flags)])
        print('当前请求的name', i)
        res_num[i] = r_map[cmap[tuple(ttobj_aim['glyf'][i].flags)]]     # 将当前请求的name对应的每一个on数组进行明文映射
    print(res_num)

输出结果如下:

在这里插入图片描述

这样明文的关系就成功映射好了,然后就是去将5页的数据全部映射出来并求出最大值就可以了。

当然这里也可以不够早新旧模板的映射,而直接获取最新字体文件并获取到每一个数字的坐标然后根据坐标绘制出坐标图再通过识别算法来识别绘制出来的数字。

结果如下:

在这里插入图片描述

由于需要填入的是召唤师的姓名,所以还需要我们去映射一下每一个召唤师和其胜点的关系,召唤师名直接从网页源代码中可以获取。

在这里插入图片描述

最终执行结果:

在这里插入图片描述

验证

在这里插入图片描述

完整代码请移步https://gitee.com/shuailiuquan/spider-code/tree/master/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s(Kubernetes)集群部署--使用 kubeadm方式部署

k8s集群部署--使用 kubeadm方式部署 一、测试所需环境(三台均要执行)二、配置准备(三台均要执行)1. 重命名hostname、添加hosts2. 关闭防火墙、selinux与swap3. 添加网桥过滤及内核转发配置文件4.同步时间5.安装ipset及ipvsadm 三…

Tomcat 下部署 jFinal

1、检查web.xml 配置&#xff0c;在 tomcat 下部署需要检查 web.xml 是否存在&#xff0c;并且要确保配置正确&#xff0c;配置格式如下。 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

网址导航收藏引导页面H5源码(自适应引导页HTML源码)-自动检测域名延迟

简介&#xff1a; 网址导航收藏引导页面H5源码&#xff08;自适应引导页HTML源码&#xff09;&#xff0c;可以自动检测域名延迟。这网址导航发布页不同于其它的&#xff0c;因为它可以测试所有域名的一个访问速度&#xff0c;并且将访问速度具象化显示出来&#xff0c;具体的…

性能调优降本实例

降本思路 在A企业内部&#xff0c;线上业务稳定性标准为&#xff1a;达到业务核定TPS时&#xff0c;CPU利用率的峰值不超过60&#xff05;&#xff0c;即为稳定状态。 在这个背景下&#xff0c;测试部门针对部分CPU消耗较高的系统进行了统一梳理和专项性能测试&#xff0c;旨…

Linux 挂载

挂载需要挂载源和挂载点 虚拟机本身就有的挂源 添加硬件 重启虚拟机 操作程序 sudo fdisk -l //以管理员权限查看电脑硬盘使用情况sudo mkfs.ext4 /dev/sdb //以管理员身份格式化硬盘sudo mkdir guazai //创建挂载文件夹 sudo mount /dev/sdb/guazai //将挂载源接上挂载点 s…

【数据结构】堆排序详解

文章目录 一、堆排序思想二、向上调整建堆排序三、向下调整建堆排序四、总结 对于什么是堆&#xff0c;堆的概念分类以及堆的向上和向下两种调整算法可见&#xff1a; 堆的创建 一、堆排序思想 int a[] { 2,3,5,7,4,6 };对于这样一个数组来说&#xff0c;要想要用堆排序对它…

Webserver项目解析

一.webserver的组成部分 Buffer类 用于存储需要读写的数据 Channel类 存储文件描述符和相应的事件&#xff0c;当发生事件时&#xff0c;调用对应的回调函数 ChannelMap类 Channel数组&#xff0c;用于保存一系列的Channel Dispatcher 监听器&#xff0c;可以设置为epo…

分享一个基于微信小程序的社区生活小助手源码调试和lw,有java+python双版本

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

让NPU跑起来迅为RK3588开发板设置交叉编译器

让NPU跑起来迅为RK3588开发板设置交叉编译器 编译器下载地址是网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \12_NPU 使用配套资料\03_编译所需工具\Linux”。 拷贝 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.gz 到 Ubuntu 的/opt/tool_ch…

JavaScript中的`async`和`await`关键字的作用

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ async关键字⭐ await 关键字3. 错误处理 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对We…

中国汽车供应商远赴德国,中国智驾方案能否远渡重洋?

作者|Amy 编辑|德新 今年的上海车展&#xff0c;中国智能汽车的进步有目共睹&#xff0c;吸引了大批外企高管和研发人员的关注&#xff0c;甚至引发了海外车企一系列的动作和调整。 而在刚刚结束的慕尼黑车展&#xff0c;中国车企及汽车供应链把「肌肉」秀到了现代汽车起源地…

flask要点与坑

简介 Flask是一个用Python编写的Web应用程序框架&#xff0c;该框架简单易用、模块化、灵活性高。 该笔记主要记录Flask的关键要点和容易踩坑的地方 Flask 日志配置 Flask 中的自带logger模块&#xff08;也是python自带的模块&#xff09;&#xff0c;通过简单配置可以实现…

浅谈拓展欧几里得算法

1、求特解 x 0 , y 0 x_0, y_0 x0​,y0​ 普通的欧几里得算法依据是辗转相除法&#xff0c;也就是&#xff0c;比如求 a &#xff0c; b a&#xff0c;b a&#xff0c;b 的最大公约数&#xff0c; a &#xff0c; b a&#xff0c;b a&#xff0c;b 进行辗转相除直到 a − b …

复盘:细数这些年写文字的成与败

引言 最近一直在思考和复盘&#xff0c;要说我这些年最后悔没坚持或者没做对的一件事就是没有好好写文字。时间过得很快&#xff0c;一晃笔者已经快毕业十年了&#xff0c;文章写得比较密集的时候还是大学时代和毕业头几年&#xff0c;后面输出就越来越少了&#xff0c;甚至一…

前端性能优化:提升网站速度与用户体验的终极指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在今天的数字时代&#…

【C++ 学习 ㉑】- 详解 map 和 set(上)

目录 一、C STL 关联式容器 二、pair 类模板 三、set 3.1 - set 的基本介绍 3.2 - set 的成员函数 3.1.1 - 构造函数 3.1.2 - 迭代器 3.1.3 - 修改操作 3.1.4 - 其他操作 四、map 4.1 - map 的基本介绍 4.2 - map 的成员函数 4.2.1 - 迭代器 4.2.2 - operator[] …

避免使用违规词,企业新媒体营销应注重品牌形象维护

随着越来越多的主体入局新媒体平台&#xff0c;为了维护平台健康的内容生态和创造良好的社区氛围&#xff0c;社交平台在内容上的监管越发严格。 不可避免的&#xff0c;很多做新媒体营销的企业开始陷入与平台审核的“拉扯”之中。 为了让品牌账号在各平台上顺利运营&#xff0…

二十一、MySQL(多表)内连接、外连接、自连接实现

1、多表查询 &#xff08;1&#xff09;基础概念&#xff1a; &#xff08;2&#xff09;多表查询的分类&#xff1a; 2、内连接 &#xff08;1&#xff09;基础概念&#xff1a; &#xff08;2&#xff09;隐式内连接&#xff1a; 基础语法&#xff1a; select 表1.name,…

使用Oracle自带SqlPlus导入导出数据库脚本

sqlplus sys/passwordorcl as sysdba ----cmd 进入Oracle sqlplus 1、导入例子&#xff1a; imp username/username127.0.0.1:1521/orcl fileD:\datasource\username0919.dmp fully imp 用户名/密码127.0.0.1:1521/orcl fileD:\datasource\备份名字.dmp fully 2、导出例子&a…

Redis实战:在CentOS 7上安装部署与应用探索

PS&#xff1a;文章最后有“开心一刻”&#xff0c;记得看哦&#xff0c;给生活增加点儿趣味。 一、Redis初识 Redis&#xff0c;全称Remote Dictionary Server&#xff0c;是一个开源的键值对存储数据库。它支持多种数据类型&#xff0c;如字符串、列表、集合、有序集合、哈希…