본문 바로가기
Data Analysis/R

[R] 주식 DATA 수집/분석 - NAVER 주식 Data 가져오기 -2

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

 

 

 

이번에는 다량의 주식 데이터를 가져와서 Database에 저장해보겠습니다. 먼저 Database를 간단하게 만들어 봅니다.

 

CREATE TABLE test..DD_STOCK_PRC (
		CODE		VARCHAR(6) NOT NULL	
	,	DT			DATE NOT NULL
	,	CLOSE_PRC	INT NOT NULL
	,	DIFF_RT		REAL NOT NULL
	,	OPEN_PRC	INT NOT NULL
	,	HIGH_PRC	INT NOT NULL
	,	LOW_PRC		INT NOT NULL
	,	VOLUME_QTY	INT NOT NULL
	,	PRIMARY KEY CLUSTERED (CODE, DT)
)

 

네이버 주식 데이터의 순서를 참조하여 주식코드, 일자, 종가, 전일비, 시가, 고가, 저가, 거래량 순으로 저장하는 구조입니다.  다음으로 저번과는 달리 좀더 많은 데이터를 가져오도록 코드를 짜봅니다.

 

library(rvest)

# 주식 데이터 가져오기 함수
getStock <- function(code, page) {
  
  url <- paste0('https://finance.naver.com/item/sise_day.nhn?code=', code, '&page=',page)
  
  htxt <- read_html(url, encoding='euc-kr')
  
  t <- html_nodes(htxt, 'table') %>% html_table(header = T)
  t <- t[[1]]
  
  # 값이 없는 행 제거
  t <- t[!apply(t=="",1,all),]
  
  # 숫자에 포함된 , 제거
  for(i in 1:ncol(t)) {
    t[,i] <- gsub(',','',t[,i], fixed=T)
  }
  
  # 주식 코드를 포함한 data frame 생성
  t <- data.frame(CODE = code, t, stringsAsFactors = F)
  
  # 칼럼명 지정
  colnames(t) <- c('CODE','DT','CLOSE_PRC','DIFF_RT','OPEN_PRC','HIGH_PRC','LOW_PRC','VOLUME_QTY')
  
  # 날짜 형식 변경
  t$DT <- gsub('.','-',t$DT,fixed=T)
  
  
  return(t)
}

 

먼저 앞서 했던 데이터 가져오기 스크립트를 함수화 하고 데이터를 간단하게 정리하는 부분을 추가했습니다. 주소부분에 page 번호를 받아 변경할 수 있도록 해서 주식 코드와 번호만 입력해주면 해당 주식 코드의 지정된 페이지 데이터를 가져옵니다.

 

# lapply를 통해 30 페이지 까지 데이터를 가져온다.
result <- lapply(1:30, function(x) getStock('035720', x))

result <- do.call('rbind', result)

head(result)

 

 

lapply 함수를 이용하여 총 30페이지 데이터를 가져와서 하나의 data frame으로 만들어줍니다. 

 

library(RODBC)

#MSSQL 연결
msconn <- odbcConnect("mssql", uid='*****', pwd='*******') 

#앞서만들었던 데이터테이블을 조회해보자
test <- sqlQuery(msconn, 'select * from test..DD_STOCK_PRC') 

 

이제 만들어 놓은 데이터를 넣을건데 먼저 RODBC 패키지를 이용하여 연결 테스트를 해봅니다. 앞서 데이터베이스에 테이블을 만들었다면 결과는 다음과 같이 나올 겁니다. 

 

 

다음 함수를 만들어고 실행하여 데이터를 넣어봅시다.

 

# Data 삽입 함수
insertIntoDb <- function(conn, data, tableName) {
  
  data.colnames <- colnames(result)
  
  dataTable <- sqlQuery(msconn, paste0('select top 1 * from ', tableName)) 
  dataTable.Colnames <- colnames(dataTable)
  
  # 넣을려는 데이터의 칼럼명과 데이터 테이블의 칼럼명을 체크
  if (sum(data.colnames %in% dataTable.Colnames) == length(dataTable.Colnames)) {
  
  	# 데이터 수만큼 데이터 Insert
    for (i in 1:nrow(data)) {
      query <- paste0("insert into ", tableName)
      query <- paste0(query , " (", paste(data.colnames, collapse = ","), ") VALUES ('")
      query <- paste0(query , paste(data[i,], collapse = "','"  ), "')")
      
      sqlQuery(conn, query)
    }
  }
  
}

 

위와 같은 데이터 삽입 함수를 만듭니다. 실제 RODBC등 패키지에는 데이터 삽입 함수가 존재하지만 체크로직을 만들면서 아예 데이터 삽입 부분도 함께 만들어봤습니다.

 

insertIntoDb(msconn, result, 'test..DD_STOCK_PRC')

test <- sqlQuery(msconn, 'select * from test..DD_STOCK_PRC') 

head(test)

 

데이터를 넣은 후 다시 select를 하여 확인해보면 다음과 같이 데이터가 잘 들어간 것을 확인할 수 있습니다.

 

 

댓글