야구 분석/Python

삼성 라이온즈 성적 크롤링하기

sam_j_s 2024. 6. 9. 15:34
728x90
반응형

주제

저번에 삼성 라이온즈의 관중 수를 크롤링해 보면서 관중수가 얼마나 많은지 알아보았습니다. 이번에는 삼성 라이온즈의 2022년부터 2024년 5월까지의 성적을 크롤링해 보겠습니다. 다음번에는 두 개를 합쳐서 연패중일 때는 관중 수가 어떻게 변하는 지를 확인 해 볼 것입니다.

 

성적 크롤링 하기

삼성 라이온즈의 성적은 KBO 공식 사이트에서 확인할  수 있습니다.

 

공식 홈페이지를 들어가면 현재 날자의 팀 순위가 나옵니다. 2022 시즌 부터의 성적을 원하기 때문에 2022 시즌 시작일인 2022년 4월 2일로 이동을 해야 합니다.

현재 날자 옆에 있는 달력을 눌러서 2022년 4월 2일로 이동을 하고 다음 날자 버튼을 눌러 다음 날로 이동을 해 삼성의 성적을 크롤링해 오면 됩니다.

 

사이트 구조 확인하기

팀 순위에 해당하는 페이지가 어떻게 구성되어 있나 확인해 보겠습니다.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mlp
import seaborn as sns
import requests
from bs4 import BeautifulSoup

%matplotlib inline
# 한글 폰트 설정
plt.rcParams['font.family'] = 'NanumGothic'

req = requests.get('https://www.koreabaseball.com/Record/TeamRank/TeamRankDaily.aspx')
soup = BeautifulSoup(req.text, 'html.parser')
soup

 

원하는 날자로 이동하기

팀 순위 사이트에서 달력 그림을 눌러 2022년 4월 2일로 가도록 해보겠습니다.

# KBO 팀 순위 페이지 URL
base_url = 'https://www.koreabaseball.com/Record/TeamRank/TeamRankDaily.aspx'

# 결과를 저장할 리스트
data = []

# 웹 드라이버 설정
driver = setWebdriver()

# 페이지 열기
driver.get(base_url)
time.sleep(2)  # 페이지 로딩을 위한 대기 시간

# 날짜 선택기 클릭 (달력 아이콘 클릭)
datepicker_trigger = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CLASS_NAME, 'ui-datepicker-trigger'))
)
datepicker_trigger.click()
time.sleep(1)

# 년도 선택
year_select = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, 'ui-datepicker-year'))
)
year_options = year_select.find_elements(By.TAG_NAME, 'option')
for option in year_options:
    if option.text == '2022':
        option.click()
        break
time.sleep(1)

# 월 선택
month_select = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, 'ui-datepicker-month'))
)
month_options = month_select.find_elements(By.TAG_NAME, 'option')
for option in month_options:
    if option.get_attribute('value') == '3':  # 4월 (0부터 시작하므로 3)
        option.click()
        break
time.sleep(1)

# 일 선택
day_select = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.LINK_TEXT, '2'))
)
day_select.click()
time.sleep(2)

 

2022년 4월 2일로는 데재로 가는 것을 알 수 있고 이제 다음날로 넘겨가면서 삼성 라이온즈의 성적을 크롤링하겠습니다.

 

삼성 성적 크롤링

# 데이터를 수집하는 루프 (최대 100회)
count = 0
while count < 100:
    # 테이블 로딩을 기다림
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'table.tData'))
    )

    # 테이블 파싱
    table = driver.find_element(By.CSS_SELECTOR, 'table.tData')
    rows = table.find_elements(By.TAG_NAME, 'tr')
    for row in rows:
        cols = row.find_elements(By.TAG_NAME, 'td')
        if cols and cols[1].text.strip() == '삼성':
            game_date = driver.find_element(By.CSS_SELECTOR, '#cphContents_cphContents_cphContents_lblSearchDateTitle').text.strip()
            game_result = [col.text.strip() for col in cols]
            game_result.insert(0, game_date)
            data.append(game_result)
            break

    # 데이터 수집 횟수 증가
    count += 1

    # 다음 날짜로 이동
    try:
        next_day_button = driver.find_element(By.ID, 'cphContents_cphContents_cphContents_btnNextDate')
        # 다음 날짜 버튼이 확실히 보이도록 페이지를 더 많이 스크롤합니다.
        driver.execute_script("window.scrollBy(0, -300);")  # 페이지를 위로 더 스크롤
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'cphContents_cphContents_cphContents_btnNextDate')))
        next_day_button.click()
        time.sleep(2)
    except Exception as e:
        print(f"Error: {e}")
        break

# WebDriver 종료
driver.quit()

# DataFrame으로 변환
columns = ['날짜', '순위', '팀명', '경기', '승', '패', '무', '승률', '게임차', '최근10경기', '연속', '홈', '방문']
df = pd.DataFrame(data, columns=columns)

# CSV 파일로 저장
df.to_csv('samsung_results_22_24.csv', index=False)

print("데이터 크롤링 완료 및 CSV 파일 저장 완료")

2022년 4월 2일부터 삼성의 성적이 제대로 나온 것을 알 수 있습니다.

 

 

반응형

'야구 분석/Python'의 다른글

  • 현재글 삼성 라이온즈 성적 크롤링하기

관련글