원래 크롤링을 하려면 여러 과정을 거쳐야했다.
예시 사이트는 스탯티즈로 들겠다.
# 웹드라이버 설정
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import pandas as pd
# Chrome 옵션 설정
chrome_options = Options()
chrome_options.add_argument('--no-sandbox') # 샌드박스 모드 비활성화
chrome_options.add_argument('--disable-dev-shm-usage') # dev-shm-usage 비활성화
chrome_options.add_argument('--disable-gpu') # GPU 사용 안 함
# Chrome 웹드라이버 실행
chromeDriver = webdriver.Chrome(options=chrome_options)
# 웹페이지 열기
chromeDriver.get("http://www.statiz.co.kr/player.php?opt=1&name=%EC%BC%88%EB%A6%AC&birth=1989-10-04")
# 페이지 로딩 대기 (필요에 따라 적절한 대기 시간을 설정하세요)
chromeDriver.implicitly_wait(10)
# XPath를 사용하여 원하는 요소 찾기
target_elements = chromeDriver.find_elements(By.XPATH, '/html/body/div/div[1]/div/section[2]/div/div[2]/div/div[3]/div/div/table/tbody')
# 찾은 요소가 있다면 첫 번째 요소의 텍스트 추출
if target_elements:
target_element = target_elements[0]
# 추출한 텍스트를 줄 단위로 나누어 리스트로 만들기
lines = target_element.text.split('\n')
# 원하는 부분 선택 (27번째부터 32번째까지)
selected_lines = lines[27:32]
#항목이 없어서 추가
columns = ['연도', '팀', '나이','출장', '이닝', 'ERA', 'FIP', 'K/9', 'BB/9', 'K/BB', 'HR/9', 'K%', 'BB%', 'K-BB%', 'PFR', 'BABIP', 'LOB%', '타율', '출루율', '장타율', 'OPS', 'WHIP', 'WHIP+', '투구', 'IP/G', 'P/G', 'P/IP', 'P/PA', 'CYP']
# 데이터프레임 생성
df = pd.DataFrame([line.split() for line in selected_lines],columns=columns)
# 데이터프레임 출력
print(df)
else:
print("요소를 찾을 수 없습니다.")
# 브라우저 종료
chromeDriver.quit()
이런식으로 일일히 설정을 해줘야 했다.
그럼 이런식의 결과가 나오고 전처리 등을 진행하면 되었다.
이게 너무 불편해서 간단하게 하는 방법이 있다고 해서 알아보았다.
import pandas as pd
url = "http://www.statiz.co.kr/player.php?opt=1&sopt=0&name=%EC%BC%88%EB%A6%AC&birth=1989-10-04&re=1&se=0&da=2"
tables = pd.read_html(url)
print(len(tables),"개의 테이블이 있습니다")
df_list = pd.read_html(url)
이렇게 진행하면 총 2개의 테이블이 있다고 나오고
0번 테이블과 1번 테이블이 나타나게 된다.
여기서 쓸 건 1번 테이블이긴 하지만 출력 결과 더블 헤더가 되는 등 복합하게 나온다.
여기서 추가적으로 전처리를 하려면 다음과 같은 과정을 거치면 된다.
# 데이터프레임 리스트에서 두 번째 요소 선택
selected_rows = df_list[1]
# 첫 5개 행 선택
df = selected_rows.iloc[0:5]
# 두 번째 레벨의 컬럼명만 선택하여 사용
df.columns = df.columns.get_level_values(1)
# 모든 열을 출력하도록 설정
pd.set_option('display.max_columns', None)
# 제목 행의 탭 제거
new_columns = [col.replace(" ", "") for col in df.columns]
# 데이터프레임의 열 이름 변경
df.columns = new_columns
# 변경된 데이터프레임 출력
df
전처리 과정을 거쳐 다음과 같은 데이터 프레임이 나오게 된다.
주의점
물론 다 되는 건 아니고 안되는 곳도 존재하고 저런 식의 크롤링도 막아놓은 곳도 존재한다.
하지만 비교적 편하게 쓸 수 있어서 표를 크롤링하고자 할땐 저 방법도 쓰면 좋을 거 같다.