공공데이터, 오픈API로 활용해보자 [2부] - 오픈API 호출 방법과 R을 이용한 오픈API 활용법
상태바
공공데이터, 오픈API로 활용해보자 [2부] - 오픈API 호출 방법과 R을 이용한 오픈API 활용법
  • 임영훈 책임
  • 승인 2019.12.06 04:53
  • 조회수 44054
  • 댓글 2
이 콘텐츠를 공유합니다

 

전편에서 오픈API로 공공데이터를 활용하기 위해 활용 신청하는 방법과 활용 신청 정보를 확인하는 방법을 알아보았다. 이번 편에서는 활용 신청한 오픈API를 호출하여 데이터 처리하는 방법을 알아본다.

 

오픈API를 호출하기 위한 URL 만들기

오픈API 호출 URL은 네 가지 영역으로 구분할 수 있다. 첫 번째, 서비스 URL은 오픈API 서비스 명, 두 번째 오퍼레이션명은 데이터 ID, 세 번째 요청 변수는 데이터 검색 조건, 마지막 인증키는 오픈API 활용 신청자의 고유 ID이다.

투이톡_오픈api_1.jpg  

서비스 URL, 오퍼레이션명, 요청 변수 정보는 활용 신청 한 오픈API의 활용자 가이드에 명시되어 있다. 활용 신청한 오픈API의 활용자 가이드를 다운로드 하여 URL 생성에 필요한 정보를 확인하자.
 

투이톡_오픈api_2.jpg  
[그림 1] 오픈API 활용자 가이드 위치

 

투이톡_오픈api_3.jpg
[그림 2] 활용자 가이드 내용

Tip: 미리 보기 기능을 활용하여 오픈API 호출 URL 쉽게 만들기
URL을 직접 만들기 어렵다면 공공데이터포털의 오픈API 미리 보기 기능을 활용하여 URL을 쉽게 만들어보자.

① 개발 계정 상세보기 화면 하단에 위치한 상세기능정보 란에서 미리 보기 다운로드 실행 아이콘을 선택한다.
 

투이톡_오픈api_4.jpg
[그림 3] 미리 보기 다운로드 실행 아이콘 위치

② 요청 변수 입력란이 화면에 나타나면 ServiceKey 입력란에 인증키를 입력한다. 이때 인증키 길이가 매우 길기 때문에 직접 입력하지 말고 요청 변수 화면 위쪽에 위치한 인증키 복사 기능을 활용한다.
 

투이톡_오픈api_5.jpg
[그림 4] 인증키 복사하기


③ 인증키를 붙여넣기 한 뒤 요청 변수 화면 하단의 미리 보기 아이콘을 선택한다.
 

투이톡_오픈api_6.jpg
[그림 5] 복사한 인증키 붙여 넣기


④ 새 창이 열리면서 오픈API 호출 결과가 화면에 표시된다. 브라우저의 주소 입력 창에 오픈API 호출 URL이 입력되어 있다. 이 URL을 복사하자.
 

투이톡_오픈api_7.jpg
[그림 6] API 호출 URL 복사

 

오픈API 호출결과, XML 형태의 데이터 구조 이해하기

픈API 호출 URL을 만드는 방법을 익혔다면 오픈API 호출 결과에 대해 알아보자. 공공데이터포털에서 제공하는 모든 오픈API는 호출 결과를 공공데이터 활용자들이 동일한 방법으로 데이터를 처리할 수 있도록 표준화한 데이터 구조로 제공한다.

따라서 일단 데이터 처리하는 방법을 익히면 모든 오픈API로 제공하는 공공데이터를 동일한 방법으로 활용할 수 있다.

오픈API를 호출하면 데이터를 XML 또는 JSON 형태로 얻을 수 있다. 오픈API 호출 URL의 요청 변수에서 원하는 데이터 형태를 지정할 수 있는데, 명시적으로 지정하지 않으면 대부분 XML 형태로 데이터를 얻게 된다. 여기서는 XML 형태의 데이터를 알아본다.


오픈API를 XML 형태로 호출하면 아래와 같은 구조의 XML 데이터를 얻을 수 있다.
 

투이톡_오픈api_8.jpg
[그림 7] 공공데이터 XML 데이터 구조

① 데이터 항목: 실제 오픈API 호출 시 얻을 수 있는 데이터에 대한 내용

② 오픈API 호출 결과 데이터의 개수: 오픈API를 호출했을 때 얻게 되는 데이터의 개수
(한 번 호출에 모든 데이터를 얻을 수 있으면 좋겠지만, 대량의 데이터의 경우 제한된 컴퓨터 자원으로 인해 한 번에 전체를 얻을 수가 없기 때문에 여러 번으로 나누어서 데이터를 얻을 수 있도록 설계한 것이다. 호출 결과 데이터의 개수는 URL의 “요청 변수” 항목에서 변경할 수 있다. 하지만 숫자 제한이 있어서 너무 큰 숫자를 지정하면 오픈API 호출이 실패한다.)

 전체 데이터의 개수: 오픈API로 제공하는 데이터의 전체 개수

위의 경우 모든 데이터를 얻으려면 오픈API를 총 4,010번 호출해야 한다. 컴퓨터 프로그래밍 언어를 활용한 자동 처리 방법이 필요하다.

