본문 바로가기
리액트(React)

파이썬-우편번호API 이용 우편번호 찾기(2)

by 즐거운코딩 2024. 12. 20.
반응형

2024.12.19 - [파이썬(Python)] - 파이썬-우편번호API 이용 우편번호 찾기(1)

 

파이썬-우편번호API 이용 우편번호 찾기(1)

서비스 기능을 개발하거나 데이터 정제작업을 하는 과정에서 주소정보 기반으로 우편번호가 필요한 경우가 있습니다.어디서나 쉽게 보는 주소 검색으로 우편번호 찾기 기능을 파이썬으로 간단

peter-codinglife.tistory.com

 

 

이전 포스트에서 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번 반복 조회 하여 매칭안된 것만 별도로 재매칭하고
      매칭된 결과는 기존 데이터프레임에 업데이트 하도록 구성함
  • 매칭된 결과에서 매칭된 것과 안된 것 구분하여 엑셀저장
    • 실제 작업한 데이터 전체
    • 우편번호 매칭된 주소
    • 우편번호 매칭실패된 주소
    • 구분하여 저장하여 검증 및 사용할 수 있도록 함
반응형

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)

 

API 조회결과 데이터프레임

 

이번은 대량 작업으로 만들었는데 웹이나 앱에서 주소입력하여 우편번호 조회하는 경우는 입력하는 주소지 정보에 따라 많은 페이지가 나올 수 있으니 화면에서 pagenation 기능으로 페이지번호별 API 를 재호출하여 불러와서 리스트를 보여주고 고객이 선택할 수 있도로 기능을 만들면 될 것 같습니다.

반응형