본문 바로가기
Data Analysis/R

[R] NAVER 주식 DATA 가져오기-1

by 불탄오징어 2020. 5. 7.
반응형

 

 

 

 

오랜만에 해보는 R 공부? 입니다. 이번에 해볼 것은 R을 이용해서 NAVER 금융의 주식 데이터를 가져와보려합니다. 해당 주제는 여러분들이 공부해서 이미 많은 포스팅이 있지만 한번 독학으로 쭉 진행해보려합니다. 

 

1) NAVER 금융 페이지 

 예시로 카카오 주식(035720)을 검색해서 페이지를 띄워보겠습니다. '시세'탭을 클릭해서 보면 아래와 같은 화면을 얻을 수 있습니다. 

 

 

1-1) 개요 부분

  현재가, 고가, 저가,거래량등 개요부분이 있고 아래 쪽으로는 주요시세, 시간별 시세, 일별 시세가 있습니다. 시간별 시세, 일별 시세는 페이지 구조로 구성되어 장기간의 데이터를 얻을 수 있는 구조로 되어있네요. 먼저 개요부분 html을 뜯어봅니다. 카카오 시세가 206,000원으로 되어있는데 이부분을 구조를 보면 아래와 같습니다.

 

 

재미있는 건 개발자 모드에서 켜서 보면 저렇게 보입니다만 소스보기를 하면 저사이에 숨겨진 코드가 더 있음을 알 수 있습니다. (개발자 모드에서 볼 수 있는 방법이 있을 수 있겠지만 일단은 제가 잘 몰라서..)

 

 

소스보기를 해서 보면 206,000 이라는 숫자가 있는 부분을 확인할 수 있습니다. R에서 명령어를 이용하여 저 부분의 값을 가져오면 당일 현재 기준 주식가격을 가져올 수 있겠네요. 

 

 

1-2) 시간대별 시세

 

시간대별 시세는 페이지 구조를 가지고 있으니 먼저 각 페이지 번호에 컨트롤키를 누른 상태로 클릭을 하면 새로운 창이 뜹니다. 이때 어떤 주소가 나오는지 봅시다.

 

 

새로운 창(또는 탭)의 주소창을 보면 아래와 같습니다. 위의 개요 부분 주소와 약간 다른것을 알 수 있는데요 .

 

https://finance.naver.com/item/sise_time.nhn?code=035720&thistime=20200508161046&page=1

 

주소에서 붉게 표기한 부분 처럼 가변으로 적용할 수 있는 구조입니다. 해당 화면에서 오른쪽 마우스 클릭하여 검사로 html 구조를 봅시다. (크롬기준)

 

 

 

행복하게도 Table 구조를 가지고 있습니다. 이 경우는 가장 쉽게 데이터를 가져와 Data.frame 구조로 만들어 줄 수 있습니다. 

 

 

1-3) 일자별 시세

일자별 시세도 1-2) 시간대별 시세와 동일한 방법으로 html 구조를 확인합시다. 먼저 url은 다음과 같습니다. 

 

https://finance.naver.com/item/sise_day.nhn?code=035720&page=1

 

개발자 모드로 html구조를 확인해보면 아래와 같이 table 구조를 가지고 있네요.

 

 

 

 

2) 데이터 가져오기 (with R)

그럼 위에서 확인한대로 R을 통해 데이터를 가져와보겠습니다. 먼저 개요부분의 주식가를 가져와보죠.

 

library(rvest)

url <- 'https://finance.naver.com/item/main.nhn?code=035720'

htxt <- read_html(url, encoding='euc-kr')

 

위의 스크립트를 실행하면 htxt에 해당 페이지의 html 코드가 담깁니다. 이중에서 필요한 부분만 발라내어야 하는데 그 때 사용하는 것이 html_nodes() 함수 입니다. 이 함수를 활용하여 html 태그와 클래스명을 활용하여 필요한 부분을 추출해냅니다.

 

 

하단에 나와있는 206,000이라는 숫자를 빼내는게 목표입니다. 단계를 보면 아래와 같습니다.

 

div.content_wrap => div.rate_info => div.today => p.no_today => span.blind

 

이것을 스크립트로 구성하고 다음과 같습니다.

 

h <- html_nodes(htxt, 'div.content_wrap') %>% html_nodes('div.rate_info') %>% html_nodes('div.today')
price <- html_nodes(h, 'p.no_today') %>% html_nodes('span.blind') %>% html_text()

 

마지막에 html_text()를 이용하여 주식가격을 추출합니다. 

 

library(rvest)

url <- 'https://finance.naver.com/item/main.nhn?code=035720'

htxt <- read_html(url, encoding='euc-kr')


h <- html_nodes(htxt, 'div.content_wrap') %>% html_nodes('div.rate_info') %>% html_nodes('div.today')
price <- html_nodes(h, 'p.no_today') %>% html_nodes('span.blind') %>% html_text()

price

 

 

다음으로는 일자별 시세를 가져와 봅시다. 앞서 말한 것처럼 Table 구조로 되어있을 경우 html_table() 함수를 활용합니다.

 

url <- 'https://finance.naver.com/item/sise_day.nhn?code=035720&page=1'

htxt <- read_html(url, encoding='euc-kr')

# html_table을 이용하여 table 내 데이터 가져오기
t <- html_nodes(htxt, 'table') %>% html_table(header = T)

# 첫번째 요소만 데이터가 있으므로 
t <- t[[1]]

# 값이 없는 행 제거
t <- t[!apply(t=="",1,all),]

t

 

 

 

댓글