ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 천상계 게임 정보 크롤링
    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  폴더 안에 저장합니다.

     

    다른 부분은 직관적으로 이해가 되실텐데, beginend는 왜 저렇게 설정했나 궁금하실 수 있습니다. 이는 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
Designed by Tistory.