对英雄联盟比赛预测(二)- 数据获取api分析

系列文章目录

对英雄联盟比赛预测(一)- 特征分析
对英雄联盟比赛预测(二)- 数据获取api分析
对英雄联盟比赛预测(三)- 数据获取Java实现


声明

本文中所涉及到的所有数据及使用方法仅供学习使用,不得用于商业用途

前言

上篇文章对英雄联盟比赛预测(一)- 特征分析对比赛的数据类型进行了分析,接下来,我们就要开始获取各个比赛的具体数据。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据源分析

目前已知可以获取比赛各个数据的来源有:掌盟逆向工程/拳头开发者api,对比之下,掌盟的数据源不稳定,且容易被封,所以,我们采用拳头的api。# 系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

二、使用步骤

1. 申请拳头开发者

下面这个是拳头的开发者平台

拳头开发者登录平台
在这里插入图片描述
点击下面红框内的按钮,接着按步骤进行注册即可,接下来会有api key,如果过期了,就点重新生成。

但是有可能没有下面这个验证码。因为这个验证码是拳头调用google的服务,所以如果网络不能访问google的话,可能就无法重新生成了。有效期为24小时。

因为拳头服务器所在为西八区(太平洋时区),所以时间会比北京时间早16个小时。
在这里插入图片描述
在这里插入图片描述

2. 分析api

拳头的api地址为:

https://developer.riotgames.com/apis

2.1 数据入口

我们发现基本上所有的和比赛相关的api都需要选手的puuid和matchId,这些id我们目前是无从得知的。但是仔细分析了下api,发现有个api
在这里插入图片描述
可以获取玩家的基本信息,但是需要玩家的昵称。我们就随便猜一个昵称 abc
在这里插入图片描述
得到的结果是这样的:

{
    "id": "4HgrVFAc98Izb5K0jZb98c_phOQWhE7r0noAXA",
    "accountId": "PpOm0GdjH6g_-vtvfx_vZlxBHBJSpqO34Igs_QmhwDU",
    "puuid": "DLqpTe5-O1_peuVeN-OyIOn6u-cb2qWNZCu0ztR1h4yxhUrw-h0FeBhurvn4g",
    "name": "abc",
    "profileIconId": 27,
    "revisionDate": 1586453567000,
    "summonerLevel": 84
}

这里我们发现了重要数据:puuid,accountId
为保护个人隐私,上面的数据已经被我修改过了,不可直接使用

2.2 查找比赛

上一节,我们拿到了某些玩家的puuid,接着可以通过puuid,来获取玩家的游戏列表
在这里插入图片描述
输入玩家的puuid,下面的选BR1,其他可选项不填
在这里插入图片描述
这样我们就能得到一堆游戏id
在这里插入图片描述
接着通过api可以获取比赛的详细信息
在这里插入图片描述
在这里插入图片描述

2.3.返回体

我们分析下response body里有哪些我们需要的数据

2.3.1 json最外层

在这里插入图片描述
gameId作为比赛的唯一id,需要保存下来,
gameDuration为比赛时长,单位是秒,
gameVersion为比赛版本,作为一个属性可以保留下来,
gameMode是比赛方式,CLASSIC表示经典模式,
gameType为比赛类型,分为匹配,排位,自定义,训练等。

2.3.2 分析两队情况
蓝色方

在这里插入图片描述

  • win 是否赢得比赛
  • firstBlood 是否得到一血
  • firstTower 是否得到一塔
  • firstInhibitor 是否得到一高地水晶
  • firstBaron 是否第一条大龙
  • firstDragon 是否第一条小龙
  • firstRiftHerald 是否第一个峡谷先锋
  • towerKills 摧毁防御塔数
  • inhibitorKills 摧毁高地水晶数
  • baronKills 团队击杀大龙数量
  • dragonKills 团队击杀小龙数量
  • vilemawKills 团队击杀大蜘蛛数量(这个大蜘蛛是扭曲丛林里的,召唤师峡谷里没有)
  • riftHeraldKills 团队击杀峡谷先锋数量
    bans 是团队ban掉的英雄,这里就不作分析了
红色方

在这里插入图片描述
内容和蓝色方一致

ps:这场比赛发表下个人看法,应该是前期蓝色方碾压,该拿的资源全拿了,该打出来的优势都打出来了,但是比赛后期被一波翻盘了,因为可以看到红色方只推掉了蓝色方的一座高地水晶就赢得了比赛,可想而知,是推掉高地水晶后,直接摧毁了主水晶。

