분석가 Step 1. 데이터 분석/R

공공데이터포털 오픈 API 불러오기 1편

뚱뿌 2023. 3. 17. 16:02

목표 : 공공데이터포털에 있는 오픈 API 불러오자!

 

먼저, 공공데이터포털에 접속한 후 로그인을 한다. 

로그인 후 "마이페이지 - 오픈 API - 개발계정"에서 내가 활용신청한 데이터를 확인할 수 있다.

공공데이터포털

 

실습 파일 : 대전광역시 문화관광(관광지) 오픈 API 

 

오픈 API에 대한 자세한 정보는 해당 데이터의 참고문서를 확인하면 된다. 

그리고 가장 중요한 것!! 

API 활용을 위해서는 서비스키(인증키)가 필요하다.

※ 서비스키(인증키)는 "오픈 API - 인증키 발급현황"에서 발급 후 확인 (발급 후 1시간 이후에 사용 가능)

※ API 불러온 후 오류 메시지가 나타난다면, 인코딩 혹은 서비스키 문제

오픈 API 정보 확인

 

이제, 오픈  API를 불러오자. 

필자는 대전광역시 문화관광(관광지) API에서 문화관광 관광지 목록조회(XML)에 대한 정보를 불러올 것이다.

참고문서로 필요한 정보를 확인한다.

  • 필요한 정보 : Call Back URL, 요청 메시지 명세
  • 요청 메시지 명세의 항목구분 (1: 필수, 0: 선택)

상세기능명세 정보

  • serviceUrl : Call Back URL에서 tourDataService까지의 정보
  • oper_serve : Call Back URL에서 tourDataList (어떤 정보의 상세기능을 불러올 것인지 확인하여 적절히 입력)
  • my_key : 본인 서비스키 정보
  • url : 앞의 정보들을 결합하여 생성 (요청 메시지 명세에서 항목구분 1로 되어 있는 항목은 필수로 존재해야 함)

url을 생성할 때, serviceKey 부분은 I() 함수를 이용하였다. 

해당 부분이 단순히 my_key로 입력될 경우, 유효하지 않은 서비스 키로 오류가 발생할 수 있다.

이러한 오류를 사전에 I() 함수를 이용하여 인코딩/디코딩 문제를 방지하였다.

library(XML)
library(dplyr)
library(httr)
library(tidyverse)

rm(list=ls()) # R 데이터 전체 삭제 

serviceUrl <- "http://apis.data.go.kr/6300000/tourDataService"
oper_serve <- "/tourDataListJson"
my_key <- "본인 서비스키"

pageNo <- 1 # 페이지 번호
rows <- 10 # 한 페이지 결과 수 

url <- paste0(serviceUrl,oper_serve,
              "?serviceKey=", I(my_key),
              "&numOfRows=", rows,
              "&pageNo=", pageNo,
              sep = "")

Xml_data <- xmlParse(url) # xml 확인

 

위의 코드를 통해 정보들이 정상적으로 출력이 되면, 총 정보를 수집한다.

# # i 번째 url을 xmlTreeParse 이용해 parsing
all_data <- xmlTreeParse(url, useInternalNodes = TRUE, encoding = "UTF-8")
rootNode <- xmlRoot(all_data) # xml root node 획득 

## 총 오픈API 호출을 위함 
numOfRows <- as.numeric(xpathApply(rootNode, "//numOfRows", xmlValue))
totalCount <- as.numeric(xpathApply(rootNode, "//totalCount", xmlValue))
# 총 오픈 API 호출 횟수 계산
loopCount <- ceiling(totalCount/numOfRows)

fianlTotal_Data <- data.frame()
i <- 1
for (i in 1:loopCount) {
  url <- paste0(serviceUrl, oper_serve,
                "?serviceKey=", I(my_key),
                "&numOfRows=", rows,
                "&pageNo=", pageNo,
                # "apiType=", type_data_format,
                sep = "")
  
  doc <- xmlTreeParse(url, useInternalNodes = TRUE, encoding = "UTF-8")
  
  rootNode <- xmlRoot(doc)
  xmlData <- xmlToDataFrame(nodes=getNodeSet(rootNode, '//items'))
  
  fianlTotal_Data <- rbind(fianlTotal_Data, xmlData)
  cat(i, "\n")
}

View(fianlTotal_Data)

write.csv(fianlTotal_Data, "api_data.csv", row.names = FALSE, fileEncoding = "CP949")

 

공공데이터포털의 오픈 API(XML)에 대한 정보를 R을 이용하여 추출하였다. (잘 추출되었다!)

 

※ 다양한 데이터를 통해 응용해 보세요. 데이터 정제 및 추출을 위해서는 연습이 필요합니다.

 

[참고자료]