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,一经查实,立即删除!

相关文章

【Training versus Testing】Positive intervals

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

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

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

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

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

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

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

前端Layui框架介绍

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

Mysql

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

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

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

icmp报文及用go实现

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

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

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

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

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

基于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…

Gmail邮箱注册情况及最新动态

在中国大陆地区&#xff0c;对于是否可以注册Gmail邮箱一直存在一定的限制和讨论。准确来说&#xff0c;中国大陆地区的用户目前无法直接访问和注册Gmail邮箱。由于某些政策和技术原因&#xff0c;中国政府对于一些外国的网站和服务实施了网络封锁与限制。因此&#xff0c;中国…

JMeter基础 —— 使用Badboy录制JMeter脚本!

1、使用Badboy录制JMeter脚本 打开Badboy工具开始进行脚本录制&#xff1a; &#xff08;1&#xff09;当我们打开Badboy工具时&#xff0c;默认就进入录制状态。 如下图&#xff1a; 当然我们也可以点击录制按钮进行切换。 &#xff08;2&#xff09;在地址栏中输入被测地…

Java学习——基本语法笔记

1. 基本框架 Java中的程序是以类为单位&#xff0c;所以所有的程序都必须在class定义范畴之内&#xff0c; 类的定义有两种形式&#xff1a; class 类名称{程序代码 } public class 类名称{程序代码 } ⭐public class定义类&#xff0c;要求文件名称与类名称一致 ⭐如果现在没有…

Linux学习之MySQL连接查询

接上一篇 连接查询 连接查询也中多表查询&#xff0c;常用于查询来自于多张表的数据&#xff0c;通过不同的连接方式把多张表组成一张新的临时表&#xff0c;再对临时表做数据处理。 #表基础信息&#xff0c;内容可从上一篇博客中查看 mysql> desc departments; ---------…

gRpc_go_dart-1.编写第一个服务

​ 通俗的讲下grpc 简化掉所有复杂的实现,它要求服务端和客户端之间按照protobuf的规范进行数据交换,所以服务端和客户端都不用关心彼此的代码实现,只关心按照protobuf的形式提供数据 为什么是go和dart 技术栈,已经是google的形状了 同时,go客户端和Flutter间本身通过http…