728x90
지난 포스팅에서 MatchId를 수집하였다.
이런 식으로 굉장히 많은 게임정보를 불러와버렸다.
이 매치아이디를 통해서 인게임정보를 알 수 있다!
이렇게 받아온 매치아이디를 match-v5에 넣게되면 인게임 정보가 호출 된다.
이전에도 어떤 데이터를 사용할 지에 대해서 작성한 적이 있지만 정보를 호출하면 아래와 같이 길게 나온다.
해당 게임의 클라이언트 버전, 게임 맵, 10명의 챔피언과 룬,특성, 아이템 등등 정말 많은 데이터가 담겨져 있다.
여기서 필요한 것만 뽑아올 것이다.
'assists', 'championId', 'deaths', 'firstBloodAssist', 'firstBloodKill', 'firstTowerAssist',
'firstTowerKill', 'individualPosition', 'item0', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6',
'kills', 'longestTimeSpentLiving', 'participantId', 'perks', 'summoner2Id', 'summonerName', 'teamId',
'totalDamageDealtToChampions', 'totalDamageTaken', 'totalHeal', 'totalMinionsKilled',
'totalTimeSpentDead', 'visionScore'
내가 생각했을 때 인게임에서 중요하다고 생각하는 정보들만 오아놨다. perks는 룬,특성이니 필수!
데이터가 정말 복잡한 딕셔너리형태로 구성되어있고 값을 불러오다가 속도제한이나 기타의 이유로 정상적인 호출이 불가하게 될 수도 있다.
예를 들면 정상호출이 200인데 403이 뜨는 경우는 에러값이 들어가면 낭패니까
200일때만 들어가게 만들어주고 다른 필요한 데이터들을 내가 쓰기 편하게 정돈해주는 작업을 진행하였다.
또한, queueID는 420만 들어가게 설정하여 랭크게임만 수집하였다.
import pandas as pd
import pprint
import requests
import time
import csv
pp = pprint.PrettyPrinter(indent=4)
api_key = 'API사용'
request_header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": api_key
}
detail_key = ['assists', 'championId', 'deaths', 'firstBloodAssist', 'firstBloodKill', 'firstTowerAssist',
'firstTowerKill', 'individualPosition', 'item0', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6',
'kills', 'longestTimeSpentLiving', 'participantId', 'perks', 'summoner2Id', 'summonerName', 'teamId',
'totalDamageDealtToChampions', 'totalDamageTaken', 'totalHeal', 'totalMinionsKilled',
'totalTimeSpentDead', 'visionScore']
def get_data_from_dict(dict_key):
rst = {}
for value in dict_key:
for key in detail_key:
if value == key:
if key == 'perks':
dict_key[key]['statPerks'] = [dict_key[key]['statPerks']['defense'],
dict_key[key]['statPerks']['flex'],
dict_key[key]['statPerks']['offense']]
primary = dict_key[key]['styles'][0]
sub = dict_key[key]['styles'][1]
dict_key[key]['styles_primary'] = [primary['selections'][0]['perk'],
primary['selections'][1]['perk'],
primary['selections'][2]['perk'],
primary['selections'][3]['perk']]
dict_key[key]['styles_sub'] = [sub['selections'][0]['perk'], sub['selections'][1]['perk']]
del dict_key['perks']['styles']
rst[value] = dict_key[key]
return rst
def get_objective_data(ob_data):
result = {}
for k in ob_data:
if ob_data[k]['first'] == True:
ob_data[k]['first'] = 1
else:
ob_data[k]['first'] = 0
result[k] = [ob_data[k]['first'], ob_data[k]['kills']]
return result
def main(match_id, header_option):
url = f"https://asia.api.riotgames.com/lol/match/v5/matches/{match_id}"
api_status = requests.get(url, headers=request_header).status_code
if api_status == 200:
meta_data = requests.get(url, headers=request_header).json()
if meta_data['info']['queueId'] != 420:
return False
else:
final_result = {}
final_result['match_id'] = match_id
final_result['Duration'] = meta_data['info']['gameDuration']
final_result['Version'] = meta_data['info']['gameVersion']
participants = meta_data['info']['participants']
for player in range(len(participants)):
player_data = get_data_from_dict(participants[player])
final_result[f'player_{player}'] = player_data
ban_list_blue_team, ban_list_red_team = [], []
for blue in meta_data['info']['teams'][0]['bans']:
ban_list_blue_team.append(blue['championId'])
for red in meta_data['info']['teams'][1]['bans']:
ban_list_red_team.append(red['championId'])
final_result['blue_ban_list'] = ban_list_blue_team
final_result['red_ban_list'] = ban_list_red_team
final_result['blue_object_list'] = get_objective_data(meta_data['info']['teams'][0]['objectives'])
final_result['red_object_list'] = get_objective_data(meta_data['info']['teams'][1]['objectives'])
if meta_data['info']['teams'][0]['win'] == False:
win_team = meta_data['info']['teams'][1]['teamId']
else:
win_team = meta_data['info']['teams'][0]['teamId']
final_result['win_team'] = win_team
df = pd.json_normalize(final_result)
df.to_csv(f'MatchId_to_ingame.csv', mode='a', index=False, encoding='CP949', header=header_option)
return final_result
else:
return api_status
def main_run(k):
df = pd.read_csv('D:/MatchId_to_ingame.csv')
read_data = df['MatchId']
for i in range(k, len(read_data)):
cell = i + 2
try:
if i == 0:
header_option = True
else:
header_option = False
rst = main(read_data[i], header_option)
if rst == 403:
print("키만료")
break
time.sleep(0.9)
except:
f = open('error_list.csv', 'a', newline='')
time.sleep(0.9)
wr = csv.writer(f)
wr.writerow([read_data[i]])
f.close()
print(f"{cell}번셀 완료, ", f'k={i} 완료, ', read_data[i])
i += 1
cell += 1
main_run(0)
내가 돌린 매치아이디만 83만개정도 되니 api키가 만료되었을 경우를 생각해서 쉽게 key만 바꿀수 있도록 작업하였다!
일주일가량을 컴퓨터를 끄지않고 돌린 결과
이렇게 깔끔하게 데이터를 수집할 수 있었다.
728x90
'프로젝트 > Riot LoL' 카테고리의 다른 글
Position 순서를 맞춰보자 (0) | 2021.09.06 |
---|---|
인게임 데이터에서 챔피언 조합과 포지션 정보 취합하기 (0) | 2021.08.23 |
소환사이름으로 MatchId 저장하기 (0) | 2021.08.04 |
어떤 티어의 유저들을 가져올까? (0) | 2021.07.30 |
[Riot API]Match-V5에서 어떤 데이터를 쓸까? (0) | 2021.07.21 |