공공데이터 OpenAPI 활용하기
데이터 관련 공모전을 하다보면 주최측에서 제공하는 데이터에 추가적인 데이터가 필요한 경우가 있다. 많은 기업들이 데이터를 자산으로 여기고 데이터 공개를 꺼려하며 데이터를 공개하더라도 돈을 받고 파는 경우가 많다. 그래서 기업을 통해 데이터를 구하기란 참 어려운 일이다. 하지만 국가에서 제공하는 데이터의 경우 다양하고 양도 많은 데이터를 무료로 제공 받을 수 있다.
공공데이터 포털 (국가 기관에서 제공하는 다양한 데이터를 파일, OpenAPI 형태로 제공 받을 수 있다.
공공데이터 포털에서 제공하는 데이터는 크게 파일과 OpenAPI로 나눌 수 있다.
파일데이터의 경우 다운로드를 하면 주로 csv 파일 형태로 제공을 하기 때문에 엑셀을 이용하여 데이터를 살펴 볼 수 있다.
OpenAPI의 경우에는 API활용신청을 통해 필요한 데이터를 Request하고 json, xml 형태로 볼 수가 있다.
이 포스팅은 공공데이터 포털에서 OpenAPI를 활용하여 데이터에 접근하는 방법에 대해 알아보려 한다.
1. API 활용 신청하기
우선 구하고자 하는 데이터를 검색해보자.
대기오염으로 검색했을때 전체, 파일데이터, 오픈 API의 탭이 있는것을 확인 할 수 있다.
해당 탭을 클릭하면 OPEN API형태로 제공되는 데이터들을 확인 할 수 있다.
그 중 하나를 선택해서 활용 신청을 누르면 OPEN API API 인증키(SERVICE KEY)를 받을 수 있다.
API 인증키는 Encoding과 Decoding으로 나뉘는데 웹페이지에서 API를 바로 불러올때는 Encoding 인증키를 사용하고 파이썬으로 requests 라이브러리를 사용할 때는 Decoding 인증키를 사용한다.
서비스정보의 참고문서를 열어보면 여러가지 API 예시를 볼 수 있다.
요청메세지의 서비스키 부분을 API 인증키(Encoding)로 바꾼뒤 크롬, 엣지 등의 웹 브라우저의 주소창에 넣으면 API를 이용해 불러온 데이터를 확인 할 수 있다.
2. API로 데이터 불러오기
API로 데이터를 불러오기 위해서는 몇 가지 라이브러리가 필요하다
import requests
import xmltodict
import json
필요한 라이브러리들을 Input 해준다.
requests는 API를 콜할때 사용하고 xmltodict는 불러온 데이터를 dict 형태로 바꿔줄때 사용한다.
마지막으로 json 형태로 데이터를 변환하여 보기가 좋게 만들어 준다.
API_key = '이곳에는 부여받은 API 인증키(Decode)를 넣어준다.'
url = 'http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty'
params ={'stationName' : '종로구', 'dataTerm' : 'month', 'pageNo' : '1', 'numOfRows' : '100', 'returnType' : 'xml','serviceKey' : API_key}
# params은 서비스 정보에 있는 API 참고 문서를 활용하여 필요한 요청에 따라 부여한다.
response = requests.get(url, params=params)
url = f'http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?stationName=종로구&dataTerm=month&pageNo=1&numOfRows=100&returnType=xml&serviceKey={API_key}'
# url에 직접 변수들을 넣어서 데이터를 불러올 수도 있다.
response로 데이터를 받았으므로 response를 출력해보면
Response [200]이라는 메세지가 뜬것을 확인 할 수 있다. (Response 200은 요청이 성공했음을 나타내는 응답 상태 코드이다. )
response.text
xml type으로 데이터를 받아 왔는데 구분하기가 쉽지 않다.
xmltodict를 활용하여 데이터를 dict형태로 변경해 준다.
xmltodict.parse(response.text)
xml 형태로 필요한 부분의 데이터를 불러와서 사용할수 있다.
xmltodict.parse(response.text)['response']['body']['items']['item']
# reponse > body > items > item 속의 데이터를 확인.
dict 형태로 만들어주니 보기는 편하지만 조금 더 익숙한 json 으로 변경해 보자.
json.dumps(xmltodict.parse(response.text))
# json.dumps는 dict data를 json 형태로 변경해준다.
json file로 변경된 데이터를 다시 dict 형태로 변경해 보자
json.loads(json.dumps(xmltodict.parse(response.text)))
훨씬 구분해서 보기가 편하다.
여기서 필요한 정보는 body 내의 items > item 정보 이므로 해당정보를 가져와서 pandas를 이용해 DataFrame으로 만들어 보자.
data = json.loads(json.dumps(xmltodict.parse(response.text)))['response']['body']['items']
# items를 data 변수 안에 담아준다.
import pandas as pd
from pandas import json_normalize
json_normalize(data['item'])
# pandas의 json_normalize를 통해 item안의 데이터를 DataFrame으로만들어준다.
데이터가 데이터프레임으로 변경된 것을 확인 할 수 있다.
댓글남기기