admin管理员组文章数量:1619279
系列文章目录
对英雄联盟比赛预测(一)- 特征分析
对英雄联盟比赛预测(二)- 数据获取api分析
对英雄联盟比赛预测(三)- 数据获取Java实现
文章目录
- 系列文章目录
- 声明
- 前言
- 一、数据源分析
- 二、使用步骤
- 1. 申请拳头开发者
- 2. 分析api
- 2.1 数据入口
- 2.2 查找比赛
- 2.3.返回体
- 2.3.1 json最外层
- 2.3.2 分析两队情况
- 蓝色方
- 红色方
- 2.3.3 分析双方的比赛玩家
- 蓝色方
- 红色方
- 2.3.4 时间线分析
- 3. 玩家的关联分析
- 3.1 外部关联
- 内部关联
- 总结
声明
本文中所涉及到的所有数据及使用方法仅供学习使用,不得用于商业用途
前言
上篇文章对英雄联盟比赛预测(一)- 特征分析对比赛的数据类型进行了分析,接下来,我们就要开始获取各个比赛的具体数据。
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据源分析
目前已知可以获取比赛各个数据的来源有:掌盟逆向工程/拳头开发者api,对比之下,掌盟的数据源不稳定,且容易被封,所以,我们采用拳头的api。# 系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
二、使用步骤
1. 申请拳头开发者
下面这个是拳头的开发者平台
拳头开发者登录平台
点击下面红框内的按钮,接着按步骤进行注册即可,接下来会有api key,如果过期了,就点重新生成。
但是有可能没有下面这个验证码。因为这个验证码是拳头调用google的服务,所以如果网络不能访问google的话,可能就无法重新生成了。有效期为24小时。
因为拳头服务器所在为西八区(太平洋时区),所以时间会比北京时间早16个小时。
2. 分析api
拳头的api地址为:
https://developer.riotgames/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赛区的比赛数据。
版权声明:本文标题:对英雄联盟比赛预测(二)- 数据获取api分析 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728793647a1173960.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论