머신러닝으로 야구 득/실점 예측해보기 (1) 소스 가져오기

    목차
반응형

나는 개발자가 아닌 취미로 프로그램을 짜보는 일반인 겸 롯데 팬이다.

요즘에 머신러닝을 공부 중이고 야구 시즌도 개막하는 터라 득/실점을 머신러닝으로 예측할 수 없을까? 생각에 프로그램을 짜보았다. (롯데 팬이기 때문에 롯데 위주로 정리했습니다.)

 

 

우선 머신러닝을 위한 데이터를 모아야한다.

데이터는 1. KBO 공식 홈페이지      2. 네이버 스포츠 기록실      3. 스탯티즈 등 3군데에서 모을 수 있다.

 

KBO 공식 홈페이지에서는 2001년 기록부터 확인할 수 있었다.

KBO 공식 홈페이지

KBO에서 자료를 수집하기 위해 소스보기를 해보았지만 점수 데이터는 들어있지 않았다.

다른 방법으로 데이터를 수집할 수 있겠지만... 초보자 입장에서는 무리였다. (python 언어 외에는 전혀 모르는 초짜다.)

 

그래서 네이버 스포츠 기록실을 확인해보았다. 2008년 자료부터 들어있었다.

네이버 스포츠 일정/결과

그리고 소스보기로 확인했을 때 점수가 나오는 것을 확인할 수 있었다. 2008년부터라는 한정적인 데이터지만 고려대상으로 정했다.

 

 

마지막으로 스탯티즈. 무려 82년도, 원년부터의 기록이 모두 되어있다.

스탯티즈 경기일정

그래서 많은 데이터를 모을 수 있겠다는 기대감과 함께 소스보기를 했을 때 점수가 잘 나와서 만족했었다.

했었으나 기록 오류가 있었다. 그래서 기록 오류가 수정되기까지 보류하기로 하고 네이버 스포츠 기록을 이용하기로 했다.

 

 

먼저 링크를 가져와서 BeautifulSoup를 이용했다.

사실 여긴 구글링으로 이런 방식으로 하더라 라는 것만 알아서 어떤 원리인지는 잘 알지 못한다.

한 가지 아는 건 BeautifulSoup(html, "lxml")을 하면 소스보기를 했을 때 나오는 소스가 저장되고

soup.get_text()를 하면 소스에서 <> ... </> 처리되어있는 부분이 사라지고 글만 남는다는 것이다.

 

* 참고. url 끝에 'teamCode=LT'로 되어있는데 롯데 경기만 확인하는 주소이다.

다른 팀들도 각각 있는데 두산은 OB, 키움은 WO 등 일정표에서 팀 엠블럼을 선택하면 확인할 수 있다.

 

import urllib.request
from bs4 import BeautifulSoup

url = "https://sports.news.naver.com/kbaseball/schedule/index.nhn?&month=03&year=2008&teamCode=LT"
req = urllib.request.Request(url)
html = urllib.request.urlopen(req).read()
soup = BeautifulSoup(html, "lxml")
st = soup.get_text()
print(st)

(생략)

2008시즌 경기일정

프로야구 경기일정

날짜
시간
경기
중계/기록
중계방송사
구장
알림받기



3.1 (토)
-
프로야구 경기가 없습니다.

(중략)

3.28 (금)
-
프로야구 경기가 없습니다.


3.29 (토)

14:00
롯데

11:1

한화

대전



3.30 (일)

13:30
롯데

9:8

한화


대전



3.31 (월)
-
프로야구 경기가 없습니다.


야구 홈으로  

맨 위로

(생략)

 

확인해보면

 

날짜 (요일)

경기 시간

원정팀

경기 스코어

홈팀

경기 장소

 

순으로 정리가 된다는 걸 알 수 있다.

 

필요한 부분만 택해서 정리하기 위해 각 월의 1일 위에 있는 '알림받기' 이후와 마지막날 밑에 있는 '야구 홈으로' 위까지 자르면 좋겠다 생각했다.

def cuturl(url):
    req = urllib.request.Request(url)
    html = urllib.request.urlopen(req).read()
    soup = BeautifulSoup(html, "lxml")
    st = soup.get_text()

    cut1 = st.find("알림받기")
    cut2 = st.find("야구 홈으로")
    st = st[cut1+4:cut2]
    st = st.strip()

    return st

각 월마다 반복작업해야하기 때문에 함수로 정해서 필요할 때마다 가져올 수 있도록 했다.

이렇게 하면 '3.1(토) ~ 3.31(월) ... 없습니다.' 까지 st에 저장이 된다.

* string.strip()을 하면 띄어쓰기, \t (탭), \n (엔터) 등 string 양 끝의 공백을 잘라주는 역할을 한다.

 

 

 

이제 이 긴 string에서 날짜, 롯데의 득점, 실점, 상대팀 데이터를 뽑아내야한다.

 

 

(다음 글에 이어서)

728x90
반응형