일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- n8n
- 야구
- 시각화
- 인과추론
- 데이터
- 신기효과
- 프롬프트
- DataAnalysis
- retentioneering
- 글또
- 주가데이터
- 프롬프트엔지니어링
- 성장
- 데이터분석
- gapminder
- EDA
- 분석한스푼
- aha-moment
- 데이터디스커버리플랫폼
- data
- data-analysis
- 트위먼의법칙
- productanalysis
- 데이터분석가
- 아하모먼트
- 벅슨의역설
- PyGWalker
- 전환분석
- pandasai
- DataAnalyst
데이터 생존 로그
[야구] 스탯티즈 데이터셋 크롤링하기 (with. BeautifulSoup) 본문
해당 게시글은 스탯티즈(링크)에서 야구(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
'생존 도구🏹' 카테고리의 다른 글
아하모먼트: 왜 우리 서비스를 계속 써요? (0) | 2023.12.08 |
---|---|
[Streamlit] 간단한 대시보드 배포하기(with. KBO 타격지표) (0) | 2023.07.02 |
ChatGPT랑 같이 EDA해보기 (with. 프롬프트 엔지니어링) (0) | 2023.06.04 |
PandasAI: 판다스, AI를 만나다. (1) | 2023.05.04 |
Datahub: 추출에 쫓기는 데이터 분석가에게 희망이 될 상인가? (0) | 2023.03.25 |