본문 바로가기
  • Homines, dum docent, discunt
  • Repetitio est Mater Memoriae
  • Dilige et fac quod vis
지식 창고/R 언어

공공데이터 포털 OPEN API 데이터 R로 불러오기

by Manana Cho 2022. 3. 24.
반응형

1) 찾고자 하는 데이터 가져오기: https://www.data.go.kr/index.do

2) 데이터 > Open API 로 들어가서 데이터고르기

3) 활용신청하기

4) 마이페이지에서 승인 신청 확인

5) 미리보기를 통해 링크 확인 (참고문서 활용시 데이터 이해하는 것에 도움이 됨)

6) 미리보기를 통해 위의 URL 확인, 아래 변수명 확인

7) library, packages 가져오기

#library------------------------------------------
library(XML)
library(httr)
library(RCurl)
library(plyr)
library(data.table)
library(haven)
library(devtools)
library(na.tools)
library(expss)
library(plyr)
library(utils)
library(janitor)
library(dplyr)
library(do)
library(ggplot2)
library(skimr)
library(matrixStats)
library(magrittr)
library(openxlsx)
library(viridis)
library(hrbrthemes)
library(stringr)

8) 아래 코드 이용하기 (녹색은 설명, 보라색은 개인 데이터에 맞춰 수정해야하는 부분)

api_url="http://openapi.data.go.kr/openapi/service/rest/Covid19"    #들어가야하는 주소
operation="/getCovid19SidoInfStateJson" #"/get-" 으로 시작하는 오퍼레이션 주소
key="?serviceKey="
service_key="(개인 Encoding 서비스키)"
pageNo="&pageNo="
pageNo1=1
numOfRows="&numOfRows="
numOfRows1=100
startCreateDt="&startCreateDt="
startCreateDt1=20200101  #공공데이터센터에서는 옵션이라고 하지만 없으면 제대로 안돌아감
endCreateDt="&endCreateDt="
endCreateDt1=20211231
requestUrl = paste0(api_url,operation,key,service_key,numOfRows,numOfRows1,pageNo,pageNo1,startCreateDt,startCreateDt1,endCreateDt,endCreateDt1) #URL 불러오기


page=getForm(paste0(requestUrl,"1"),query="")
doc=xmlToDataFrame(page)
str(doc)
doc$totalCount[2]
class(doc$totalCount[2])
totaldataNumber=as.numeric(doc$totalCount[2])
totalPageNumber=(totaldataNumber%/%100)+1


test=list() #리스트형태로 
for (allpage in 1:totalPageNumber){   # 1번부터 totalPageNumber까지
  temp=getForm(paste0(requestUrl,allpage),query="") #데이터를 갖고와서 temp에 저장
  temp_dt=xmlTreeParse(temp,useInternalNode=T, encoding="utf-8") #temp를 xmlTreeparsing 을 인터넷 이용해서 temp_dt에 저장하고 코딩은 utf-8로 할 것 지시
rootNode=xmlRoot(temp_dt) 
test[[allpage]]=rootNode
test3=list()
test2=data.frame()
items=rootNode[[2]][["items"]]
  size=totaldataNumber
for(i in 1:size){
test1=xmlSApply(items[[i]], xmlValue)
test2=data.table(createDt=test1[1],
                 deathCnt=test1[2],
                 defCnt=test1[3],
                 gubun=test1[4],
                 gubunCn=test1[5],
                 gubunEn=test1[6],
                 incDec=test1[7],
                 isolClearCnt=test1[8],
                 localOccCnt=test1[9],
                 overFlowCnt=test1[10],
                 qurRate=test1[11],
                 seq=test1[12],
                 stdDay=test1[13],
                 updateDt=test1[14] 
    ) #데이터 변수 지시
    test3[[i]]=test2
  }
  test[[allpage]]=rbindlist(test3)
}

fin=data.frame(rbindlist(test3))
View(fin)
###EXPORT:D---------------------------------------
saveRDS(fin, "C:\\file_path\\COVIDTRACK.RDS")
write.csv(fin, "C:\\file_path\\COVIDTRACK.csv")

 

****

invalid service key에러가 뜨는 경우, 하루(24시간)을 기다려 볼 것

 

[결과]

반응형

댓글