WPS+Python爬取百度之星排名

news2024/11/28 22:41:59

运行效果

手动拉取

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 requests

url = '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) + '题通过时间'] = 0
        tempData[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 requests

url = '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) + '题通过时间'] = 0
                tempData[str(i) + '题罚时次数'] = 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

py拉取高校排名

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

import requests

url = '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.coloradmin.cn/o/1902786.html

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

相关文章

2024年中国陶瓷轴承用氮化硅粉体市场发展现状及重点竞争企业研究

2024年中国陶瓷轴承用氮化硅粉体市场发展现状及重点竞争企业研究 氮化硅是一种硬度高、结构稳定、热膨胀系数小,抗氧化和抗侵蚀性能好的一种的陶瓷材料,可用于制造高性能氮化硅陶瓷结构件、坩埚涂层等。近年来,伴随着机械制造行业进一步向高精…

计算机网络性能指标概述:速率、带宽、时延等

在计算机网络中,性能指标是衡量网络效率和质量的重要参数。本文将综合三篇关于计算机网络性能指标的文章,详细介绍速率、带宽、吞吐量、时延、时延带宽积、往返时延(RTT) 和利用率的概念及其在网络中的应用。 1. 速率(…

C++之do-while陈述

回圈是用来进行进行重复性的工作,典型的回圈会进行下列三项基本任务 1.控制变数初始设定2. 回圈结束条件测试3. 调整控制变数的值 关键字(keyword) do与while构成C 中回圈的一种,常用于后测式的回圈,意思是回圈会先进行第一轮,然后…

硅纪元应用评测 | 弱智吧大战GPT4o和Claude 3.5 Sonnet

"硅纪元AI应用测评"栏目,深入解析和评测最新的人工智能应用,提供专业见解和实用建议。不论您是AI专家还是科技爱好者,都能找到权威、详尽的测评,帮助您在快速发展的AI领域中做出最佳选择。一起探索AI的真实潜力&#xf…

YOLOv8改进 | 注意力机制 | 增强模型在图像分类和目标检测BAM注意力【小白必备 + 附完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

华为机试HJ35蛇形矩阵

华为机试HJ35蛇形矩阵 题目: 想法 从题目中得到规律,第一行是每个位置上的等差数列的和(第一个位置是1,第二个位置是12,第三个位置是123,以此类推)。第二行是第一行从第二个位置每个元素减一&…

使用Adobe Acrobat对PDF文档进行数字签名

文章目录 前言一、使用Adobe Acrobat对PDF文档进行数字签名1.使用Adobe Acrobat打开需要进行签名的PDF文档2. 点击【查看更多】3.点击【使用证书】4.点击【数字签名】5.使用鼠标选定一个区域6.选择您需要使用的证书 → 点击【继续】7.点击【签名】8.签名成功 前言 一、使用Ado…

06浅谈大语言模型可调节参数TopP和TopK

浅谈大模型参数TopP和TopK 大语言模型中的temperature、top_p和top_k参数是用来控制模型生成文本时的随机性和创造性的。下面分享一下topP和topK两个参数的意义及逻辑; top K(Top-K Sampling) 作用:只从模型认为最可能的k个词中选…

项目/代码规范与Apifox介绍使用

目录 一、项目规范: (一)项目结构: (二)传送的数据对象体 二、代码规范: (一)数据库命名规范: (二)注释规范: &…

数据库可视化管理工具dbeaver试用及问题处理。

本文记录了在内网离线安装数据库可视化管理工具dbeaver的过程和相关问题处理方法。 一、下载dbeaver https://dbeaver.io/download/ 笔者测试时Windows平台最新版本为:dbeaver-ce-24.1.1-x86_64-setup.exe 二、安装方法 一路“下一步”即可 三、问题处理 1、问…

Python中异步事件触发

1、问题背景 在Python中,我想创建一个由事件生成控制流程的类结构。为此,我做了以下工作: class MyEvent: EventName_FunctionName {}classmethoddef setup(cls, notificationname, functionname):if notificationname in MyEvent.EventN…

PCIe驱动开发(1)— 开发环境搭建

PCIe驱动开发(1)— 开发环境搭建 一、前言 二、Ubuntu安装 参考: VMware下Ubuntu18.04虚拟机的安装 三、QEMU安装 下载网站: https://download.qemu.org 下载文件:qemu-4.1.0-rc5.tar.xz 使用如下命令解压: tar …

竞赛选题 卷积神经网络手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

centos7|操作系统|升级openssl-1.0.2k到openssl-3.3.0

一、 前言: opensssl是什么软件?openssl的版本是怎样的?为什么需要升级openssl?如何升级openssl? 1、openssl是一个什么样软件? OpenSSL是一个开源的安全套接字层(Secure Sockets Layer&…

Ubuntu 22.04.4 LTS 安装 FreeRADIUS 3.0 和 Daloradius 2.2 搭建radius 认证服务器

1 ubuntu 安装LAMP 环境(安装nginx代替apache): Ubuntu 22.04.4 LTS 安装 php apache LAMP 环境nginx-CSDN博客 2 安装freeradius sudo apt update sudo apt-get install libmysqld-dev sudo apt-get install freeradius #先安装libmysqld-dev,否则启…

LabVIEW与OpenCV图像处理对比

LabVIEW和OpenCV在图像处理方面各有特点。LabVIEW擅长图形化编程、实时处理和硬件集成,而OpenCV则提供丰富的算法和多语言支持。通过DLL、Python节点等方式,OpenCV的功能可在LabVIEW中实现。本文将结合具体案例详细分析两者的特点及实现方法。 LabVIEW与…

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能

作为今年最受期待的音乐制作 DAW 更新之一,FL Studio 2024发布引入了新功能,同时采用了新的命名方式,从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Cloud…

PsQuerySystemDllInfo逆向

typedef struct _SYSTEM_DLL_ENTRY {ULONG64 type;UNICODE_STRING FullName;PVOID ImageBase;PWCHAR BaseName;PWCHAR StaticUnicodeBuffer; }SYSTEM_DLL_ENTRY, * PSYSTEM_DLL_ENTRY; 返回值为上面的结构体指针 验证 type: fullname inagebase: pwchar basename PWCHAR …

java wait, notify, notifyAll三个方法

wait(), notify(), 和 notifyAll() 是 Java 中用于线程间通信和同步的方法,它们都是 Object 类中的方法,而非 Thread 类的方法。这些方法通常与 synchronized 关键字一起使用,用于实现线程之间的协作和互斥访问共享资源。 关于生产者-消…

Qt中word转换为pdf多线程QRunable继承QObject出现的问题

转换的时候,经常会用到转换结束通知显示进度,因此需要使用到多线程, class PdfRunable : public QRunnable, public QObject { Q_OBJECT public: PdfRunable(QObject *parent); ~PdfRunable(); void run(); signals: }; 初…