물론 오픈API 호출 결과 데이터 개수를 늘리면 오픈API 호출 횟수를 줄일 수 있다. 예를 들어 호출 결과 데이터 개수를 1,000개로 지정하면 오픈API를 총 5회 호출하면 된다.


최종적으로 XML 데이터를 처리하는 프로그램을 이용하여 필요한 데이터만 추출한다.

 

R을 활용한 공공데이터 오픈API 활용 방법

R은 오픈소스로 배포되어 누구나 무료로 사용할 수 있는 장점이 있으며 빅데이터 분석 목적으로 많이 사용되고 있다. R에는 인터넷에 접속하여 데이터를 주고 받을 수 있는 기능과 XML 형태의 데이터를 처리할 수 있는 기능이 있다. 이 기능들을 활용하여 오픈API를 호출하고 공공데이터를 획득해보자.

① 오픈API 호출 URL 만들기

투이톡_오픈api_9.jpg

 

② 오픈API 호출하기

투이톡_오픈api_10.jpg

 R에서 xmlTreeParse 함수에 오픈API 호출 URL을 인자로 사용하면 URL에 해당하는 오픈API를 호출하여 데이터를 XML 형태로 읽어올 수 있다. 오픈API를 호출하여 xmlDocument 라는 변수에 결과를 저장한다.

 

③ 전체 데이터 개수 확인 및 총 오픈API 호출 횟수 계산

투이톡_오픈api_11.jpg

R에서 XML 데이터를 처리하려면 먼저 Root Node에 접근해야 한다. xmlRoot 함수를 사용하여 Root Node 정보를 획득한다.
xpathSApply 함수를 사용하면 XML 데이터 내에서 특정 Node의 데이터를 읽어올 수 있다.


xpathSApply 함수를 사용하여 numOfRows Node의 데이터인 “오픈API 호출 결과 데이터의 개수”를 numOfRows 변수에 저장한다. 마찬가지로 xpathSApply 함수를 사용하여 totalCount Node의 데이터인 “전체 데이터 개수”를 totalCount 변수에 저장한다.

전체 데이터 개수를 오픈API 호출 결과 데이터의 개수로 나누면 오픈API를 총 몇 번 호출해야 하는지 계산할 수 있다(여기서는 4010 / 100, 40회). 이때 나머지가 있다면 오픈API 호출 횟수를 1회 증가한다(4010 / 100 = 40.1, 40회 1회 = 41회).

 

④ 오픈API를 반복 호출하여 데이터 추출

투이톡_오픈api_12.jpg

오픈API 호출 횟수를 계산하였다면 오픈API를 호출 횟수만큼 반복 호출하여 모든 데이터를 획득한다. URL을 생성할 때 요청 변수 항목 중 페이지 위치를 1씩 증가하도록 지정한다.


위의 예제에서는 한 번 오픈API를 호출할 때마다 100개의 데이터를 추출하여 총 41회 반복한다. 반복 횟수가 많을수록 실행 시간이 오래 걸린다.

XML 데이터 내에서 실제 데이터는 item Node에 저장되어 있다. xmlToDataFrame 함수를 사용하면 item Node 하부에 위치한 모든 Node의 데이터를 추출할 수 있다.

반복 실행하면서 추출한 데이터를 totalData 변수에 rbind 함수를 사용하여 누적 저장한다.


⑤ 추출한 데이터 검증 후 CSV 파일로 저장하기

투이톡_오픈api_16.jpg

View함수를 사용하면 변수에 저장되어 있는 데이터를 표 형태로 확인할 수 있다. 오픈API를 반복 호출하여 추출한 데이터 전체가 잘 표시되는지 확인한다.

 

투이톡_오픈api_13.jpg
[그림 8] View함수 실행결과


전체 데이터가 잘 추출되었다면 CSV 파일로 저장한다. write.csv 함수를 사용하면 변수에 저장되어 있는 데이터를 csv 파일로 저장할 수 있다.

 

투이톡_오픈api_14.jpg
[그림 9] CSV 파일로 저장한 결과

 

공공데이터 오픈API 활용 전체 R 코드

투이톡_오픈api_15.jpg

 

- 끝 -

 

댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글 2
댓글쓰기
계정을 선택하시면 로그인·계정인증을 통해
댓글을 남기실 수 있습니다.
이우호 2020-07-30 13:53:03
임영훈책임님 안녕하세요. 다름이 아니라, 제가 공공데이터에서 책임님께서 올려주신대로 따라했었는데요. 제는 api의 모든 데이터를 가져오고 싶으나(596,179개) 179개만 가져와지고(totaldata, xmldata 둘 다)
loopcount 숫자(1페이지 당 row 800 기준 746값 일치) 및 totalcount 개수(59만개)는 정상적으로 enviroment에 출력되나, totaldata, xmldata 가져올 때 179개만 가져와집니다. 잘못된 데이터를 view로 확인하면 596,001~596,179(179개)만 표시되요

용광성 2020-06-04 14:24:39
if(loopCount * numOfRows < totalCount) {loopCount <- lootCount + 1} 자꾸 인자의 길이가 0이라고 나오면서 에러가 나옵니다ㅠㅠ무슨 문제가 있을까요?ㅠㅠ