MiniProject 1 - LOL AgingCurve

기준맨·2023년 2월 21일
0

MiniProject

목록 보기
1/2

Legue of Legends AgingCurve

개요

  • 롤 프로선수들의 에이징 커브 지표 분석
  • 15분 골드차이, 승률, KDA를 활용한 분석
  • inven, gol.gg, lol.fandom.com 등의 프로들 전적 사이트 활용

inven 크롤링

# 필요 모듈
import requests as req
import pandas as pd
from bs4 import BeautifulSoup as BS
from datetime import datetime
# inven 선수 코드 수집
url2 = 'https://lol.inven.co.kr/dataninfo/match/playerTotal.php'
res2 = req.get(url2)
soup2 = BS(res2.text, "html")
players = soup2.select('#playerMatchTable > tbody > tr > td:nth-child(3) > a')

for player in players:
    player_numbers = player.attrs['href'].split('=')[1]
    player_list.append(player_numbers)
# inven 선수 코드를 가지고 선수 정보 및 커리어 수집
lol_data = []

for player_number in player_list:
    url = f'https://lol.inven.co.kr/dataninfo/proteam/progamer.php?code={player_number}'
    res = req.get(url)
    soup = BS(res.text, "html.parser")
    # 선수 정보 - 닉네임, 나이
    name = soup.select_one('#scriptorium > div.block.scriptorium_box.scriptorium_player_info > div:nth-child(1) > div.block.info_arae.clearfix > div.text_area > div.block.top > h2')
    try:
        age = int(soup.select_one("#scriptorium > div.block.scriptorium_box.scriptorium_player_info > div:nth-child(1) > div.block.info_arae.clearfix > div.text_area > div.block.bottom.clearfix > p:nth-child(1)")\
                  .text.split()[1].split('-')[0])
    except:
        age = None
    # 대회 이름
    lcks = soup.select('td.left:not(:has(a)):not(:has(img))')
    # 대회 승률
    odds = soup.select('#scriptorium > div:nth-child(10) > table > tbody > tr > td:nth-child(5)')
    # 대회 KDA
    kdas = soup.select('#scriptorium > div:nth-child(10) > table > tbody > tr > td:nth-child(12)')
    for lck, number, kda in zip(lcks, odds, kdas):
        text = lck.contents[-1].strip()
        odds_number = float(number.text[:-1])
        # 대회 당시 나이
        age_at = int(lck.contents[-1].strip().split()[0]) - age if age else None
        lol_data.append([name.text.split(" ")[-1], int(datetime.today().year) - age if age else None, age_at, text, odds_number, float(kda.text)])
# dump
df = pd.DataFrame(lol_data, columns=["name", "age", "age at the time", "competiton", "win_rating", "kda"])
df.to_csv(f"inven_data.csv",index=False, encoding='utf-8-sig')

lol.fandom.com

inven 데이터의 경우 Faker 선수를 제외하고 다른 선수들의 생년월일 정보가 없어 lol.fandom 사이트를 이용해 선수들의 탄생년도를 가져왔다.
lol.fandom.com/wiki/선수닉네임 형식으로 선수들의 정보가 저장돼 있어 inven에 있는 선수들의 닉네임을 크롤링 후 주소에 대입하는 식으로 진행했다.

# inven에 있는 프로 선수들의 닉네임 저장
name_list = []
for player_number in player_list:
    url = f'https://lol.inven.co.kr/dataninfo/proteam/progamer.php?code={player_number}'
    res = req.get(url)
    soup = BS(res.text, "html.parser")
    # 선수 정보 - 닉네임, 나이
    name = soup.select_one('#scriptorium > div.block.scriptorium_box.scriptorium_player_info > div:nth-child(1) > div.block.info_arae.clearfix > div.text_area > div.block.top > h2')
    name_list.append(name.text.split(" ")[1])
age_list = []
for age_name in name_list:
    try:
        age_url = f'https://lol.fandom.com/wiki/{age_name}'
        age_res = req.get(age_url)
        age_soup = BS(age_res.text, "html.parser")
        player_age = age_soup.select_one("#infoboxPlayer > tbody > tr:nth-child(9) > td:nth-child(2)")
        age_list.append([age_name,player_age.text.split(" ")[2]])
    except:
        pass
# dump
df = pd.DataFrame(age_dict, columns=["name", "age"])
df.to_csv(f"age_list.csv",index=False, encoding='utf-8-sig')

-- 2023/02/21 --

0개의 댓글