호돌찌의 AI 연구소

2019년에 Crawling 공부하면서 정리를 했었던 내용의 일부입니다.

 

 

일단 한 페이지 추출 해보기

Load Packages

library(httr)
library(rvest)
library(jsonlite)
library(tidyverse)

조회연도 설정 & HTML 요청 실행

year <- '2019'

res <- POST(url = 'http://www.kbreport.com/leader/pitcher/list/ajax',
            body = list(rows = 20,
                        order = 'WAR',
                        orderType = 'DESC',
                        year_from = year,
                        year_to = year,
                        page = 1), 
            encode = 'form')

응답 결과 확인

print(x = res) 
Response [http://www.kbreport.com/leader/pitcher/list/ajax] Date: 2019-09-21 03:47 Status: 200 Content-Type: text/html;charset=UTF-8 Size: 61.4 kB <script type="text/javascript" src="/web/js/paging.js"></script> <script type="text/javascript"> $(document).ready(function(){ paging.action({ id : "paging" , totalCount : setNumber('253') ...

 

Window를 사용하고 있기 때문에 잠시 Locale 변경

Sys.setlocale(category = 'LC_ALL', locale = 'C')

 

HTML에서 Table 태그를 찾아 데이터 일괄 수집

res %>% 
  read_html() %>% 
  html_node(css = 'table.ltb-table') %>% 
  html_table() -> tbl

 

Locale 복구 & Table 출력

Sys.setlocale(category = 'LC_ALL', locale = 'korean')

head(tbl)
# 선수명 팀명 승 패 세 홀드 블론 경기 선발 이닝 삼진/9 볼넷/9 홈런/9 BABIP LOB% 1 1 양현종 KIA 16 8 0 0 0 29 29 184.2 7.94 1.61 0.29 0.303 75.2 2 2 린드블럼 두산 20 3 0 0 0 28 28 183.1 8.74 1.37 0.64 0.273 80.0 3 3 김광현 SK 15 6 0 0 0 29 28 176.1 8.63 1.89 0.61 0.341 78.2 4 4 산체스 SK 16 5 0 0 0 26 26 152.0 7.88 2.49 0.12 0.312 74.6 5 5 요키시 Hero 13 8 0 0 0 28 28 173.1 7.06 1.97 0.47 0.285 70.5 6 6 윌슨 LG 14 7 0 0 0 29 29 178.0 6.47 2.22 0.35 0.296 68.7

 

이제 loop이용해서 모두 긁어 보기

 

빈 데이터 프레임 생성 후 반복문 실시

result <- data.frame()
# 잠시 일시적으로 바꿈
Sys.setlocale(category = 'LC_ALL', locale = 'C')

for (i in 1:13) {
  
  res <- POST(url = 'http://www.kbreport.com/leader/pitcher/list/ajax',
              body = list(rows = 20,
                          order = 'WAR',
                          orderType = 'DESC',
                          year_from = year,
                          year_to = year,
                          page = 1), 
              encode = 'form')
  
  # 현재 진행상황을 출력
  cat('현재', i, '번째 실행 중! 응답 상태코드는', status_code(x = res), '입니다.\n')
  
  res %>% 
    read_html() %>% 
    html_node(css = 'table.ltb-table') %>% 
    html_table() -> tbl 
  
  # 최종 결과 객체에 적재
  result <- rbind(result, tbl)
  
  # 1초간 멈춥니다. 
  Sys.sleep(time = 1)
  
}

# 원상복귀
Sys.setlocale(category = 'LC_ALL', locale = 'korean')

 

긁은 거 구조 확인 및 마지막 까지 뽑혔는지 확인

str(result)
'data.frame': 260 obs. of 21 variables: $ # : int 1 2 3 4 5 6 7 8 9 10 ... $ 선수명 : chr "양현종" "린드블럼" "김광현" "산체스" ... $ 팀명 : chr "KIA" "두산" "SK" "SK" ... $ 승 : int 16 20 15 16 13 14 11 14 11 12 ... $ 패 : int 8 3 6 5 8 7 11 12 5 5 ... $ 세 : int 0 0 0 0 0 0 0 0 0 0 ... $ 홀드 : int 0 0 0 0 0 0 0 0 0 0 ... $ 블론 : int 0 0 0 0 0 0 0 0 0 0 ... $ 경기 : int 29 28 29 26 28 29 30 29 27 27 ... $ 선발 : int 29 28 28 26 28 29 30 29 27 27 ... $ 이닝 : num 184 183 176 152 173 ... $ 삼진/9 : num 7.94 8.74 8.63 7.88 7.06 6.47 6.41 6.29 6.01 7.33 ... $ 볼넷/9 : num 1.61 1.37 1.89 2.49 1.97 2.22 2.62 2.05 2.06 2.72 ... $ 홈런/9 : num 0.29 0.64 0.61 0.12 0.47 0.35 0.39 0.35 0.29 0.3 ... $ BABIP : num 0.303 0.273 0.341 0.312 0.285 0.296 0.303 0.284 0.314 0.303 ... $ LOB% : num 75.2 80 78.2 74.6 70.5 68.7 68.9 71.5 69.3 72 ... $ ERA : num 2.29 2.36 2.6 2.72 3.12 3.03 3.64 2.55 3.38 3.01 ... $ RA9-WAR: num 8.85 8.06 6.2 6.46 6.03 5.75 5.56 6.29 4.84 4.49 ... $ FIP : num 2.65 2.96 3.04 2.71 3.38 3.39 3.52 3.48 3.29 3.35 ... $ kFIP : num 2.45 2.69 2.78 2.55 3.31 3.38 3.51 3.5 3.3 3.28 ... $ WAR : num 7.47 6.7 6.2 5.67 4.85 4.81 4.64 4.48 4.29 4.18 ...
result %>% tail()
# 선수명 팀명 승 패 세 홀드 블론 경기 선발 이닝 삼진/9 볼넷/9 홈런/9 BABIP LOB% 255 15 윌랜드 KIA 8 10 0 0 0 28 28 165.0 7.47 3.22 0.93 0.347 69.2 256 16 다익손 롯데 6 9 0 0 0 28 27 144.0 7.12 2.38 0.94 0.315 69.1 257 17 알칸타라 KT 11 11 0 0 0 26 26 166.2 5.18 1.40 0.81 0.307 70.4 258 18 구창모 NC 10 7 0 1 0 22 18 106.0 9.68 3.40 0.85 0.270 77.4 259 19 헤일리 삼성 5 8 0 0 0 19 19 87.2 8.62 3.49 0.51 0.353 59.4 260 20 이재학 NC 9 4 0 0 0 22 22 122.2 6.24 2.71 0.44 0.307 68.5 ERA RA9-WAR FIP kFIP WAR 255 4.75 2.75 4.25 4.16 2.86 256 4.19 2.26 4.07 3.99 2.81 257 4.10 4.10 4.06 4.13 2.69 258 3.23 3.59 3.80 3.53 2.67 259 5.75 0.85 3.62 3.46 2.59 260 3.89 2.60 3.80 3.84 2.49

 

 

 

<Copyright 2019. @hotorch. All rights reserved.>

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!