[Python]공공빅데이터API를 사용해보자

Ronie🌊·2021년 3월 24일
2

Python👨🏻‍💻

목록 보기
11/11

SQL공부용으로 DB데이터가 다양하게 필요했다.
흔하게 for문으로 가데이터를 입력해 사용할 수 도 있지만 나중에 머신러닝때도 사용할 수 있지않을까 해서
공공빅데이터 API를 사용해서 데이터를 가져와서 개인DB에 저장시키는 것을 해보기로 했다.


어떤 공공 빅데이터 API를 사용할까?
Python으로 API 적용하기


어떤 공공 빅데이터 API를 사용할까?

공공 빅데이터 API는 공공데이터포털에서 검색해보기로 했다.
네이버나 카카오톡으로 간단로그인이 가능해서 손쉽게 접근할 수 도 있고, 거의 오픈API의 기준이 되는 사이트이기 때문이다.

검색조건을 걸어서 검색해보면 생각보다 많은 수의 공공데이터 API가 있다.
나는 그중에 (보건의료, REST, XML) 로 검색해서 '건강보험심사평가원_병원평가결과정보조회서비스'를 사용해보기로 했다.
(개인적으로 JSON이 편한데, XML형식 데이터 수가 압도적으로 많아요!)
우선 테스트용 데이터로서 적당하기도 하고, 보건의료 관련 데이터로서는 가장 기초가 되는것이라고 판단했다.

우선 검색해서 들어가면 바로 사용할 순 없고 활용신청을 해야한다.
활용신청을 하면 활용목적이나 기능 등을 선택할 수 있다.
아래는 활용시 주의사항이다.

  • 공공데이터중 위치정보를 포함한 서비스를 사용하고자 하는 사업자는 '위치정보의 보호 및 이용 등에 관한 법률'에 따라 방송통신위원회에 '위치정보서비스 허가'를 받거나 '위치기반 서비스사업 신고'를 하여야 합니다.
  • 이에 해당하는 사업자인 경우에는 첨부파일에 '위치기반서비스사업신고필증'을 첨부해 주시기 바랍니다.
  • 활용신청 시 '위치기반서비스사업신고필증'이 등록되지 않으면 반려가 될 수 있으니 참고 하시기 바랍니다.

신청을 하면 바로 승인이 되는데, 활용하기까지는 1~2시간 정도 기다려야한다고 한다.

상세페이지에 가게되면 활용가이드와 인코딩 디코딩 인증키, endpoint를 확인 할 수 있다.
이를 일단 기억해두고 활용가이드를 살펴보자!

서비스 개요

서비스 개요이다. 보안이 딱히 없어서 간편하게 사용할 수 있을 것 같다.

조회 기능별로 요청 메시지 명세와 응답 메시지 명세를 확인 할 수 있다.
나중에 활용할때나 DB정의 할 때 요긴할 것 같다.


Python으로 API 적용하기

사실 적용하는 것은 아주 쉽습니다. python으로 api활용가이드에 나와있는 url에 양식에 맞춰 request를 보내기만 하면 됩니다.

우선 간단하게 python request라이브러리를 사용해서 값을 가져와 보겠습니다.
가장 기본이 되는 기준은 별다른 요청 파라미터가 필요하지 않기때문에 간단합니다.
아래와 같이 url을 지정해주고 키를 설정해주면 간단히 값을 불러올 수 있습니다.

그런데 몇번 해보니, 에러코드가 뜰때가 있더라구요.
에러코드 역시 api활용가이드에 나와있습니다.
저같은 경우는 03이 가끔뜨는데 해당 서버쪽 에러라고 하더라고요.
(서버가 불안정한건지...ㅠㅠ)

암튼! 다음 포스팅은 다른 종류의 데이터를 결과로 받아서 xml을 파싱해서 db에 넣는 것 까지 해보겠습니다!

  • python code
import urllib.request
import xml.dom.minidom

encodingKey = "{인코딩 인증키}"
decodingKey = "{디코딩 인증키}"

print("[START]")

# request url정의
url = "http://apis.data.go.kr/B551182/hospAsmRstInfoService/getHospAsmGrdCrtrList?ServiceKey=" + encodingKey + "&numOfRows=10&pageNo=1&asmItmCd=26"
request = urllib.request.Request(url)

# request보내기
response = urllib.request.urlopen(request)

# 결과 코드 정의
rescode = response.getcode()

if(rescode==200):
    response_body = response.read()
    dom = xml.dom.minidom.parseString(response_body.decode('utf-8'))
    pretty_xml_as_string = dom.toprettyxml()
    print(pretty_xml_as_string)
else:
    print("Error Code:" + rescode)

print("[END]")
  • 결과값
<?xml version="1.0" ?>
<response>
        <header>
                <resultCode>00</resultCode>
                <resultMsg>NORMAL SERVICE.</resultMsg>
        </header>
        <body>
                <items>
                        <item>
                                <asmDivNm>중환자실</asmDivNm>
                                <asmGrdCmmtTxt>요양병원은 중풍, 치매, 고혈압 등 노인성 질환과 만성질환자에 대한 의학적 치료 및 요양서비스를 제공하는 의료기관입니다. 따라서 적절한 인력을 갖추고 적정한 진료를 행하는 병원이 좋은 의료기관입니다.</asmGrdCmmtTxt>
                                <asmItmCd>26</asmItmCd>
                                <asmItmCdNm>중환자실</asmItmCdNm>
                                <asmRstGdTxt>평가결과는 5개 등급으로 나누어 공개합니다.&lt;br&gt;등급 숫자가 작을수록 중환자실 치료를 잘하는 병원입니다.</asmRstGdTxt>
                                <grd1CrtrTxt>종합결과가 95점 이상인 기관</grd1CrtrTxt>
                                <grd2CrtrTxt>종합결과가 75점 이상~95점 미만인 기관</grd2CrtrTxt>
                                <grd3CrtrTxt>종합결과가 55점 이상~75점 미만인 기관</grd3CrtrTxt>
                                <grd4CrtrTxt>종합결과가 35점 이상~55점 미만인 기관</grd4CrtrTxt>
                                <grd5CrtrTxt>35점 미만인 기관</grd5CrtrTxt>
                                <grdExsCrtrTxt>평가 대상건이 10건 미만인 기관</grdExsCrtrTxt>
                        </item>
                </items>
                <numOfRows>10</numOfRows>
                <pageNo>1</pageNo>
                <totalCount>1</totalCount>
        </body>
</response>

1개의 댓글

comment-user-thumbnail
2021년 8월 1일

막혀있던 부분인데 감사합니다!

답글 달기