데이터 생존 로그

[야구] 스탯티즈 데이터셋 크롤링하기 (with. BeautifulSoup) 본문

생존 도구🏹

[야구] 스탯티즈 데이터셋 크롤링하기 (with. BeautifulSoup)

분석가 베어그릴스 2023. 6. 12. 23:05
해당 게시글은 스탯티즈(링크)에서 야구(KBO) 데이터셋을 크롤링(BeautifulSoup)하여 csv로 만드는 과정을 다룹니다.

 

개요

MLB는 데이터셋을 api로 제공해주지만, KBO는 그렇지 않다.
그래서 스탯티즈라는 야구 통계 사이트의 데이터를 직접 크롤링해야한다.
 
환경은 코랩을 활용했으며,
beautifulsoup4를 이용했다.
 
거두절미하고 시작하자.


받고자 하는 데이터

한 시즌을 치룬 팀들의 타격지표를 보고자 한다.
 
아래 링크를 참조하면 바로 이해할 수 있다.
http://www.statiz.co.kr/stat.php?mid=stat&re=0&ys=1982&ye=2023&se=0&te=&tm=&ty=0&qu=auto&po=0&as=&ae=&hi=&un=&pl=&da=1&o1=WAR_ALL_ADJ&o2=TPA&de=1&tr=&cv=&ml=1&sn=30&pa=0&si=&cn=&lr=1 

 

STATIZ

--> 나이 : 타석 : 환산 : 표기 : 출력 : 타자 : (예:이승엽,양준혁) 출신고 : 정렬1 : 정렬2 :

www.statiz.co.kr


크롤링

필요한 라이브러리를 받는다.

!pip install beautifulsoup4

 
import 해주면 준비 완료.

import requests
from bs4 import BeautifulSoup
import pandas as pd

 
이제 크롤링할 url을 선언해준다.

url = 'http://www.statiz.co.kr/stat.php?mid=stat&re=0&ys=1982&ye=2023&se=0&te=&tm=&ty=0&qu=auto&po=0&as=&ae=&hi=&un=&pl=&da=1&o1=WAR_ALL_ADJ&o2=TPA&de=1&tr=&cv=&ml=1&sn=30&pa=0&si=&cn=&lr=1'

response = requests.get(url)

 
beautifulsoup 객체도 선언해주자.

html = response.text
soup = BeautifulSoup(html, 'html.parser')
temp = soup.find_all("table")[0]

find_all("table")을 통해 table 태그를 가진 모든 내용을 가져오고,
그 중 첫 번째 것만 temp라는 변수에 넣어준다.
 
 
그 다음, 빈 데이터프레임도 만들어주자.

df = pd.DataFrame(index = range(343), columns = ["순", "이름", "연도", "WAR", "-", "타석", "타수", "득점", "안타", "2루타", "3루타", "홈런", "루타", "타점", 
                                                 "도루", "도루실패", "볼넷", "사구", "고의사구", "삼진", "병살", "희생타", "희생플라이", "타율", "출루", "장타", 
                                                 "OPS", "wOBA", "wRC+", "WAR2", "--"])
df

343 x 31의 데이터프레임을 생성했다.
 
다음은 하나하나 태그를 분석 후, 패턴을 찾아서 직접 파싱해서 넣었다.

l = 0
temp2 = temp.find_all("tr")[3]
for j in range(3,414):
    temp2 = temp.find_all("tr")[j]
    if len(temp2.find_all("td")) == 31:
        for i in range(31):
            temp3 = temp2.find_all("td")[i]
            df.iloc[l,i] = temp3.get_text()
        l += 1

df

 
크롤링할 링크에 들어가보면, 10개의 행이 순서대로 나오고 칼럼이 다시 나오는 것을 볼 수 있다. (아래 그림에서 빨간 선)

위의 빨간 부분을 없애기 위해, len(temp2.find_all("td")) == 31로 열의 길이를 비교한 후 행을 쌓았다.


결과

올바르게 원하는 형태로 크롤링이 된 것을 알 수 있다.

 
자, 이제 분석을 시작해보자 !

 

분석글: https://analyst-ggom-chi-kim.tistory.com/10

 

[야구] 타율이 높으면 득점을 잘한다?

해당 게시글에서는 득점과 상관성이 높은 특성을 찾아내는 과정을 담았습니다. 야구에서 공격하는 팀의 최종 목적은 최대한 많은 득점을 내는 것이다. 홈런을 많이 때려내서 득점을 만들던, 많

analyst-ggom-chi-kim.tistory.com

 

반응형
Comments