파이썬 오픈 API 도로명 주소 및 우편번호 조회서비스

공공데이터 포털 오픈 API를 이용한 도로명 주소 조회 및 우편번호 조회

우정사업본부에서는 도로명주소 체계로 변경되는 새 우편번호(2015.8.1 시행) 및 기존 우편번호 정보를 조회하는 기능의 오픈 API 서비스를 제공합니다.

오픈api 파이썬

구 지번 주소 입력 시 도로명 주소와 우편번호가 조회됩니다. 또는 도로명 주소를 입력하면 구 지번 주소와 우편 번호가 조회되며 우편 번호를 입력하면 구 지번 주소와 도로명 주소가 조회됩니다.

ServiceKey 코드와 잘 못된 curl 주소 때문에 몇 시간을 허비하게 돼서 저와 같은 분들이 있을 수 있을 것 같아 참고용으로 글을 남깁니다.

예제 코드 중 curl

# curl
'http://openapi.epost.go.kr/postal/retrieveNewAdressAreaCdService/retrieveNewAdressAreaCdService/getNewAddressListAreaCd?ServiceKey=서비스키&searchSe=dong&srchwrd=주월동 408-1&countPerPage=10¤tPage=1'

엔드(&)가 표시되어야 하는데 ¤ 이런 게 들어가 있습니다. &currentPage=1로 수정해야 합니다. 숨은 그림 찾기 같습니다.

ServiceKey(참고사항)

파이썬 requests 패키지 사용 시 나타나는 문제점(노드.JS에서 request모듈을 사용하는 경우도 해당)

다른 언어나 다른 패키지 모듈을 사용하는 경우에도 비슷할 것 같습니다.

발급받은 ServiceKey 코드가 인코딩 되어있습니다. 브라우저나 Postman에 주소를 그대로 넣을 경우 문제가 되지 않지만 쿼리스트링을 매개변수 형태로 넣을 경우 requests, request 패키지는 url 주소를 자동으로 인코딩하기 때문에 문제가 발생됩니다.

즉, 인코딩 된 ServiceKey 코드가 한 번 더 인코딩 되어 ServiceKey 코드에 변화가 생깁니다. 이 것을 방지하기 위해서 ServiceKey 코드를 디코딩 후 매개변수로 넣어 주어야 합니다.

해결방법(디코딩)

Python

service_key = '서비스키'
service_key_decode = requests.utils.unquote(service_key)

# 또는
import urllib

service_key = '서비스키'
service_key_decode = urllib.parse.unquote(service_key)

Node JS

const querystring = require("querystring")

const ServiceKey = '서비스키';
const serviceKeyDecode = querystring.unescape(ServiceKey);

파이썬 전체 코드

import requests
import xml.etree.ElementTree as ET

uri = 'http://openapi.epost.go.kr/postal/retrieveNewAdressAreaCdService/retrieveNewAdressAreaCdService/getNewAddressListAreaCd'
service_key = '서비스키'
service_key_decoding = requests.utils.unquote(service_key)

print('=============== 도로명 주소 & 지번 주소 & 우편번호 =======================')
print('1. 지번으로 검색\n2. 도로명으로 검색\n3. 우편번호\n')

select = input('검색 방법 선택 : ')

if select == '1':
    seach_se = 'dong'
    srchwrd = input('지번 입력(예: 주월동 408-1) : ')
elif select == '2':
    seach_se = 'road'
    srchwrd = input('도로명 입력(예: 서문대로 745) : ')
else:
    seach_se = 'post'
    srchwrd = input('우편번호 입력(예: 61725) : ')

payload = {'ServiceKey': service_key_decoding, 'searchSe': seach_se,
           'srchwrd': srchwrd, 'countPerPage': '10', 'currentPage': '1'}

resp = requests.get(uri, params=payload)
root = ET.fromstring(resp.text)

newAddressListAreaCd = root.findall("newAddressListAreaCd")

print('=============== 결과 출력 =======================')

for r in newAddressListAreaCd:
    print(f'우편번호 : {r.findtext("zipNo")}')
    print(f'도로명 주소 : {r.findtext("lnmAdres")}')
    print(f'지번 주소 : {r.findtext("rnAdres")}')
    print('--------------------------------------------------------------------')
반응형