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.rhkb.cn/news/371624.html

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

相关文章

66.Python-web框架-Django-免费模板django-datta-able的分页的一种方式

目录 1.方案介绍 1.1实现效果 1.2django.core.paginator Paginator 类: Page 类: EmptyPage 和 PageNotAnInteger 异常: 1.3 templatetags 2.方案步骤 2.1创建一个common app 2.2创建plugins/_pagination.html 2.3 其他app的views.py查询方法 2.4在AIRecords.html里…

Table 表格--分页序号自增

代码: import { Space, Table, Tag } from antd; import type { ColumnsType } from antd/es/table; import React, { useState } from react;interface DataType {key: string;name: string;age: number;address: string;tags: string[]; }const data: DataType[]…

HTML5实现我的音乐网站源码

文章目录 作者:[xcLeigh](https://blog.csdn.net/weixin_43151418) 1.设计来源1.1 界面效果1.2 轮播图界面1.3 音乐播放界面1.4 视频播放界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作…

ImportError: DLL load failed while importing _imaging: 操作系统无法运行 %1

解决方案: (1)搜索打开Anaconda Prompt控制台,进入到自己要安装的环境下面去,卸载Pillow:pip uninstall Pillow 没有安装Pillow的就不用卸载,直接安装, (2)然后再安装&a…

常用的MRI分析软件

MRI(磁共振成像)分析软件种类繁多,涵盖了从基础图像处理到高级数据分析的各个方面。这些软件广泛应用于临床诊断、研究和教育等领域。以下是一些常用的MRI分析软件: 开源软件 商用软件 特殊用途软件 在线工具和云平台 这些软件各…

『C++成长记』string模拟实现

🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.…

Linux内核链表使用方法

简介: 链表是linux内核中最简单,同时也是应用最广泛的数据结构。内核中定义的是双向链表。 linux的链表不是将用户数据保存在链表节点中,而是将链表节点保存在用户数据中。linux的链表节点只有2个指针(pre和next),这样的话&#x…

【Linux】记录一起网站劫持事件

故事很短,处理也简单。权当记录一下,各位安全大大们手下留情。 最近一位客户遇到官网被劫持的情况,想我们帮忙解决一下(本来不关我们的事,毕竟情面在这…还是无偿地协助一下),经过三四轮“谦让…

多线程(进阶)

前言👀~ 上一章我们介绍了线程池的一些基本概念,今天接着分享多线程的相关知识,这些属于是面试比较常见的,大部分都是文本内容 常见的锁策略 乐观锁 悲观锁 轻量锁 重量级锁 自旋锁 挂起等待锁 可重入锁和不可重入锁 互斥…

Python结合MobileNetV2:图像识别分类系统实战

一、目录 算法模型介绍模型使用训练模型评估项目扩展 二、算法模型介绍 图像识别是计算机视觉领域的重要研究方向,它在人脸识别、物体检测、图像分类等领域有着广泛的应用。随着移动设备的普及和计算资源的限制,设计高效的图像识别算法变得尤为重要。…

MPI hello world SSH 免密互联

目标: 我们想实现2台主机免密互联,将MPI Hello World跑起来 假设hostname是node01,node02,(Linux shell窗口一般是UserNameHostName,node1和node2一定要和HostName一样) hostname是/etc/hosts中的配置,如下…

并发编程-05AQS原理

并发编程-深入理解AQS之ReentrantLock 一 认识AQS 在讲解AQS原理以及相关同步器之前,我们需要对AQS有一些基本的认识,了解下它有什么样的机制,这样追踪源码的时候就不会太过于迷茫! 1.1 什么是AQS java.util.concurrent包中的大…

JavaWeb—js(2)

函数 /* 创建一个方法形参不需要写参数类型,多个参数直接用逗号隔开就可以 */function show(a,b,c){console.log(我是show方法,a,b,c)return ab;}// 调用方法//调用方法时 形参个数如果和实参个数对不上不会有异常show();show(你好)show(1,2);let add show(1,2,3…

君方智能设计平台-事务管理技术方案

1.背景介绍 事务处理是指对数据进行一组操作,这些操作要么全部成功,要么全部失败,以确保数据的一致性和完整性。软件的事务管理主要实现方案主要涉及以下几个方面: (1)数据一致性:在CAD软件中…

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后,重新安装成功 问题描述 在使用 nvm 安装新版本时,未成功,出现报错: Could not retrieve https://npm.taobao.org/mirrors/node/l…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

AI Earth ——开发者模式案例10:基于 CNN 的 AI 分类模型开发

基于 CNN 的 AI 分类模型开发 本案例主要介绍如何快速利用 AIE Python SDK 创建机器学习建模流程。我们主要使用到 Python SDK的Machine Learning Proxy 模块(下文简称 AieMlProxy )。该模块涵盖了一系列用户与训练集群之间的交互接口,包括:鉴权、数据加载、训练任务提交、…

Shell Expect自动化交互(示例)

Shell Expect自动化交互 日常linux运维时,经常需要远程登录到服务器,登录过程中需要交互的过程,可能需要输入yes/no等信息,所以就用到expect来实现交互。 关键语法 ❶[#!/usr/bin/expect] 这一行告诉操…

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序,其中必定有很多辅助内容,这只会增加篇幅,在这里我们更愿意列举一些典型的备份脚本功能,展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…