WPS+Python爬取百度之星排名

运行效果

手动拉取

https://www.matiji.net/exam/contest/contestdetail/146

如果手动查找,那么只能通过翻页的方式,每页10行(外加一行自己)。
image.png

爬取效果预览

本脚本爬取了个人排名和高校排名,可以借助WPS或MS Office的表格工具方便分析数据(开盒)。
image.png

原理支撑

前提:

  • WPS表格支持py环境,并封装了方便的表格工具

过程:

  1. 通过py模拟用户请求,将返回值对对象的形式封装
  2. 打印对象,找规律,将需要的信息重新封装
  3. 写入WPS表格

抠榜单接口

打开开发人员工具,默认快捷键是F12
不同的浏览器,页面可以不一样,需要切换到“网络”标签下。
image.png

获取接口URL

切换分页:切换到第2页和第3页。每次切换,浏览器都发送了一个名为queryMatchRankListById.do的请求。
可见相应内容含广州市铁一中学字段。根据返回的内容,可以暂定为所求的榜单接口。
image.png

判断请求方式

切换到标头标签下,可见:

  • URL为:https://www.matiji.net/exam-back/pc/queryMatchRankListById.do
  • 方法为:POST

image.png

判断请求负载

切换到负载标签下,可见携带了三个参数,根据单词,可以推测语义为:

  • start:从哪开始
  • limit:获取几条
  • matchId:哪个比赛

负载方式是“表单数据”
image.png

验证接口

打开apifox,填入提取到的信息。
注意截图中被框选的地方。
image.png
发送请求,可见得到了正确的响应。
部分接口还需要携带额外参数,来验证请求。需要不断调试。
image.png

py拉取个人排名

WPS的py环境

新建“智能表格”,而不是“Office表格”。
在“效率”中,找到“PY脚本编辑器”。
image.png

引入配置

import requestsurl = 'https://www.matiji.net/exam-back/pc/queryMatchRankListById.do'
formData = {"start": 0,"limit": 200,"matchId": 146
}

引入requests包是为了发送HTTP请求。
URL和请求负载分别封装,是为了方便之后的调试。

定义时间格式化函数

接口返回的时间是一个大整数。
而网页显示的是一个hh:mm:ss格式的字符串。
需要格式化。

def getTime(time):return str(int(time / 3600)) + ':' + str(int(time / 60 % 60)) + ':' + str(int(time % 60))

轮询榜单

在循环开头定义结束条件。
结束条件通过调试接口获取:

  • 在榜单正常获取是,error_no值为0

image.png
对于当前轮次的响应,需要调用.json(),以对象的方式获取响应数据。
cur用于维护下一行,将当前批次的数据插入到合理的位置。

cur = 0
while True:response = requests.post(url, data=formData).json()if response['error_no'] != '0':exit(0)

image.png
输出结果同Apifox

取出单行数据

当前查询返回的是10个人的信息。
image.png
以数组的方式存储在.data.datas中,需要逐项取出格式化。

xslxList = []
for data in response['data']['datas']:tempData = {}tempData['完成用时'] = getTime(data.get('finishTime', 0))tempData['matchId'] = data.get('matchId', 0)tempData['用户名'] = data.get('nickname', '')tempData['排名'] = data.get('orderIndex', 0)tempData['AC数'] = data.get('passCount', 0)tempData['学校'] = data.get('school', '')tempData['userId'] = data.get('userId', 0)

xslxList一个列表,用于存储当前批次的数据,以及表头(如果是第一次写入)
tempData一个字典,用于临时存储每个用户的详细信息和成绩

处理题目数据

datas是一个列表,数据项questionScoreList也是一个列表。
写入表格要求“维度相同”,需要拆成单个键值对。

if 'questionScoreList' in data:for questionScore in data['questionScoreList']:orderIndex = questionScore['orderIndex']tempData[str(orderIndex) + '题通过时间'] = getTime(questionScore['commitSpendTime'])tempData[str(orderIndex) + '题罚时次数'] = questionScore['errorCount']
else:for i in range(1, 9):tempData[str(i) + '题通过时间'] = 0tempData[str(i) + '题罚时次数'] = 0

亲测爆零选手不含questionScoreList字段,也需要初始化,否则会插入失败。
将处理完的用户插入到列表中。
如果是第一行,需要特判,多插一行表头。

if cur == 0 and len(xslxList) == 0:xslxList.append(list(tempData.keys()))
xslxList.append(list(tempData.values()))

写入表格

在WPS中写入表格不需要引第三方库,WPS封装了更简单的实现方法。

write_xl(xslxList, "A" + str(1 + cur),sheet_name="个人排名")
cur += len(xslxList)
formData['start'] = cur - 1

插入表格之后需要维护curformData,确保正确地访问下一批次,并插入到正确的位置。

完整py代码

