데이터 분석

파이썬에서 표만 크롤링 하는 법

강청색 2024. 2. 22. 00:26

원래 크롤링을 하려면 여러 과정을 거쳐야했다.

예시 사이트는 스탯티즈로 들겠다.

# 웹드라이버 설정
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

전처리 과정을 거쳐 다음과 같은 데이터 프레임이 나오게 된다.

 

주의점

물론 다 되는 건 아니고 안되는 곳도 존재하고 저런 식의 크롤링도 막아놓은 곳도 존재한다.

하지만 비교적 편하게 쓸 수 있어서 표를 크롤링하고자 할땐 저 방법도 쓰면 좋을 거 같다.

 

'데이터 분석' 카테고리의 다른 글

mysql6  (1) 2023.12.20
mysql5  (0) 2023.12.19
mysql4  (2) 2023.12.18
mysql-3  (0) 2023.12.14
mysql 개념2  (0) 2023.12.13