2.3.3 分析双方的比赛玩家
蓝色方

下面的示例都仅是团队中某个玩家的数据,团队数据需要把每个玩家的数据都加在一起在这里插入图片描述
participants的前一半item为蓝色方,后一半为红色方

ps: 如果是自定义,可能并非一半对一半,可以通过每个item的teamId来区分

最外层的这些数据没有太大的用处,把teamId、participantId加championId组合起来,作为联合id

championId表示玩家所使用的英雄id,具体表示哪些英雄,就不在这里详细说明了,拳头官网上有对应的列表

下面是玩家的具体比赛数据,因为太长,所以我把json copy下来了

"stats":{
                "participantId":1,
                "win":false,
                "item0":3078,
                "item1":3046,
                "item2":3153,
                "item3":3033,
                "item4":3031,
                "item5":3006,
                "item6":3363,
                "kills":22,
                "deaths":6,
                "assists":6,
                "largestKillingSpree":13,
                "largestMultiKill":3,
                "killingSprees":2,
                "longestTimeSpentLiving":947,
                "doubleKills":2,
                "tripleKills":2,
                "quadraKills":0,
                "pentaKills":0,
                "unrealKills":0,
                "totalDamageDealt":227503,
                "magicDamageDealt":1892,
                "physicalDamageDealt":220365,
                "trueDamageDealt":5246,
                "largestCriticalStrike":1134,
                "totalDamageDealtToChampions":50110,
                "magicDamageDealtToChampions":943,
                "physicalDamageDealtToChampions":47126,
                "trueDamageDealtToChampions":2040,
                "totalHeal":2664,
                "totalUnitsHealed":1,
                "damageSelfMitigated":24442,
                "damageDealtToObjectives":19245,
                "damageDealtToTurrets":7506,
                "visionScore":53,
                "timeCCingOthers":42,
                "totalDamageTaken":30754,
                "magicalDamageTaken":18034,
                "physicalDamageTaken":12348,
                "trueDamageTaken":371,
                "goldEarned":19033,
                "goldSpent":18158,
                "turretKills":2,
                "inhibitorKills":0,
                "totalMinionsKilled":185,
                "neutralMinionsKilled":56,
                "neutralMinionsKilledTeamJungle":24,
                "neutralMinionsKilledEnemyJungle":16,
                "totalTimeCrowdControlDealt":230,
                "champLevel":18,
                "visionWardsBoughtInGame":1,
                "sightWardsBoughtInGame":0,
                "wardsPlaced":12,
                "wardsKilled":7,
                "firstBloodKill":true,
                "firstBloodAssist":false,
                "firstTowerKill":true,
                "firstTowerAssist":false,
                "firstInhibitorKill":false,
                "firstInhibitorAssist":false,
                "combatPlayerScore":0,
                "objectivePlayerScore":0,
                "totalPlayerScore":0,
                "totalScoreRank":0,
                "playerScore0":0,
                "playerScore1":0,
                "playerScore2":0,
                "playerScore3":0,
                "playerScore4":0,
                "playerScore5":0,
                "playerScore6":1,
                "playerScore7":0,
                "playerScore8":0,
                "playerScore9":0,
                "perk0":8005,
                "perk0Var1":2609,
                "perk0Var2":2039,
                "perk0Var3":569,
                "perk1":9101,
                "perk1Var1":6065,
                "perk1Var2":6639,
                "perk1Var3":0,
                "perk2":9104,
                "perk2Var1":14,
                "perk2Var2":10,
                "perk2Var3":0,
                "perk3":8014,
                "perk3Var1":1220,
                "perk3Var2":0,
                "perk3Var3":0,
                "perk4":8473,
                "perk4Var1":1510,
                "perk4Var2":0,
                "perk4Var3":0,
                "perk5":8451,
                "perk5Var1":206,
                "perk5Var2":0,
                "perk5Var3":0,
                "perkPrimaryStyle":8000,
                "perkSubStyle":8400,
                "statPerk0":5005,
                "statPerk1":5008,
                "statPerk2":5002
            }

需要保存kills - 击杀数,deaths - 死亡数,assists - 助攻数,visionScore - 视野得分 goldEarned - 获得金币,goldSpent - 花费的金币 champLevel - 等级

