-
천상계 게임 정보 크롤링Data Analysis/League of Legends 2020. 5. 27. 00:32
반갑습니다!
지금까지 모든 내용을 따라오셨다면 이제 천상계(마스터 이상) 게임 정보를 크롤링할 수 있습니다.
천상계의 랭크는 매일 오후 11시 45분에 갱신되는데요, 마스터/그랜드마스터와 그랜드마스터/챌린져의 승급과 강등이 이루어집니다.
그렇다면 매일 자정에 마스터 이상 유저 정보를 수집해서 그 전날 하루동안 있었던 게임을 모두 가져오는 작업을 매일 반복하도록 해볼까요?
이를 쉽게 하기 위해서 Python의 schedule 모듈을 사용합시다. 설치되어있지 않다면 pip를 통해 설치합니다.
해당 모듈을 사용하면 아주 쉽게 반복 작업을 설정할 수 있습니다. LolMaster 폴더의 상위 폴더에 crawling.py를 만들어 볼까요?
from LolMaster import league, summoner, match import pandas as pd import schedule import datetime import time import os summoner_dir = './summoner' match_dir = './match' def job(): try: yesterday = datetime.datetime.now() - datetime.timedelta(1) base = os.path.join(summoner_dir, yesterday.strftime("%Y%m%d")) if not os.path.exists(base): os.mkdir(base) challenger = league.get_summoner_challenger() challenger_users = summoner.get_summoner_by_summoner_id(challenger['summonerId']) challenger_users.to_csv(os.path.join(base, 'challenger.csv')) grandmaster = league.get_summoner_grandmaster() grandmaster_users = summoner.get_summoner_by_summoner_id(grandmaster['summonerId']) grandmaster_users.to_csv(os.path.join(base, 'grandmaster.csv')) master = league.get_summoner_master() master_users = summoner.get_summoner_by_summoner_id(master['summonerId']) master_users.to_csv(os.path.join(base, 'master.csv')) base = os.path.join(match_dir, yesterday.strftime("%Y%m%d")) if not os.path.exists(base): os.mkdir(base) high_elo_users = pd.concat([master_users, grandmaster_users, challenger_users]) begin = int(1000 * yesterday.replace(hour=0, minute=0, second=0, microsecond=0).timestamp()) end = int(1000 * yesterday.replace(hour=23, minute=59, second=59, microsecond=9999).timestamp()) match_ids = match.get_list_by_account(high_elo_users['accountId'], begin_time=begin, end_time=end) matches = match.get_match_by_match_id(match_ids['gameId']) matches.to_csv(os.path.join(base, 'over_master.csv')) finally: return schedule.every().day.at('12:00').do(job)
해당 코드는 매일 12시에 job을 실행합니다. 그 함수 안에서는 1) 마스터 이상 유저들의 정보를 summoner_dir 폴더 안에 해당 날짜 폴더를 만들어 저장하고, 2) 마스터 이상 유저가 포함된, 하루 이전의 모든 게임 정보를 긁어서 match_dir 폴더 안에 저장합니다.
다른 부분은 직관적으로 이해가 되실텐데, begin과 end는 왜 저렇게 설정했나 궁금하실 수 있습니다. 이는 get_list_by_account API가 해당 값을 microsecond단위의 Unix Timestamp으로 전달하기를 원하기 때문입니다.
제가 try-catch-finally 문법을 굉장히 싫어하는데, 해당 함수에서는 사용한 이유가 있습니다. 바로 Development API key가 하루 후에 expire되기 때문에 API key가 invalid해서 에러가 날 수 있기 때문입니다. 이런 경우 프로그램이 crash나는 것보다 그냥 제가 직접 확인해서 한 번 더 실행하는게 낫겠죠.
이제부터 매일 게임 정보를 모아서, 디테일한 분석을 진행해봅시다.
감사합니다 !
'Data Analysis > League of Legends' 카테고리의 다른 글
Riot API - Match (0) 2020.05.27 Riot API - Summoner (0) 2020.05.26 Riot API - League (0) 2020.05.20 Riot API - Configuration, Request & Exception Handler, Error Module (0) 2020.05.20 Riot API - Environment Setting (0) 2020.05.20