아래는 네이버 차트에서 크롤링 한 다음에, RMariaDB에 Insert 하는 장면이다. 이것은 ERP시스템에 있는 데이터를 R로 정기적으로 업데이트 해주는 역할을 한다.
사용할 일이 있어서 아래와 같이 메모 한다.
# 라이브러리를 불러온다.
library(httr)
library(rvest)
library(lubridate)
##
## 다음의 패키지를 부착합니다: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(stringr)
library(readr)
##
## 다음의 패키지를 부착합니다: 'readr'
## The following object is masked from 'package:rvest':
##
## guess_encoding
library(dplyr)
##
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Mongo DB 연결
source("~/Dropbox/01.R분석/08.stockR/01.DBConnection/Mongocon.R")
# Mysql DB 연결
source("~/Dropbox/01.R분석/08.stockR/01.DBConnection/Mysqlcon.R")
# 최근 3년치 데이터를 가져온다.
from = (Sys.Date() -years(3)) %>% str_remove_all('-')
to = Sys.Date() %>% str_remove_all('-')
# 종목을 선택 한다.
# name ="005930"
# 아래 네이버 그래프 차트 크롤링을 해서, 데이터를 뽑아 낸다.
stock_get_fun <- function(name){
url = paste0('https://fchart.stock.naver.com/siseJson.nhn?symbol=', name,
'&requestType=1&startTime=', from, '&endTime=', to, '&timeframe=day')
data = GET(url)
data_html = data %>% read_html %>%
html_text() %>%
read_csv()
df <- data.frame(code = name,
일자 = as.character(parse_number(data_html$`[['날짜'`)),
시가 = data_html$`'시가'`,
고가 = data_html$`'고가'`,
저가 = data_html$`'저가'`,
종가 = data_html$`'종가'`,
거래량 = data_html$`'거래량'`,
외국인소진율 = parse_number(data_html$`'외국인소진율']`)
)
df <- filter(df, !is.na(일자))
df <- arrange(df, desc(일자))
return(df)
}
insert_fun <- function(name){
stock <- stock_get_fun(name)
query <- paste0("DELETE FROM stock WHERE code = '",name,"'")
res <- dbSendQuery(con, query)
dbClearResult(res)
dbWriteTable(con, "stock", stock , append = TRUE)
}
stock_master <- mongo_all_fun("master", "yongas")
##
Found 358 records...
Imported 358 records. Simplifying into dataframe...
system.time(
for(i in 1:nrow(stock_master)) {
stock_code <- stock_master$단축코드[i]
try(insert_fun(stock_code), silent = TRUE)
}
)