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임.
※ 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) 다운로드
'코딩 연습' 카테고리의 다른 글
파이썬 크롬드라이버 자동설치 (chromedriver_autoinstaller) (0) | 2022.12.20 |
---|---|
문자열에 \xa0 있을 경우 제거하는 방법 (0) | 2022.12.02 |
엑셀 암호 해제 방법 - 파이썬으로 엑셀 암호 제거 프로그램 만들기 (0) | 2022.10.13 |
Pandas - 데이터 분석용 파이썬 라이브러리 "판다스" #1 (0) | 2022.10.08 |
엑셀 시트 분리 저장 - 엑셀 파일의 시트를 분리하여 저장하기 (2) | 2022.09.25 |
댓글