# 필요 모듈
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')
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 --