WPS+Python爬取百度之星排名-腾讯云开发者社区-百姓标王
前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >WPS+Python爬取百度之星排名

WPS+Python爬取百度之星排名

原创
作者头像
WuShF
发布2024-07-10 10:44:53
发布2024-07-10 10:44:53
840
举报
文章被收录于专栏:https://www.matiji.net/exam/contest/contestdetail/146

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

爬取效果预览

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

原理支撑

前提:

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

过程:

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

抠榜单接口

打开开发人员工具,默认快捷键是F12

不同的浏览器,页面可以不一样,需要切换到“网络”标签下。

获取接口URL

切换分页:切换到第2页和第3页。每次切换,浏览器都发送了一个名为queryMatchRankListById.do的请求。

可见相应内容含广州市铁一中学字段。根据返回的内容,可以暂定为所求的榜单接口。

判断请求方式

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

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

判断请求负载

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

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

负载方式是“表单数据”

验证接口

打开apifox,填入提取到的信息。

注意截图中被框选的地方。

发送请求,可见得到了正确的响应。

部分接口还需要携带额外参数,来验证请求。需要不断调试。

py拉取个人排名

WPS的py环境

新建“智能表格”,而不是“Office表格”。

在“效率”中,找到“PY脚本编辑器”。

引入配置

代码语言:javascript
复制
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格式的字符串。

需要格式化。

代码语言:javascript
复制
def getTime(time):
    return str(int(time / 3600)) + ':' + str(
        int(time / 60 % 60)) + ':' + str(int(time % 60))

轮询榜单

在循环开头定义结束条件。

结束条件通过调试接口获取:

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

对于当前轮次的响应,需要调用.json(),以对象的方式获取响应数据。

cur用于维护下一行,将当前批次的数据插入到合理的位置。

代码语言:javascript
复制
cur = 0
while True:
    response = requests.post(url, data=formData).json()
    if response['error_no'] != '0':
        exit(0)

输出结果同Apifox

取出单行数据

当前查询返回的是10个人的信息。

以数组的方式存储在.data.datas中,需要逐项取出格式化。

代码语言:javascript
复制
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也是一个列表。

写入表格要求“维度相同”,需要拆成单个键值对。

代码语言:javascript
复制
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字段,也需要初始化,否则会插入失败。

将处理完的用户插入到列表中。

如果是第一行,需要特判,多插一行表头。

代码语言:javascript
复制
if cur == 0 and len(xslxList) == 0:
    xslxList.append(list(tempData.keys()))
xslxList.append(list(tempData.values()))

写入表格

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

代码语言:javascript
复制
write_xl(xslxList, "A" + str(1 + cur),sheet_name="个人排名")
cur += len(xslxList)
formData['start'] = cur - 1

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

完整py代码

亲测官方没有限制limit参数,或者限制不大。

一次性请求多条也不会被拉黑。

使用之前需要开启网络API

代码语言:javascript
复制
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拉取高校排名

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

代码语言:javascript
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行效果
    • 手动拉取
      • 爬取效果预览
      • 原理支撑
      • 抠榜单接口
        • 获取接口URL
          • 判断请求方式
            • 判断请求负载
              • 验证接口
              • py拉取个人排名
                • WPS的py环境
                  • 引入配置
                    • 定义时间格式化函数
                      • 轮询榜单
                        • 取出单行数据
                          • 处理题目数据
                            • 写入表格
                              • 完整py代码
                              • py拉取高校排名
                              • 当前排名
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档

                              相关内容推荐

                              seo营销网站济南seo营销seo零基础培训哪里学习seo广州seo算法济南综合seoseo优化的教程迪庆SEO新站seo营口seo沈阳seo服务精准的seo是从何而来江苏seo咨询修改seo外链seo猫猫seo北京seo实战培训怎么学网站seo技巧中山百度seo报价seo运营培训哪家seo培训机构好俄罗斯seo如何做好网站seo做seoseo北京公司seo小鑫seo sem嵊州seo广州谷歌seoseo公司排名杭州seo谷歌优化公司seo 什么意思成都seo网站建设叶剑辉seo博客搜索seo优化怎么做淮安seo优化seo的文章技术seoseo搜索引擎优化怎么样洛阳seo培训广州seo服务外包seo站长平台seo霸屏公司seo资讯网seo怎么读seo自学教程北京SEO推广公司seo优化检测深圳seo论坛中山seo关键词排名seo优化搜索引擎青岛招聘seoseo打字产seo三木seo晶晶seo企业seo优化铁岭seo西安seo排名优化推广全包中山seo排名推广企业网站seo优化课程seo百家河北seo公司seo操作视频小明seo博客seo界惠州seo公司沈阳seo优化seo网赚宝典搜索引擎seo推广优化排名软件推荐乐云seo新乡seo优化公司长沙弧度seo怎样做seoseo代码优化广东SEO培训汕头seo服务公司内蒙seoseo头像什么是 seoseo属于哪个专业洛阳seo服务葛兴seoseo外包公司排名seo如何选择关键词网站seo排名优化网购和seoaso seo杭州seo名录朋少seo北京seo优化关键词seo分析优化seo每日海南seo顾问服务宋雷seoseo伪原创文章工具新塘SEOseo优化培训机构瑟奇SEO网站SEO优化专员招聘中山seo网络营销推广辰宇SEO工具箱seo百度快排顶一下seo昆明企业seo闻道华东seoseo大海seo网络教程seo技术学习seo与竞价推广的优劣seo希望落月seo苏州关键词seo优化seo武汉seo优化解决方案河南seo优化公司关于seo谷歌seo需要做什么微店seo西安优化seo永川seo快排福建seo顾问seo有什么作用谷歌seo博客福建seo培训机构那些SEO推广好seo具体工作内容战神seoseo优化排名seo搜索引擎培训seo优化技术有哪些seo优化排名公司郑州百度seo深圳英文seo长沙seo霜天西青SEO沈阳seo博客优化网站教程seoseo外链代发快速seo优化口碑seo点赞seo基础教程seo劫持seo摘要上海seo服务公司seo工作汇报朕哥seo广州专业seo点点seo北京seo排名优化seo的概念是什么seo技能seo权重查询诊断seo南宁seo推广潮州SEO优化seo管理平台seo马龙博客网站如何做seo优化seo图书糖豆seo博客学习seo培训seo翻译成都seo站内优化武汉学seo深圳seo优化培训三河seo论坛怎么seoseo待遇seo网站优菏泽seo南京百度seoseo优化岗位重庆网站优化seo公司词库seo西安优质seo方案固安seo垫江SEO北京seo工作熊掌号和seoseo诊断模板百度对seoseo培训班哪家好汉沽seo快排SEO解惑seo诊断网站乐清seo独立站seoseo交流中心青岛seo顾问外贸seo工具东莞网站推广seo优化seo优化网络推广seo网站优化平台汕头seo中山seo推广seo优化技巧教程seo优化关键词公司seo站内关键词优化西安seo优化大神

                              合作伙伴

                              百姓标王

                              龙岗网络公司
                              深圳网站优化
                              龙岗网站建设
                              坪山网站建设
                              百度标王推广
                              天下网标王
                              SEO优化按天计费
                              SEO按天计费系统