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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

from fontTools.ttLib import TTFontwoff = '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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 cmapdef 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.rhkb.cn/news/133914.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TuyaOS开发学习笔记(2)——NB-IoT开发SDK架构、运行流程

一、SDK架构 1.1 架构框图 基于 TuyaOS 系统,可以裁剪得到的适用于 NB-IoT 协议产品接入的 SDK。SDK 将设备配网、上下行数据通信、产测授权、固件 OTA 升级等接口进行封装,并提供相关函数。 1.2 目录结构 1.2.1 TuyaOS目录说明 adapter:T…

70、Spring Data JPA 的 自定义查询(全手动,自己写完整 SQL 语句)

1、方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体) 2、Query查询(半自动:提供 SQL 或 JPQL 查询) 3、自定义查询(全手动) ★ 自定义查询&#xff08…

范文展示,如何三步写出一篇满意的论文

第一步:输入文章关键信息 文章标题,写论文的话即为拟定的论文标题,例如这篇范文中的题目为“阳明心学研究” 关键词,可以写出多个论文主题相关的关键词,用逗号分开,例如这篇范文中只写了一个关键词“王阳…

9.12 C++作业

实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性:半…

长城网络靶场第三题

关卡描述:1.oa服务器的内网ip是多少? 先进行ip统计,开始逐渐查看前面几个ip 基本上都是b/s,所以大概率是http,过滤一下ip 第一个ip好像和oa没啥关系 第二个ip一点开就是 oa,应该就是他了。 关卡描述&a…

指针-子串逆置

任务描述 从标准输入上读入以空格分隔的字符串 s 和 t,将 s 中与 t 匹配的所有子串逆置后再输出 s,当 s 中无与 t 匹配的子串时直接输出字符串 s。已经匹配的字符不会再重复匹配。 相关知识 参考之前的关卡。 编程要求 根据提示,在右侧编…

Golang编写自定义IP限流中间件

目录 基于令牌桶的限流算法实现高并发限流(使用golang官方限流器)Go代码测试记录ab -t 1 -c 1 http://127.0.0.1:8080/api/resource结果预测:1秒内最多生成10个令牌,而总共有20个串行的请求,结果应该是1个成功&#xf…

CentOS 7.6使用mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar安装Mysql 8.0

https://downloads.mysql.com/archives/community/是社区版的官网,可以选择版本下载。 cat /etc/redhat-release可以看到系统版本是CentOS Linux release 7.6.1810 (Core),uname -r可以看到版本是3.10.0-957.el7.x86_64。 yum remove -y mysql-libs把…

来看看Python MetaClass元类详解

MetaClass元类,本质也是一个类,但和普通类的用法不同,它可以对类内部的定义(包括类属性和类方法)进行动态的修改。可以这么说,使用元类的主要目的就是为了实现在创建类时,能够动态地改变类中定义…

Python3.10 IDLE更换主题

前言 自定义主题网上有很多,3.10IDLE的UI有一些新的东西,直接扣过来会有些地方覆盖不到,需要自己测试着添几行配置,以下做个记录。 配置文件路径 Python安装目录下的Lib\idlelib\config-highlight.def。如果是默认安装&#xf…

轻松鲨-AI文案写作 人工智能聊天

轻松鲨AI助手使用地址:http://www.qingsongsha.com?utm_sourcenavigation_website 或前往苹果App Store下载“轻松鲨APP” 支持AI连续对话聊天,帮你解答各种疑问... 让AI帮你画思维导图写文案,提升工作效率... 内置多场景专业模板&#xff0…

解决 tesserocr报错 Failed to init API, possibly an invalid tessdata path : ./

问题描述 我们在初次使用tesserocr库的时候,可能会报以下错误: RuntimeError: Failed to init API, possibly an invalid tessdata path: ./ 这是因为我们在使用 conda 创建的环境中找不到"tessdata"这个文件夹。 解决办法 这时候把Tessera…

品牌是什么?品牌加分秘笈曝光

作为一个多年的品牌人,这几年,历经迷惘和探索,迷惘在于: 1.品牌部是花钱部门,不直接创造营收,不受老板重视、钱少。 2.品牌作业难以衡量,一般以曝光、阅读、声量指数等指标来衡量,…

026-从零搭建微服务-文件服务(二)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…

鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决

目录 问题解决思路解决代码(标注【主要代码】的为重点) 问题 拖动该悬浮球时,鼠标弹起可能会触发悬浮球内事件 解决思路 鼠标拖动盒子时,将 isMove 设为 true 意为正在拖动盒子,此时将 class"btns_move" 遮…

利用 SOAR 加快事件响应并加强网络安全

随着攻击面的扩大和攻击变得越来越复杂,与网络攻击者的斗争重担落在了安全运营中心 (SOC) 身上。SOC 可以通过利用安全编排、自动化和响应 (SOAR) 平台来加强组织的安全态势。这一系列兼容的以安全为中心的软件可加快事…

单元格法近似求解多边形最大内接矩形问题【思路讲解+java实现】

文章目录 问题描述问题解决方案多边形网格化区分每个单元格是在多边形内部还是外部根据已标记单元格寻找最大内接矩形剪枝优化多角度旋转 案例测试代码实现说明 问题描述 给定一个多边形的点集,希望找出多边形内部面积最大的矩形。该问题可能出现在,从一…

聊聊Spring事务同步器TransactionSynchronization

在一些业务场景中可能我们需要去对某一个spring事务的生命周期进行监控,比如在这个事务提交,回滚,被挂起的时候,我们想要去执行一些自定义的操作,这怎么去做呢?其实spring作为一个高扩展性的框架&#xff0…

关系型三大范式与BCNF有什么用呢

学的时候就知道是一堆公式。 实际中在设计表的时候可能会用到。 前提是关系型数据库,比如mysql。 (实际中oracle比mysql更好用。但是他收费啊。) 第一范式:每个属性都是原子的(需要做到每个属性都是不可分割的。&…

02 java ---- Android 基础app开发

目录 相对布局 显示一个美女 显示两个美女 安卓APP启动过程 安卓布局控件 常用布局之相对布局 常用布局之相对布局 padding和margin 按键美化 常用布局之线性布局 安卓按键响应的几种方式 直接设置按键的onClick绑定的函数 自定义类实现按键监听事件的接口 匿名内…