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

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

뚱뿌 2023. 3. 17. 16:15

지난번 1편에서 "대전광역시"에 대한 정보만 포함된 데이터를 통해 정보를 추출하였다.

이번엔 전국 정보에서 "대전광역시"에 대한 정보만을 추출해보자.

 

1편: https://danha23.tistory.com/13

 

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

목표 : 공공데이터포털에 있는 오픈 API 불러오자! 먼저, 공공데이터포털에 접속한 후 로그인을 한다. 로그인 후 "마이페이지 - 오픈 API - 개발계정"에서 내가 활용신청한 데이터를 확인할 수 있다

danha23.tistory.com

 

간단하다!

URL을 불러오는 과정에서 paste() 대신, GET() 함수를 사용하는 것이다.

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

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

serviceUrl <- "http://openapi.tour.go.kr/openapi/service/TourismResourceService"
oper_serve <- "/getTourResourceList"
my_key <- "본인 서비스키"

# 전체 오픈API 호출 전 단계
res <- GET(url=str_c(serviceUrl, oper_serve),
           query=list(SIDO = "대전광역시",
                      GUNGU = "유성구",
                      serviceKey = I(my_key)))
xml_data <- xmlParse(res$url) # XML 불러온 결과 확인

위 코드를 통해 대전광역시 유성구에 대한 정보가 잘 출력되는지 확인한다. 

아래 결과를 보면, 필요한 정보는 <item> 안에 포함되어 있다.

필자는 <item> 안에 있는 정보를 추출하여 데이터프레임 형식으로 저장할 것이다.

 

목표 : 대전광역시 유성구에 대한 관광자원 정보 추출

all_data <- xmlTreeParse(res$url, useInternalNodes=TRUE, encoding="UTF-8")
rootNode <- xmlRoot(all_data)

numOfRows <- as.numeric(xpathApply(rootNode, "//numOfRows", xmlValue))
totalCount <- as.numeric(xpathApply(rootNode, "//totalCount", xmlValue))

loopCount <- ceiling(totalCount/numOfRows)

# 전체 오픈API 호출
final_Data <- data.frame()
i <- 1
for (i in 1:loopCount){
  url <- GET(url=str_c(serviceUrl, oper_serve),
             query=list(SIDO = "대전광역시",
                        GUNGU = "유성구",
                        serviceKey = I(my_key)))
  doc <- xmlTreeParse(res$url, useInternalNodes=TRUE, encoding="UTF-8")
  rootNode <- xmlRoot(doc)
  xmlData <- xmlToDataFrame(nodes=getNodeSet(rootNode, '//item'))
  
  final_Data <- rbind(final_Data, xmlData)
  cat(i, "\n")
}

View(final_Data)

write.csv(final_Data, "final_apidata.csv", row.names = FALSE, fileEncoding = "euc-kr")

추출된 정보