#1에 이어서...
5. matchid 가져오기
puuid를 이용해 matchid를 가져온다. 인수 n은 경기 개수를 나타낸다. 한 개의 puuid마다 20개의 matchid를 받아오고 싶으면 n=20으로 하면 된다. 요청에 대해 에러를 보낼 때도 있는데, 그냥 예외처리시켰다. 에러들 종류는 Riot Developer Portal에서 확인 가능하다. puuid 변수에 있는 소환사가 플레이했던 경기들의 경기ID(matchid)를 가져오는데, 플레이들이 서로 같은 경기에 참여했던 적이 있을 경우, 중복된 경기id가 있을 수 있기 때문에 list(set())으로 중복을 제거했다.
코드를 실행하면 시간이 좀 걸린다.
def get_matchid(puuid, key, n, region='asia'):
matchid = []
l = 100
for i in puuid:
l+=1
if l%100 == 0:
sleep(120)
try:
request = requests.get(f'https://{region}.api.riotgames.com/tft/match/v1/matches/by-puuid/{i}/ids?count={n}&api_key={key}')
request = json.loads(request.content)
matchid.extend(request)
except:
pass
return list(set(matchid))
ch_matchid = get_matchid(puuid,key,200)
ch_matchid
나중에 다시 전부 가져오려면 힘드니 작업 디렉토리에 저장한다.
import pickle
with open("ch_matchid_220326","wb") as f:
pickle.dump(ch_matchid, f)
다시 불러오려면 아래와 같이 하면 된다.
with open("ch_matchid_220326","rb") as f:
list_variable = pickle.load(f)
6. match info 가져오기
매치 정보를 가져온다. JSON을 DataFrame 형태로 변환했다. 요청하는 데이터가 많다면 정말 오래 걸린다. 다른 작업을 하고 오자. 약 3만 match에 대한 정보를 가져오는데 7시간 이상 걸렸던 것으로 기억한다. 한 번에 하기 부담되면 matchid를 나누어 여러 번에 걸쳐 데이터를 받아오자. 또한, 아래 코드를 실행하기 전에 Riot Developer Portal에 가서 API Key를 다시 생성하는 게 좋을 것 같다. API Key가 만료 전까지 충분한 시간이 있는지 확인하고 코드를 실행하자.
- API Key 재생성: Riot Developer Portal -> 로그인 -> 오른쪽 위 내 계정/아이디 클릭 -> 'DASHBOARD' 클릭 -> 맨 아래 빨간색 "REGENERATE API KEY" 클릭 -> 위에 'COPY'를 클릭 -> 처음 API Key 저장했던 메모장의 기존 key에 덮어쓰기 or 파이썬 스크립트에 직접 key를 변수로 넣기.
from time import sleep
game_record = pd.DataFrame()
def match_info(matchid, key, region='asia'):
l=100
global game_record
for i in matchid:
l+=1
if l%100 == 0:
sleep(120)
try:
request = requests.get(f'https://{region}.api.riotgames.com/tft/match/v1/matches/{i}?api_key={key}')
request = json.loads(request.content)
request = json_normalize(request)
game_record = pd.concat([game_record,request])
except:
pass
return game_record
temp_ch = match_info(ch_matchid,key)
temp_ch
JSON 형태로 들어온다. 내가 원하는 정보는 info-'participants'에 있다(어떤 정보가 들어있는지는 Riot Developer Portal에서 확인 가능하다). 나중에 정확한 분석을 하기 위해서는 'game_version'과 'tft_game_type'도 중요할 것 같다. 버전이나 게임 타입으로 분류해서 분석해야 할지도 모르겠다.
데이터를 받고 확인하면 위와 같은 에러 코드가 같이 들어올 때가 있다. status_code 429는 rate limit을 넘겼을 때 나온다. 아마 내가 코드를 실행시키기 전에 시험 삼아 여러번 돌려본 후, 여유 시간을 갖지 않고 바로 또 돌렸더니 초반 부분에 rate limit을 받은 것 같다. 2분 이내에 API를 사용했었다면 좀 기다렸다가 여유 있게 실행시켜야 한다.
Missing Value가 얼마나 있는지 확인해 본다.
총 31028 row를 가져왔는데 이중 64개 row에 Error Code가 있다. 31028-30964 = 64이니 대부분 열에 있는 64개의 missing value는 Error Code 때문인 거 같은데, game_type에 80개의 missing value는 무엇 때문인지 모르겠다.
temp_ch.isnull().sum()
반환받은 에러 코드 종류가 궁금해서 알아봤다. 429는 Rate Limit이며 503은 Service unavailable이다.
temp_ch['status.status_code'].unique()
64개 정도 밖에 없으니 무시하고 Error code가 없는 행만 가져온다.
ch_match = temp_ch[temp_ch['status.status_code'].isnull()]
한번 받아오는데 오래 걸리는 데이터이다. 혹시 모르니 재빨리 csv 형태로 저장한다.
ch_match.to_csv("ch_match_record_220326.csv")
잠깐 데이터 좀 살펴보자.
총 8개의 열(0~7 columns)로 구성되며 각각의 열에 한 경기에 참가한 8명 각각의 플레이어의 정보가 들어있다.
json_normalize(temp_ch['info.participants'])
어떤 정보가 있는지 한번 보자.
x = json_normalize(json_normalize(temp_ch['info.participants']).iloc[2])
x
x.columns
'augments'는 증가체, 'traits'는 시너지이며 info-tft_game_type이 'pairs(더블업)'일 경우 들어있는 데이터가 조금 다를 수 있다.
#3에서 데이터에 대해 더 자세히 알아보겠다...
올해 안에 꼭...
'데이터 분석 - Python' 카테고리의 다른 글
[데이터 분석]네이버 웹툰 콘텐츠 기반 필터링 with python (0) | 2022.12.16 |
---|---|
TFT 롤토체스 데이터 분석 #3 (0) | 2022.12.12 |
[데이터 분석] 네이버 웹툰 데이터 크롤링 with python (0) | 2022.10.17 |
TFT / 롤체 / 롤토체스 데이터 분석 #1 (0) | 2022.03.30 |