亲测官方没有限制limit参数,或者限制不大。
一次性请求多条也不会被拉黑。
使用之前需要开启网络API
image.png

import requestsurl = 'https://www.matiji.net/exam-back/pc/queryMatchRankListById.do'
formData = {"start": 0,"limit": 200,"matchId": 146
}def getTime(time):return str(int(time / 3600)) + ':' + str(int(time / 60 % 60)) + ':' + str(int(time % 60))cur = 0
while True:response = requests.post(url, data=formData).json()if response['error_no'] != '0':exit(0)xslxList = []for data in response['data']['datas']:tempData = {}tempData['完成用时'] = getTime(data.get('finishTime', 0))tempData['matchId'] = data.get('matchId', 0)tempData['用户名'] = data.get('nickname', '')tempData['排名'] = data.get('orderIndex', 0)tempData['AC数'] = data.get('passCount', 0)tempData['学校'] = data.get('school', '')tempData['userId'] = data.get('userId', 0)if 'questionScoreList' in data:for questionScore in data['questionScoreList']:orderIndex = questionScore['orderIndex']tempData[str(orderIndex) + '题通过时间'] = getTime(questionScore['commitSpendTime'])tempData[str(orderIndex) + '题罚时次数'] = questionScore['errorCount']else:for i in range(1, 9):tempData[str(i) + '题通过时间'] = 0tempData[str(i) + '题罚时次数'] = 0if cur == 0 and len(xslxList) == 0:xslxList.append(list(tempData.keys()))xslxList.append(list(tempData.values()))write_xl(xslxList, "A" + str(1 + cur),sheet_name="个人排名")cur += len(xslxList)formData['start'] = cur - 1

py拉取高校排名

高校排名比个人排名简单,没有嵌套列表。

import requestsurl = 'https://www.matiji.net/exam-back/pc/queryMatchSchoolRankListById.do'
formData = {"start": 0,"limit": 100,"matchId": 146
}cur = 0
while True:response = requests.post(url, data=formData).json()if response['error_no'] != '0':exit(0)xslxList = []for data in response['data']['datas']:tempData = {}tempData['排名'] = data['orderIndex']tempData['学校'] = data['school']tempData['参赛人数'] = data.get('totalUser',0)tempData['AC数'] = data.get('totalAc',0)if cur == 0 and len(xslxList) == 0:xslxList.append(list(tempData.keys()))xslxList.append(list(tempData.values()))write_xl(xslxList, "A" + str(1 + cur),sheet_name='高校排名')cur += len(xslxList)formData['start'] = cur - 1

当前排名

截止写到这一行的时候,已拉取的最新排名:

  • baidu.xlsx

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

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

相关文章

华为OSPF配置DR和BDR与指定DR

基础配置 <Huawei>sys #进入配置模式 Enter system view, return user view with CtrlZ. [Huawei]un in en #关闭报文弹窗 Info: Information center is disabled. [Huawei]sys R1 #设备名更改为R1 [R1]int g0/0/0 …

调度系统揭秘(下):调度算法与架构设计

文章目录 一、调度算法1.1、广度优先:1.2、深度优先1.3、总结广度优先搜索&#xff08;BFS&#xff09;深度优先搜索&#xff08;DFS&#xff09; 二、架构设计2.1、Master/Slave架构优劣分析 2.2、Leader架构优劣分析 2.3、总结 一、调度算法 在调度系统中&#xff0c;调度算…

.hmallox勒索病毒:全面防御策略

引言 近年来&#xff0c;随着网络技术的飞速发展&#xff0c;勒索病毒成为网络安全领域的一大威胁&#xff0c;其中.hmallox勒索病毒以其高度的隐蔽性和破坏性&#xff0c;尤为引人注目。这种病毒通过加密用户计算机中的重要文件&#xff0c;并以支付赎金作为解密条件&#xff…

MyBatis中二级缓存的配置与实现原理

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 上一篇文章《MyBatis中一级缓存的配置与实现原理》中&#xff0c;我们已经掌握了 MyBatis 一级缓存的配置&#xff08;虽然…

vue3实现echarts——小demo

版本&#xff1a; 效果&#xff1a; 代码&#xff1a; <template><div class"middle-box"><div class"box-title">检验排名TOP10</div><div class"box-echart" id"chart1" :loading"loading1"&…

Linux操作系统中逻辑卷的缩减

流程&#xff1a;第一步先是要缩减逻辑卷的文件系统。 第二步就是要去缩减逻辑卷的物理边界。 注意事项&#xff1a; 1.逻辑卷要处于卸载状态&#xff0c; 2.建议先备份数据 3.在缩减逻辑卷的时候&#xff0c;要注意xfs文件系统的逻辑卷是不支持直接进行缩减的。 4.在缩减…

Linux:DHCP服务配置

