Project

[2024 KBO 타자 별 OPS 예측 모델 개발] 예측 해야 할 타자 리스트 작성 2

Kim J 2024. 4. 8. 14:12

야구는 시즌 진행 중 2군(퓨처스 리그) 선수가 1군에 등록되어 경기에 출전하거나 1군 선수가 2군으로 내려가 퓨처스 리그 경기에 출전하는 경우도 있다. (부상, 컨디션 등등 영향) 따라서 1군 선수로만 OPS예측을 해도 괜찮지만 2군 선수도 포함하여 예측하기 위해 크롤링 기준일에 따라 1,2 군에 등록된 모든 포수, 내야수, 외야수 즉 타자들의 이름 명단을 크롤링 해보자

 

퓨처스 리그 페이지는 구단별로 클릭해서 선수들을 조회해야해서 애먹었따........

역시 뭐든 쉽지가 않다...........

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import csv

# WebDriver 초기화
driver = webdriver.Chrome()

try:
    # 1군 선수 크롤링
    driver.get('https://www.koreabaseball.com/Player/RegisterAll.aspx')
    wait = WebDriverWait(driver, 10)
    
    # 선수 이름을 저장할 리스트
    player_names = []
    
    # 페이지가 완전히 로드될 때까지 기다림
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'td:nth-child(5) > ul')))
    
    # 포지션별로 선수 이름을 찾는 코드
    positions = ['td:nth-child(5) > ul > li', 'td:nth-child(6) > ul > li', 'td:nth-child(7) > ul > li']
    for position in positions:
        elements = driver.find_elements(By.CSS_SELECTOR, position)
        for element in elements:
            player_names.append(element.text)

    # 2군 선수 크롤링
    driver.get("https://www.koreabaseball.com/Futures/Player/Register.aspx")
    team_ids = ['HH', 'LG', 'WO', 'SK', 'OB', 'SM', 'NC', 'SS', 'LT', 'KT', 'HT']

    for team_id in team_ids:
        element = driver.find_element(By.XPATH, f"//li[@data-id='{team_id}']/a")
        element.click()
        time.sleep(7)  # 정보 로딩 및 페이지 변화를 위해 대기
        
        # 포지션 별로 선수 이름 추출
        positions = ['table:nth-child(4)', 'table:nth-child(5)', 'table:nth-child(6)']
        for position in positions:
            for i in range(1, 15):  # 최대 15명의 선수를 고려
                try:
                    player = driver.find_element(By.CSS_SELECTOR, f'{position} > tbody > tr:nth-child({i}) > td:nth-child(2)')
                    player_names.append(player.text)
                except:
                    break

finally:
    driver.quit()

# 모든 선수 이름을 CSV 파일로 저장
with open('all_players.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['PlayerName'])
    for name in player_names:
        writer.writerow([name])
 

이렇게 하면 1, 2군에 등록된 모든 타자들의 이름을 CSV파일로 생성할 수 있다.