본문 바로가기
코딩 연습

공동주택 단지코드(아파트 코드) 추출 - 파이썬 API 활용

by good4me 2022. 11. 30.

goodthings4me.tistory.com

공동주택 단지코드(아파트 코드)가 필요하여 공공데이터 포털(www.data.go.kr)에서 데이터를 추출하는 API 개발 언어 중 편리하다고 할 수 있는 파이썬(Python)을 통해 아파트 단지 목록과 단지 코드(공동주택 단지 코드)를 가져오는 코드를 만들어봤다.

 

 

공동주택 단지코드(아파트 코드) 추출

공공데이터포털에서 아파트 단지 정보 API 서비스(공동주택 기본 정보제공 서비스)의 항목들(아파트 단지명, 법정동 코드, 난방 방식, 동수, 아파트 세대수 데이터, 관리사무소 연락처(팩스 포함), 도로명주소, 법정동 주소, 호수, 관리방식, 복도 유형, 사용승인일, 전용면적별 세대 현황 등)을 추출하는 API를 확인해보니 해당 서비스를 조회할 때 기본적으로 입력되어야 하는 되는 것이 '아파트 코드'였고, 해당 API를 확인하니 총 18,900여 개가 있었다.

<numOfRows>10</numOfRows>
<pageNo>1</pageNo>
<totalCount>18900</totalCount>

국토교통부_전체 아파트 목록 샘플데이터에 인증키를 입력하고 미리보기에서 확인을 해보면, 위처럼 나오는데 totalCount 숫자가 18900임.

 

good4me.co.kr

 

API 요청을 통해 출력되는 결과(Response Element)

항목명(국문) 항목명(영문) 항목크기 항목구분 샘플데이터 항목설명
결과코드 resultCode 2 00 00:성공
결과메시지 resultMsg 20 NORMAL SERVICE 결과메시지
단지코드 kaptCode 9 A10027868 단지코드
단지명 kaptName 50 대구테크노폴리스 남해오네뜨1차 아파트 단지명
시도 as1 10 대구광역시 단지가   속한 시도
시군구 as2 10 달성군 단지가   속한 시군구
읍면동 as3 10 현풍읍 단지가   속한 읍면동
as4 10 중리 단지가   속한 리, 시도/시군구에 따라 존재하지 않을 수 있음
법정동코드 bjdCode 10 2771026522 법정동코드   10자리
열 갯수 numOfRows 3 10 열   갯수
페이지 수 pageNo 3 1 현재   페이지
전체 조회건수 totalCount 10 929 전체   조회건수

 

API 추출 소스코드

## 국토교통부_공동주택 단지 목록제공 서비스(공동주택인 아파트 단지코드 목록 조회)
# 전체 데이터 18,900개를 텍스트로 추출하는 코드임
import requests
import xmltodict
from svckey import *


def editError(row, e):
    with open('./apidata/Errors.txt', 'a') as f:
        f.write(f'Error row #{row} : {e}\n')    


def apt_danji_sigungu():
    url = 'http://apis.data.go.kr/1613000/AptListService2/getTotalAptList'
    params ={'serviceKey' : service_dkey, 'pageNo' : 1, 'numOfRows' : '19000'}
    response = requests.get(url, params=params)
    # print(response.content)  # ascii
    
    xml_data = response.content.decode('utf-8')
    # print(xml_data, type(xml_data))  # <class 'str'>

    parse_data = xmltodict.parse(xml_data)
    # print(parse_data, type(parse_data))  # <class 'dict'>

    items_list = parse_data['response']['body']['items']['item']  # dict 내 item key에 있는 값(List)
    # print(items_list)
    print(f'items_list type: {type(items_list)}\nlen(items_list): {len(items_list)}')  # <class 'list'>

    row = 1
    txt_insert = ''  # 추출 데이터 적재하는 변수
    for data in items_list:
        # print(data)
        sido = data['as1']
        try:
            sigungu = data['as2']  # 세종특별자치시 오류남
        except Exception as e:
            editError(row, e)
            sigungu = ''
        dongeupmyun = data['as3']
        try:
            ri = data['as4']  # '리'가 없는 경우
        except Exception as e:
            ri = ''

        # print(f"{row}\n{data['as1']}\n{data['as2']}\n{data['as3']}\n{ri}\n{data['kaptName']}\n{data['bjdCode']}\n{data['kaptCode']}")
        
        try:
            txt_insert += str(row) + '$' + sido + '$' + sigungu + '$' + dongeupmyun + '$' + ri + '$' + data['kaptName'] + '$' + str(data['bjdCode']) + '$' + data['kaptCode'] + '\n'
        except Exception as e: 
            # TypeError: string indices must be integers
            editError(row, e)
            continue
        row += 1

    with open('./apidata/공동주택_단지목록_Code.txt', 'a') as f:
        f.write(txt_insert)
        print(f'# 총 {row - 1}개 저장 완료!!')


apt_danji_sigungu()
  • serviceKey : 본인의 공공데이터 포털 API 키를 의미하며, 별도의 .py파일(모듈)로 만들어서 import 시켰음
  • params의 pageNo나 numOfRows 값을 변경하여 for문으로 처리도 가능하나 전체 데이터를 한번에 처리될 수 있도록 하였음
  • python 샘플 코드에 있는 print(response.content) 결과는 ascii 코드였고, 이를 디코딩(response.content.decode('utf-8'))한 후 다시  xmltodict 외부 라이브러리를 활용하여 dict 타입으로 변경함
  • 딕셔너리 결과를 보면, 찾는 값들이 ['response']['body']['items']['item']의 값에 있고,
  • 이를 for문을 통해서 하나씩 가져온 후 텍스트로 저장하였음
  • 여기서 오류가 2곳에서 발생하는데, 그 하나는 리(as4)의 값이 없는 경우이고, 또 하나는 세종특별자치시가 시도만 있고 시군구가 없기 때문에 에러가 발생하였는 바, 이를 확인하고 조치하기 위해 예외구문을 두었고, 오류 내용을 확인하기 위해서 함수 하나를 만들어서 오류내용을 저장하였음

위 코드를 수행하면, 공동주택_단지목록_Code.txt 파일과 오류로 인해 Errors.txt 파일이 생김

 

아파트 단지목록 및 단지코드(18,900개) 파일(Excel) 다운로드

 

 

댓글