接着看时间线

          "timeline":{
                "participantId":1,
                "creepsPerMinDeltas":{
                    "10-20":5.4,
                    "0-10":6.6,
                    "30-end":2.4,
                    "20-30":5.2
                },
                "xpPerMinDeltas":{
                    "10-20":649.2,
                    "0-10":504.4,
                    "30-end":484.2,
                    "20-30":582
                },
                "goldPerMinDeltas":{
                    "10-20":654.8,
                    "0-10":320.5,
                    "30-end":494,
                    "20-30":627.5
                },
                "csDiffPerMinDeltas":{
                    "10-20":1.3499999999999999,
                    "0-10":0.7999999999999998,
                    "30-end":0.5,
                    "20-30":0.10000000000000031
                },
                "xpDiffPerMinDeltas":{
                    "10-20":204.34999999999994,
                    "0-10":51.849999999999994,
                    "30-end":-120.09999999999997,
                    "20-30":88.79999999999998
                },
                "damageTakenPerMinDeltas":{
                    "10-20":1057.8000000000002,
                    "0-10":249.9,
                    "30-end":1056.2,
                    "20-30":890.7
                },
                "damageTakenDiffPerMinDeltas":{
                    "10-20":96.10000000000002,
                    "0-10":-2.549999999999983,
                    "30-end":652.4999999999998,
                    "20-30":436.19999999999993
                },
                "role":"NONE",
                "lane":"JUNGLE"
            }

这些数据主要是每十分钟的各项数据差,对我们来说,计算比较繁琐,后面会专门介绍从时间维度上的数据分析

红色方

红色方的数据留存和蓝色方一致,为了方便后面使用,我们将蓝色方的人员数据加个参数:team 0表示蓝色方,1表示红色方,所以在数据入库后的计算中,可以根据team这个字段来分组。

2.3.4 时间线分析

拳头公司提供了一个一场比赛各个时间段的数据api
在这里插入图片描述
同样只需要输入matchId即可查询,下面为例子:

{
    "frames":[
        {
            "participantFrames":{
                "1":{
                    "participantId":1,
                    "position":{
                        "x":560,
                        "y":581
                    },
                    "currentGold":500,
                    "totalGold":500,
                    "level":1,
                    "xp":0,
                    "minionsKilled":0,
                    "jungleMinionsKilled":0,
                    "dominionScore":0,
                    "teamScore":0
                },
                "2":Object{...},
                "3":Object{...},
                "4":Object{...},
                "5":Object{...},
                "6":Object{...},
                "7":Object{...},
                "8":Object{...},
                "9":Object{...},
                "10":Object{...}
            },
            "events":[

            ],
            "timestamp":0
        },
    ],
    "frameInterval":60000
}

格式大致如上所示,时间间隔为60000ms,即1分钟为一个时间区间,统计这一分钟内10名玩家的各项数据,以下数据为单个玩家在某分钟内的数据,同样我们需要计算团队数据,当然,这是后面的事情,现在需要把原始数据保存下来。
在这里插入图片描述
需要的数据为currentGold,totalGold,level,minionsKilled, jungleMinionsKilled ,因为经验和等级有一定的关联关系,所以保留了等级,xp就不保留了

3. 玩家的关联分析

3.1 外部关联

上面分析的都是某个玩家的对战数据,但是这个数据有限,我们需要从入口玩家那里得到一张可以扩散出去的网,使得我们的数据来源 源源不断。
经过分析发现,
在这里插入图片描述
通过这个api,把一个用户的puuid输入,同样可以得到一系列的matchId
在这里插入图片描述
但返回的Id格式显然不一样。

接着通过下面的这个api:
在这里插入图片描述

把上一张图中的id作为参数输入,可以发现
在这里插入图片描述
在response body里有许多其他玩家的puuid,这时,就打开了一张网,我们只需要把这个response body里的puuid,全部取出,输入到待查询的玩家列表队列中,当一个玩家的比赛数据全部获取结束后,可从玩家列表中取出下一个玩家,进行遍历,而这个玩家又会带来更多的玩家数据,从而完成无限的扩张。

内部关联

在我们获得的match details里有一个participantIdentities属性,有十个对象,从中我们发现有个player对象,这个里面正好有我们需要的accountId,而我们获取gameList,也是用的accountId,故而找到了数据关联点,可以把这个网再扩张。
在这里插入图片描述

在这里插入图片描述

总结

本文主要讲述如何从拳头的官网上获取玩家、比赛的数据、以及如何规划爬虫,使得爬虫不停延续下去。下篇文章将讲述,如何将本文所叙述的逻辑用代码实现。

ps:通过拳头官网的api,无法得到lpl赛区的数据,有时间的话,会在这一系列文章中插入如何获取lpl赛区的比赛数据。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值