반응형
2024.12.19 - [파이썬(Python)] - 파이썬-우편번호API 이용 우편번호 찾기(1)
이전 포스트에서 API 사용방법에 대해 작성하였고, 이번에는 실제 사용 예시에 대해 설명하고자 합니다.
개발 목적에 따라 변경하여 사용하면 되겠습니다.
1. 예시 내용
- 파이썬을 이용하여 대량의 주소지 정보를 엑셀파일 불러와서 우편번호 매칭 작업
- 매칭된 결과를 다시 엑셀로 저장하기
2. 기능 구현 사항
- 기본 라이브러리 설정
- API 조회 함수 만들기
- api_key, url 등록
- params 에 주소 정보만 변경하여 호출
- requests.get 이용하여 API 호출 : 기본적으로 데이터 수신을 대기하나 timeout 옵션 지정가능
요청시간 초과를 알수 있도록 except 에 오류 문구 표출 - return 값이 XML 이므로 ET.transforming 으로 변환 작업 수행
- for문으로 필요한 정보 추출
- 우편번호 수신한 데이터가 있으면 pandas dataframe 으로 변환
- 이번 예제에서는 우편번호만 추출하므로 맨 첫번째 우편번호만 추출 (df['zipNo'].iloc[0])하여 리턴함
- 우편번호 매칭 작업
- api 테스트 수행시 실제 우편번호 있는 주소지인데 매칭 실패인 경우 발생되어
매칭된 주소지만 반복하여 호출하는 구조로 작성 - 예제에서는 2번 반복 조회 하여 매칭안된 것만 별도로 재매칭하고
매칭된 결과는 기존 데이터프레임에 업데이트 하도록 구성함
- api 테스트 수행시 실제 우편번호 있는 주소지인데 매칭 실패인 경우 발생되어
- 매칭된 결과에서 매칭된 것과 안된 것 구분하여 엑셀저장
- 실제 작업한 데이터 전체
- 우편번호 매칭된 주소
- 우편번호 매칭실패된 주소
- 구분하여 저장하여 검증 및 사용할 수 있도록 함
반응형
3. 코드 구성
import pandas as pd
import openpyxl
import requests
import xml.etree.ElementTree as ET
def get_postal_code(addr):
api_key = 'qJiLryXb1rFJAtHuufYhpkeAh/yU37IbGShamVEhpP8MT380SmqcJJumWqId8d'
url = 'http://openapi.epost.go.kr/postal/retrieveNewAdressAreaCdSearchAllService/retrieveNewAdressAreaCdSearchAllService/getNewAddressListAreaCdSearchAll'
params ={'serviceKey' : api_key, 'srchwrd' : addr, 'countPerPage' : '10', 'currentPage' : '1' }
try:
response = requests.get(url, params=params, timeout=3)
except requests.Timeout:
print('요청시간 초과')
root = ET.fromstring(response.content)
parsed_data = []
for item in root.findall(".//newAddressListAreaCdSearchAll"):
zip_no = item.find("zipNo").text
lnm_adres = item.find("lnmAdres").text
rn_adres = item.find("rnAdres").text
parsed_data.append({"zipNo": zip_no, "lnmAdres": lnm_adres, "rnAdres": rn_adres})
if len(parsed_data) > 0:
df = pd.DataFrame(parsed_data)
# print(df.head(10))
return df['zipNo'].iloc[0]
return None
df = pd.read_excel("raw_postal_codes.xlsx")
print(df.shape)
# 반복 조회 횟수 지정
max_retries = 2
df['우편번호'] = None
for attempt in range(max_retries):
# 우편번호가 없는 행 추출
rows_without_postal_code = df[df['우편번호'].isnull()]
if rows_without_postal_code.empty:
break
# API 호출
rows_without_postal_code['우편번호'] = rows_without_postal_code['주소'].apply(get_postal_code)
# 결과 업데이트
df.update(rows_without_postal_code)
print(attempt, df.shape)
# 결과 저장
rows_with_postal_code = df[df['우편번호'].notnull()]
rows_without_postal_code = df[df['우편번호'].isnull()]
rows_with_postal_code.head(20)
df.to_excel("total_postal_codes.xlsx", index=False)
rows_with_postal_code1.to_excel("rows_with_postal_codes.xlsx", index=False)
rows_without_postal_code1.to_excel("rows_without_postal_codes.xlsx", index=False)
이번은 대량 작업으로 만들었는데 웹이나 앱에서 주소입력하여 우편번호 조회하는 경우는 입력하는 주소지 정보에 따라 많은 페이지가 나올 수 있으니 화면에서 pagenation 기능으로 페이지번호별 API 를 재호출하여 불러와서 리스트를 보여주고 고객이 선택할 수 있도로 기능을 만들면 될 것 같습니다.
반응형
'리액트(React)' 카테고리의 다른 글
구글 파이어베이스 스토리지에서 이미지 관리(1) (0) | 2025.01.16 |
---|---|
리액트 성능최적화 하기 - useMemo, useCallback (1) | 2024.11.17 |
React Native - 외부글꼴 사용 및 전역 색상관리하기 (0) | 2024.11.16 |
Expo Splash Screen 만들기 (0) | 2024.11.15 |
React Native - 기본 Template Component 만들기(3) (1) | 2024.11.13 |