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.mzph.cn/news/80092.shtml

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

相关文章

一个Linux主机巡检脚本

功能: 对Linux主机的物理资源消耗进行监测和统计,对运行在本机上的服务进程进行监测和统计,列出本机上的账户有效期 使用场景: 在没有 Promethes、zabbix、夜莺等监控工具的条件下,通过 crontab 排程应用本程序完成对主…

【Training versus Testing】Positive intervals

GPT的解释: 这段话解释了在一维中,针对 "Positive intervals"(正间隔)假设类别 H 的成长函数 mq(N) 的计算方式,以及如何得出这个成长函数。 1. "Positive intervals" 指的是一维情境中的假设&a…

Maven导入和引用本地包的方法

maven项目中使用到了TrendDB_API.jar包&#xff0c;项目是直接导入的jar包而没用用maven的形式导入&#xff0c;导致在idea编辑时无法识别本地jar包&#xff0c;最后我采用的是用maven方式导入下本地jar包。 <dependency><groupId>TrendDB_API</groupId><…

clickhouse在执行alter table update delete等命令后数据没有更新

clickhouse之删除数据或更新数据无效的解决思路 例如&#xff1a; ALTER TABLE 表名 DELETE WHERE 条件 ALTER TABLE 表名 UPDATE column1 expr1 [, ...] WHERE filter_expr分析原因&#xff1a; 我们都知道ClickHouse内核中的MergeTree存储一旦生成一个Data Part&#xff0…

推荐书目:Python从入门到精通(文末送书)

目录 编辑推荐 内容简介 作者简介 前言/序言 本书特点 编辑推荐 “软件开发视频大讲堂”丛书是清华社计算机专业基础类零售图书畅销品牌之一。 &#xff08;1&#xff09;2008—2023年&#xff0c;丛书累计修订7次&#xff0c;销售400万册&#xff0c;深受广大程序员喜爱。…

Spring安全配置: 构建安全稳固的Java应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

2023国赛B题:多波束测线问题 评阅要点完整分析

本文所有分析仅代表个人观点&#xff0c;不代表官方&#xff0c;仅供参考 制作人&#xff1a;川川徒弟 demoo CSDN&#xff1a;川川菜鸟公众号&#xff1a;川川带你学AI 全文采用非编程做法  需要工具&#xff1a; geogebra、matlab工具箱   注&#xff1a; 本文全文不考虑…

前端Layui框架介绍

当涉及到前端UI框架时&#xff0c;Layui&#xff08;简称layui&#xff09;是一个备受欢迎的框架之一。在这篇博客中&#xff0c;我们将深入了解layui&#xff0c;包括其市场占有率、开发语言、使用场景、框架特点以及一些使用案例。 1. 市场占有率 Layui 是一款流行的前端UI框…

3.4 设置环境变量MAKEFILES

一、MAKEFILES简介 MAKEFILES是一个环境变量&#xff0c;可以用来指定额外的makefile文件列表。当设置了MAKEFILES环境变量后&#xff0c;make命令会在其他makefile文件之前读取这些指定的makefile文件。 使用MAKEFILES类似于使用include指令&#xff0c;可以在多个目录中搜索…

Mysql

视频链接 黑马Mysql 基础篇 通用语法及分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控…

网络原理,了解xml, json,protobuffer的特点

目录 外卖服务器场景带入 大佬们通用的规范格式 一、&#x1f466; 外卖服务器场景 外面服务器沟通有很多模式——展示商家列表等等&#xff0c;只是其中一个&#xff0c;因此需要一个统一的规划了——不同应用程序&#xff0c;里面的自定义格式是不一样的&#xff0c;这样的…

icmp报文及用go实现

目录 一、概述 二、ICMP报文格式详解 2.1 什么是ICMP 2.2 ICMP报文格式 2.3 ICMP报文类型 2.4 实际报文举例 三、使用go实现icmp请求以及接收响应内容 一、概述 本文主要旨在学习icmp报文格式&#xff0c;以及通过go语言来实现ICMP发包。 二、ICMP报文格式详解 2.1 什…

练习:使用servlet显示试卷页面

试卷页面代码 在浏览器输入如下地址&#xff1a; http://localhost/examPageServlet 效果如下&#xff1a;

SV-6002T-P 网络对讲求助终端,立柱式智慧城市网络对讲求助终端,停车场出入口一键求助终端

SV-6002T-P 网络对讲求助终端&#xff0c;立柱式智慧城市网络对讲求助终端&#xff0c;停车场出入口一键求助终端 描述&#xff1a;SV-6002T是深圳锐科达电子有限公司的一款新型立柱型室外防水一键求助对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数…

mysql的约束

文章目录 一、主键约束二、主键约束自增三、联合主键四、外键约束五、非空约束六、唯一约束七、默认约束八、检查约束 一、主键约束 作用&#xff1a;保证主键的值唯一且非空1张表只能创建1个主键格式 -- 创建表时添加 create table t1 (id int primary key );-- 创建表之后添…

基于Java+freemarker实现动态赋值以及生成Word文档

前言 有一个需求就是给定一个正确格式的 Word 文档模板&#xff0c;要求通过动态赋值方式&#xff0c;写入数据并新生成 该模板格式的 Word 文档。这很明显使用 Javafreemarker 方式来实现颇为简单。 一、导入依赖 <!-- freemarker --> <dependency><groupId…

Qt点亮I.MX6U开发板的一个LED

本篇开始将会介绍与开发版相关的Qt项目&#xff0c;首先从点亮一个LED开始。I.MX6U和STM32MP157的相关信息都会用到&#xff0c;但是后期还是将I.MX6U的学习作为重点。当然其他开发版的开发也可以参考本博文。 文章目录 1. Qt是如何操控开发板上的一个LED2. 出厂内核设备树中注…

Spring-Cloud GateWay+Vue 跨域方案汇总

文章目录 一、简介背景和概述 二、前端跨域解决方案Axios跨域CORS跨域 三、后端跨域解决方案反向代理服务器 四、Spring Cloud中的跨域解决方案Gateway网关的跨域配置 五、基于Vue和Spring Cloud的跨域整合实践**这两种配置只需配置一种即可生效&#xff08;前端or后端&#xf…

CPU的三级缓存

CPU缓存&#xff08;Cache Memory&#xff09;是位于CPU与内存之间的临时存储器&#xff0c;它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾&#xff0c;因为CPU运算速度要比内存读写速度快很多&#…

使用Python CV2融合人脸到新图片--优化版

优化说明 上一版本人脸跟奥特曼图片合并后边界感很严重&#xff0c;于是查找资料发现CV2还有一个泊松函数很适合融合图像。具体代码如下&#xff1a; import numpy as np import cv2usrFilePath "newpic22.jpg" atmFilePath "atm2.jpg" src cv2.imrea…