본문 바로가기
R 프로그래밍/R advance

오픈 API를 활용한 공공데이터 불러오기(데이터 포맷: xml)

by 찐남 2022. 1. 7.

공공데이터 홈페이지 가입 및 데이터 추출 준비

 

정부가 개방한 공공데이터를 오픈 API를 활용해서 추출하는 방법에 대해서 설명드릴게요.
우선, 공공데이터 홈페이지에 접속해 볼게요. 공공데이터 url 주소는 https://www.data.go.kr/index.do입니다.
여기를 클릭해서 들어가시면 아래와 같은 화면이 보입니다.

 

 

좌측 상단에 회원가입 탭을 클릭하셔서, 회원 가입을 하시면 로그인됩니다.

로그인하신 후 마이페이지에서 인증키를 받으셔야 공공 API를 활용하실 수 있어요.

 

아래 화면은 제가 발급한 인증키 발급현황입니다. 

 

다시 홈페이지 첫 화면에서 "금융"이라고 검색하고, 오픈 API탭을 클릭하시면 아래 화면이 보이는 데요.

제일 위에 있는 데이터 금융위원회_금융회사기본정보를 오픈 API를 활용해서 추출하겠습니다.

 

금융위원회_금융회사기본정보를 클릭해서 들어가시면, 아래와 같은 화면이 보이고요.

 

우측 중앙에 있는 활용신청 탭을 클릭하시면, 바로 승인되어 데이터 활용이 가능합니다.

마이페이지에 가시면, 아래와 같이 활용할 수 있는 데이터가 보여요.

저는 다른 데이터도 신청해서 2건이고, 아마 여러분들은 1건밖에 보이지 않을 거예요.

 

금융위원회_금융회사기본정보를 클릭하시면, 아래와 같은 화면이 보이고요.

 

좌측 하단에 미리보기 확인 탭을 클릭하시면 아래와 같은 화면이 보일 거예요.

 

미리보기를 클릭하시면, 아래와 같은 화면이 보여요.

 

빨간색으로 표시된 부분만을 추출해서 데이터 프레임으로 생성하면 되는데, 

이제 추출 방법에 대해서 설명드릴게요.

 

 


데이터 추출을 위한 URL 확인

 

오픈 API를 활용해서 데이터 추출을 하려면, 우선 관련 URL 주소를 알아야 해요.

위에 화면에 인터넷 주소 창을 선택하여 복사하면,

URL 주소를 알 수 있어요.

 

http://apis.data.go.kr/1160100/service/GetFnCoBasiInfoService/getFnCoOutl?serviceKey=*******&pageNo=1&numOfRows=10&resultType=xml&basDt=20200408&crno=1101113892240&fncoNm=메리츠자산운용

 

< 오픈 API 호출 URL 구조 >

이는 공공데이터 종류별로 다를 수 있기 때문에 정확한 구조는 활용 신청한 데이터에 대한 오픈 API의 활용자 가이드를 다운로드하시면 정확하게 알 수 있어요. 여기서는 금융위원회_금융회사기본정보 데이터를 기준으로 설명할게요.

 

  • 서비스 URL : http://apis.data.go.kr/1160100/service/GetFnCoBasiInfoService
  • 오퍼레이션명: getFnCoOutl
  • 인증키: *******   # 본인 인증키 사용
  • 요청 변수: pageNo=1&numOfRows=10&resultType=xml&basDt=20200408&crno=1101113892240&fncoNm=메리츠자산운용

 

데이터 추출을 위한 R code(with XML 패키지)

# XML 형식의 데이터 전처리를 위한 패키지 설치. 이미 설치되어 있으면 생략
install.packages('XML')

# 패키지 로드
library(XML)

# 서비스 URL 입력
serviceURL <- "http://apis.data.go.kr/1160100/service/GetFnCoBasiInfoService/"

# 오퍼레이션명
operation <- "getFnCoOutl"

## 인증키
ServiceKey <- "******"   # " " 안에 본인이 부여받은 인증키 입력

## 페이지 위치 지정
pageNo <- 1 

## 오픈 API 호출 시 얻게 되는 데이터의 개수 지정
rows <- 10 

# 추출 데이터 포맷 지정
type_data_format <- "xml"

# 오픈 API 호출을 위한 최종 URL 생성
url <- paste0(serviceURL,
              operation,
              paste0("?serviceKey=",ServiceKey),
              paste0("&pageNo=", pageNo),
              paste0("&numOfRows=", rows),
              paste0("&resultType=", type_data_format)
              )

# 오픈 API 호출 
xmlDocument <- xmlTreeParse(url, useInternalNodes = TRUE , encoding = "UTF-8")

# xml root node 획득
rootNode <- xmlRoot(xmlDocument)

# 오픈 API 호출 결과 데이터의 개수 확인 
numOfRows <- as.numeric(xpathSApply(rootNode, "//numOfRows", xmlValue))

# 전체 데이터의 개수 확인
totalCount <- as.numeric(xpathSApply(rootNode,"//totalCount", xmlValue))

# 총 오픈 API 호출 횟수 계산
loopCount <- ceiling(totalCount/numOfRows)

# 전체 데이터를 저장할 변수 선언
finalTotalData <- data.frame()

# 오픈 API 호출을 총 오픈API 호출 횟수만큼 반복 실행
for (i in 1:loopCount) {
  # 호출 URL 생성
  url <- paste0(serviceURL,
                operation,
                paste0("?serviceKey=",ServiceKey),
                paste0("&pageNo=", i),
                paste0("&numOfRows=", rows),
                paste0("&resultType=", type_data_format)
  )
  
  doc <- xmlTreeParse(url, useInternalNodes = TRUE, encoding = "UTF-8")
  
  # XML 데이터의 Root Node에 접근
  rootNode <- xmlRoot(doc)
  
  # item Node의 데이터 추출
  xmlData <- xmlToDataFrame(nodes = getNodeSet(rootNode,'//item'))
  
  # 추출한 데이터를 전체 데이터를 저장할 변수에 누적 저장
  finalTotalData <- rbind(finalTotalData, xmlData)
}

# 데이터 확인하기
View(finalTotalData)

# CSV 파일로 저장하기
write.csv(finalTotalData, "금융회사기업개요조회(xml).csv", row.names = FALSE)

 

반응형

댓글