Tips

오픈API 사용하기 with R - 오픈API 활용신청 (2/2)

앤드류황 2023. 2. 3. 11:41

 

*최초 작성일: 2023-02-03

 

※ 오픈API 사용하기 1편 바로가기

 

 


 

1편을 쓴지 벌써 1달이 지났네요..

본격적으로 R을 사용하는 2편을 시작하도록 하겠습니다!

 

먼저 Rstudio를 실행합니다. 오픈API의 결과값 형태는 제공기관에 따라 xml, json 등 다양한 형태로 제공합니다.

그 중 이번에는 xml을 사용하기 위해 "XML" 라이브러리를 설치해줍니다.

 

 

오픈API는 웹브라우저에서 호출하면 결과가 나오지만, R을 쓰는 이유데이터의 전처리반복작업의 자동화 때문입니다.

먼저 원하는 오픈API를 가장 기본 형태로 호출해보면,

 

 

위 그림과 같은 결과를 확인할 수 있습니다. 여기서 중요한 것은 바로 totalCount 값입니다.

대량의 데이터가 존재할 경우, 앞서 말씀드린 반복작업을 해야 하는데요.

한 번에 조회할 수 있는 데이터의 수가 컴퓨터 사양, 인터넷 상태 등 다양한 조건에 의해 제약을 받습니다.

따라서 약 46만 개의 데이터를 100개, 1,000개 처럼 일정 단위만큼 조회하고 그것을 반복해야 전체 데이터를 받을 수 있게됩니다.

 

반복작업은 호출 변수 중 pageNo와 numOfRows를 사용하여 진행할 수 있습니다.

여기서는 numOfRows가 한 번에 요청하는 데이터의 수를 나타내는데, 만약 1,000개 씩 조회를 한다면 총 464페이지로 구분할 수 있으며 100개 씩 조회를 한다면 4,633페이지로 구분됩니다.

 

우리는 이 부분을 활용하여 반복작업을 통해 전체 데이터를 받아보겠습니다.

 

먼저 제가 작성한 전체 코드를 살펴보겠습니다.

 

 

평소에 R을 사용하는 분들은 쉽게 이해하실 수 있을텐데요.

for 구문을 활용하여 변수에 반복을 걸어 작업을 할 수 있습니다.

 

https://apis.data.go.kr/1741000/HeatWaveShelter2/getHeatWaveShelterList2?serviceKey=인증키&type=xml&pageNo=i&numOfRows=1000

 

먼저 요청문을 분리합니다. 기본적으로 사용되는 Call Back URL, 인증키, 그리고 변수가 있습니다.

저는 각각의 아이템을 분리해서 담았습니다.

reqURL에는 Call Back URL을, myKey에는 공공데이터포털 인증키, param에는 요청문에 들어가야 할 변수명을 넣었습니다.

 

 

요청문을 만들때는 serviceKey와 myKey, type과 xml, pageNo와 i, numOfRows와 1000을 연결하며 pageNo에 for 구문 i를 넣어서 pageNo를 반복하여 데이터를 요청하게 됩니다.

 

변수와 값은 =로 연결되며 변수 끼리는 &로 구분됩니다. 그리고 Call Back URL과 조건들은 ?로 구분하여 연결되므로 param과 values를 먼저 구성하고, reqURL과 param-values를 ?로 연결해서 req에 저장합니다.

완성된 요청문을 readLines를 통해 요청을 보내고, 돌아오는 응답을 raw.data에 저장합니다.

 

 

다음으로 raw.data를 xmlTreeParse를 통해 xml형태로 인식한 다음, xmlRoot를 통해 구조를 다듬습니다.

 

 

마지막으로 getNodeSet을 통해 필요한 데이터가 담겨있는 row(오픈API에 따라 다름 ※주의※)만 노드로 추출하고, xmlToDataFrame을 사용하여 데이터프레임으로 만들어줍니다.

for 구문으로 반복되므로 제일 처음 만들어준 Shelter 그릇에 i=1 결과부터 464 결과까지 rbind로 차곡차곡 모아준 후, 마지막에 완성된 전체 데이터를 저장하면 데이터 수집이 끝나게 됩니다!

 

 

제가 사용한 변수명이나 사용한 함수들은 사용자가 원하는 것으로 변경해도 가능하며, 저는 임의로 지정하여 진행하였습니다.

한 번에 조회할 수 있는 데이터의 수나, 오픈API 요청에 필요한 변수들은 모두 다르므로 꼭! 참고문서를 확인하시고 사용하시기 바랍니다.

 

# 23.02.03
# OpenAPI 무더위쉼터
rm(list=ls())
setwd("...")

install.packages("XML")
library(XML)

Shelter <- c()

reqURL <- "..."  # Call Back URL
myKey <- "..."  # 발급받은 인증키(Encoding)
param <- c("serviceKey", "...", "...", "...")  # 요청 항목명

for(i in 1:...){
  values <- c(myKey, i, "...", "...")  # 항목별 값
  
  req <- paste (reqURL, paste(param, values, sep = "=", collapse = "&"), sep = "?")  # 요청 URL 만들기
  
  raw.data <- readLines(req, warn = "F",encoding="UTF-8")  # 요청 URL 읽어오기
  
  response <- xmlTreeParse(raw.data, useInternalNodes = TRUE, encoding = "UTF-8")  # xml 트리 구조 가져오기, xml 파일을 req
  
  rn <- xmlRoot(response)  # xml 트리 구조 형태로 보기
  
  Shelter <- rbind(Shelter, xmlToDataFrame(nodes = getNodeSet(rn, "//...")))
}

write.csv(Shelter, "....csv", row.names = FALSE, fileEncoding = 'cp949')

 


 

  • 모든 내용은 개인적으로 공부한 내용이므로 정보의 정확성이 떨어질 수 있으며, 다른 의견이나 틀린 부분에 대해서는 댓글로 문의부탁드립니다!
  • 제공하는 R 코드는 자유롭게 사용하실 수 있으며, 본 게시글의 내용을 따라하여 발생하는 모든 책임은 본인에게 있음을 유의바랍니다.