데이터 수집은 Python을 활용해 스크래핑을 진행하고 저장은 MySQL을 활용해 저장했다.
1. 테이블 생성
데이터 테이블은 선수의 기본 정보를 담은 players와 선수의 능력치를 담은 stats테이블로 구성한다. 각 테이블에 대한 설명은 아래와 같다.
가. players
players테이블은 선수의 인적사항에 대한 테이블이다. 필드 정보는 표와 같다.
필드명 | 데이터타입 | 내용 |
PLAYER_CODE | VARCHAR | 선수코드(URL)에서 가져옴 |
PLAYER_NAME | VARCHAR | 선수이름 |
TEAM_FULL_NAME | VARCHAR | 팀 이름 |
POSITION | VARCHAR | 포지션 |
HEIGHT | FLOAT | 키 |
WEIGHT | FLOAT | 이름 |
COUNTRY | VARCHAR | 국적 |
BIRTHDAY | VARCHAR | 생년월일 |
EXPERIENCE | INT | 연차 |
나. stats
선수들의 스탯 정보를 저장하는 테이블이다. 사이트에는 나이, 팀, 승, 패, 경기뛴 시간, 3점 개수, 3점 득점 등 많은 필드가 있다. 이것을 모두 작성하기는 어려움으로 사진으로 대체했다.
2. 데이터 수집 및 저장
데이터수집은 Python을 활용해 진행했다. 동적인 움직임을 통해 수집을 진해해야 하므로 selenium을 활용했다.
#---------- selenium
def open_driver(url):
service = Service(ChromeDriverManager().install())
chrome_option = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=chrome_option)
driver.implicitly_wait(20)
driver.get(url)
driver.maximize_window()
time.sleep(1)
return driver
# ---------- players
def get_player_info(link):
res = requests.get(link)
soup = bs(res.content, 'html.parser')
player_code = link.split("/")[-2]
info_box1 = soup.select_one("div.PlayerSummary_mainInnerBio__JQkoj")
if info_box1 == None:
team_full_name = "null"
position = "null"
player_name = "null"
#< ---- 중략 ---- >
return player_dict
#---------- stats
def nba_stats(url):
df_list = []
profile_list = []
driver = open_driver(url)
season_box = driver.find_elements(by=By.CLASS_NAME, value="DropDown_content__Bsm3h")[0]
season_box.click()
seasons = season_box.find_elements(by=By.TAG_NAME, value="option")
# create_table("players") #테이블생성
for season in tqdm(seasons[4:]):
season.click()
time.sleep(1)
#< ---- 중략 ---- >
#저장
table_to_database(df, alchemy_url, "stats")
print(f"\n{season_text} stats 저장완료")
# 저장
for i, pl in enumerate(players_link_list[:]):
#선수개인정보
player_dict = get_player_info(pl)
row_to_table("players", player_dict)
print("\t", i+1, player_dict)
dbconn.close()
최종 저장된 결과물은 players 800명, stats는 2153개 였다.
'Data Analysis > NBA' 카테고리의 다른 글
[Tableau] 대시보드 제작 및 분석 (0) | 2023.09.11 |
---|---|
사이트분석 (0) | 2023.09.11 |