한국거래소에서 종목코드를 가져오기 위하여 크롤링방법이 필요하다. 전부 해당사이트 나와있는 방법을 그대로 따라한 것이다. 최근에 책으로 완성된 사이트이며, 사실 내가 하고싶은 대부분이 이책에 들어가있다.
2가지 패키지를 설치한다.
library(httr)
library(rvest)
httr
패키지는 데이터를 얻고자 하는 사이트에 GET 과 POST 2가지 방식으로 데이터를 요청하여 가져온다.rvest
는 가져온 html 데이터를 분해하여 필요한 부분만 추출하는데 사용된다. 역시 자세한 설명은 위에 소개한 사이트의 챔터4를 참고하면 된다.
한국거래소 의 산업별 현황 테이블을 가져오기 위해서는 2가지 단계가 필요하다.
gen_otp_url <- 'http://marketdata.krx.co.kr/contents/COM/GenerateOTP.jspx'
gen_otp_data<-
POST(gen_otp_url,
query= list(
name = 'fileDown',
filetype = 'csv',
url = 'MKD/03/0303/03030103/mkd03030103',
tp_cd = 'ALL',
date = '20190607',
lang = 'ko',
pagePath = '/contents/MKD/03/0303/03030103/MKD03030103.jsp'))
# httr::POST 를 활용하여 otp 가 있는 html 데이터 가져오기
otp <- gen_otp_data %>%
read_html() %>%
html_text()
# rvest 의 함수를 이용하여 필요한 otp 값 불러오기
library(readr) # read_csv() 함수를 위한 패키지
down_url <- 'http://file.krx.co.kr/download.jspx'
down_sector <- POST(down_url, query = list(code = otp),
add_headers(referer = gen_otp_url)) %>%
read_html() %>%
html_text() %>%
read_csv()
# add_headers 에서 referer 는 흔적을 남기는 과정인데, 그래야지 사이트가 우리를 로봇이라고 인지하지 않고 데이터를 준다고 한다.
잘 저장되었는지 확인하자
head(down_sector)
## # A tibble: 6 x 7
## 시장구분 종목코드 종목명 산업분류 `현재가(종가)` 전일대비 `시가총액(원)`
## <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 코스피 030720 동원수산~ 어업 8940 -20 41605016700
## 2 코스피 007160 사조산업~ 어업 54400 800 272000000000
## 3 코스피 006040 동원산업~ 어업 246500 500 829028800000
## 4 코스피 004970 신라교역~ 어업 14350 350 229600000000
## 5 코스피 012320 경동인베스트~ 광업 40300 1350 95310426900
## 6 코스피 003580 넥스트사이언~ 광업 5200 260 122099322800
디렉토리를 만들고 파일을 저장한다.
ifelse(dir.exists('data'), FALSE, dir.create('data'))
## [1] FALSE
write.csv(down_sector, 'data/krx_sector.csv')
httr
의 GET,POST 함수로 html 데이터를 받을 수 있다.rvest
로 html 의 필요한 데이터만 추출할 수 있다.quantmod
httr
,rvest