본문 바로가기
Data Analysis/NBA

데이터 수집 및 저장

by mansoorrr 2023. 9. 11.

데이터 수집은 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