이번에는 다량의 주식 데이터를 가져와서 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를 하여 확인해보면 다음과 같이 데이터가 잘 들어간 것을 확인할 수 있습니다.
'Data Analysis > R' 카테고리의 다른 글
[R] 주식 DATA 수집/분석 - 3 (0) | 2020.05.27 |
---|---|
[R] NAVER 주식 DATA 가져오기-1 (1) | 2020.05.07 |
[R] Apply 함수를 알아보자 (0) | 2020.04.21 |
[R] DAUM 영화 평점을 가져와서 분석하기 - 2 (0) | 2016.02.23 |
[R] Daum 영화 평점을 가져와서 분석하기 - 1 (2) | 2016.02.23 |
댓글