通过Leaguepedia API实现抓取英雄联盟赛事数据

概述

帮助文档可以看到,Leaguepedia的赛事数据可以通过mwclient这个包抓取相关赛事数据,包括首龙、首塔、赛区、比赛名称、BP、英雄、经济、胜负等等数据。

##安装mwclient
pip install mwcleric

代码示例:

import mwclient
import time
import datetime as dt
import pandas as pd
from datetime import date, timedelta
#SG是游戏数据,SP是选手数据,通过UniqueGame这一项进行合并,
#以下代码的抓取的数据包括赛事名称、赛事时间、队伍1与队伍2的名称、胜者、版本、
#选手ID、队伍名称、选用英雄、召唤师技能、符文、选手位置、赛事编号、红蓝方
#筛选条件为在2020-01-25进行的比赛
date="2020-01-25"
date=dt.datetime.strptime(date, "%Y-%m-%d").date()

site = mwclient.Site('lol.fandom.com', path='/')
response = site.api('cargoquery',
	limit = "max",
	tables = "ScoreboardGames=SG, ScoreboardPlayers=SP",
	join_on = "SG.UniqueGame=SP.UniqueGame",
	fields = "SG.Tournament, SG.DateTime_UTC, SG.Team1, SG.Team2, SG.Winner, SG.Patch, SP.Link, SP.Team, SP.Champion, SP.SummonerSpells, SP.KeystoneMastery, SP.KeystoneRune, SP.Role, SP.UniqueGame, SP.Side",
	where = "SG.DateTime_UTC >= '" + str(date) + " 00:00:00' AND SG.DateTime_UTC <= '" + str(date+dt.timedelta(1)) + " 00:00:00'")
	#返回的是一个嵌套的OrderedDict,需要先通过json.dumps转换成普通的Dict
	response = json.loads(json.dumps(response))
	#print(response)

输出response:

{'limits': {'cargoquery': 500}, 'cargoquery': [{'title': {'Tournament': 'CBLOL 2020 Split 1', 'DateTime UTC': '2020-01-25 15:48:00', 'Team1': 'paiN Gaming', 'Team2': 'Flamengo Esports', 'Winner': '2', 'Patch': '10.1', 'Link': 'Yang (Felipe Zhao)', 'Team': 'paiN Gaming', 'Champion': 'Gangplank', 'SummonerSpells': 'Flash,Teleport', 'KeystoneMastery': '', 'KeystoneRune': 'Grasp of the Undying', 'Role': 'Top', 'UniqueGame': 'CBLOL/2020 Season/Split 1/Scoreboards_1_1', 'Side': '1', 'DateTime UTC__precision': '0'}}, ...{'title': {'Tournament': 'NA Academy 2020 Spring', 'DateTime UTC': '2020-01-25 01:20:00', 'Team1': 'FlyQuest Academy', 'Team2': 'CLG Academy', 'Winner': '1', 'Patch': '10.1', 'Link': 'Fill', 'Team': 'CLG Academy', 'Champion': 'Nautilus', 'SummonerSpells': 'Ignite,Flash', 'KeystoneMastery': '', 'KeystoneRune': 'Aftershock', 'Role': 'Support', 'UniqueGame': 'NA Academy League/2020 Season/Spring Season/Scoreboards_4_1', 'Side': '2', 'DateTime UTC__precision': '0'}}]}

实际上对这种嵌套的词典可以直接使用pandas中的json_normalize进行转换

df = pd.json_normalize(response,record_path=['cargoquery'],sep = "-")
df.to_csv('Result.csv') 

最后保存的csv如图所示(这里我用R的dplyr包在R中把dataframe转换成了tibble,更方便处理):
通过Leaguepedia API实现抓取英雄联盟赛事数据

p.s. 要注意的是mwclient抓取时有一定的规则,可以到网页的query上尝试一下,比如选手的数据要在Scoreboard.Players这个table里面查询,筛选选手名称的时候可以用SP.Link = "选手名称"进行筛选,其他的比如赛事地点等等都归属不同table中的不同field。而且mwclient中很多field已经废用或者有bug,需要对照leaguepedia的文档来筛选,比较麻烦。如果只是分析以往的数据,可以直接到Oracle’s Elixir 这个网站直接下载S6 - S11的数据(但这个网站整理的版本不保证完整,偶尔会有缺失值)

上一篇:嵌入式工程师成长之路(十八)之ILI9341 液晶控制器


下一篇:SpringBoot实现上传下载(二)