目录 一、DHCP概述以及DHCP的好处 1.1、概述 1.2、DHCP的好处 二、DHCP的模式与分配方式 2.1、模式 2.2、DHCP的分配方式 三、DHCP工作原理 四、安装DHCP服务 五、DHCP局部配置并且测试 5.1、subnet 网段声明 5.2、客户机预留指定的固定ip地址 一、DHCP概述以及DHCP…

下载nvm 管理多个node版本并切换

nvm管理多个node版本并切换 安装nvm时不能安装任何node版本&#xff08;先删除node再安装nvm&#xff09;&#xff0c;保证系统无任何node.js残留 1. 卸载node 控制面板中卸载nodejs 删除以下文件夹&#xff1a; C:\Program Files (x86)\Nodejs C:\Program Files\Nodejs C…

MybatisX插件的简单使用教程

搜索mybatis 开始生成 module path&#xff1a;当前项目 base package:生成的包名&#xff0c;建议先独立生成一个&#xff0c;和你原本的项目分开 encoding&#xff1a;编码&#xff0c;建议UTF-8 class name strategy&#xff1a;命名选择 推荐选择camel&#xff1a;驼峰命…

Go:hello world

开启转职->Go开发工程师 下面是我的第一个go的程序 在上面的程序介绍&#xff1a; 1、package main 第一行代码package main定义了包名。必须在源文件中非注释的第一行指明这个文件属于哪个包&#xff0c;如&#xff1a;package main。package main表示一个可独立执行的程…

spRAG框架学习小结

spRAG是什么 spRAG是一个针对非结构化数据的检索引擎。它特别擅长处理对密集文本的复杂查询&#xff0c;比如财务报告、法律文件和学术论文。有两种关键方法用于提高性能&#xff0c;超越了普通的RAG系统&#xff1a; 自动上下文&#xff08;AutoContext&#xff09;&#xff…

µCOS-III 任务同步机制-任务信号量

1. 什么是任务信号量 任务信号量是一种用于任务间同步和通信的计数器&#xff0c;通常用于解决任务间的竞争条件和资源共享问题。在C/OS-III中&#xff0c;任务信号量提供了二进制信号量和计数信号量两种类型&#xff1a; 二进制信号量&#xff1a;只能取值0或1&#xff0c;适…

Debezium报错处理系列之第109篇:解决升级日志解析jar包重启集群出现的字段类型和值不匹配的错误

Debezium报错处理系列之第109篇:解决升级日志解析jar包重启集群出现的字段类型和值不匹配的错误 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezi…

传统IO和NIO文件拷贝过程

参考&#xff1a;https://blog.csdn.net/weixin_57323780/article/details/130250582

昇思25天学习打卡营第9天|ResNet50图像分类

一、Resnet残差网络模型 构建残差网络结构;Building BlockBottleneck 残差结构由两个分支构成&#xff1a;一个主分支 &#x1d439;(&#x1d465;)&#xff0c;一个shortcuts&#xff08;图中弧线表示,&#x1d465;&#xff09;。 得到残差网络结构:&#x1d439;(&#x…

SpringMVC常见的注解

一、Spring MVC Spring Web MVC是基于ServletAPI构建的原始web 框架&#xff0c;一开始就包含在Spring 框架中&#xff0c;通常被称为“Spring MVC”。 1.MVC 是什么&#xff1f; MVC(Model、View、Controller&#xff09;是软件工程中的一种软件架构设计模型。它把软件系统分…

STM32-输入捕获IC和编码器接口

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 输入捕获IC1.1 输入捕获IC简介1.2 频率测量1.3 输入捕获通道1.4 主从触发模式1.5 输入捕获基本结构1.6 PWMI基本结构 2. 输入捕获库函数及代码2.1 输入捕获库函数2.2 6-6 输入捕获模式测频率2.2.1 硬件连接2.2.2 硬…

2024暑假集训

Day1——枚举 Day2——测试 Day3——贪心 Day4、5——测试 ——————————————————————————————————————————— Day3T7&Day5T7:没思路 Day3T8:不知道怎么排序筛选 Day5T5:没有算法难度&#xff0c;但是不知道怎么处理2队奶牛的情…

什么牌子的头戴式蓝牙耳机好性价比高?

说起性价比高的头戴式蓝牙耳机,就不得不提倍思H1s,作为倍思最新推出的新款,在各项功能上都实现了不错的升级,二字开头的价格,配置却毫不含糊, 倍思H1s的音质表现堪称一流。它采用了40mm天然生物纤维振膜,这种振膜柔韧而有弹性,能够显著提升低音的量感。无论是深沉的低音还是清…

数据跨境法案:美国篇上

近年来随着全球数字化的加速发展&#xff0c;数据已成为国家竞争力的重要基石。在这样的背景下&#xff0c;中国软件和技术出海的场景日益丰富。本系列邀请到在跨境数据方面的研究人员针对海外的数据跨境政策进行解读。 本期将针对美国对数据跨境流动的态度和政策进行阐释。过…