정리용

[openAPI] 공공데이터 - 건축물대장정보 (xmltodict) 본문

프로젝트

[openAPI] 공공데이터 - 건축물대장정보 (xmltodict)

무룡룡 2022. 2. 10. 16:41

0. 준비물

 

(1) 시군구 / 법정동 코드 정보 

 

https://www.code.go.kr/index.do

 

행정표준코드 관리시스템

 

www.code.go.kr

 

 

(2) 공공데이터 인증키

 

- 방법 생략 -

 

 

(3) 라이브러리 설치

!pip install xmltodict

 

 

 

 

 

 

 

1. 데이터 파악

 

공공데이터 활용신청 - 요청변수란

 

 

 

 

 

해당 페이지에서 Request시에 필수적으로 요청해야하는 항목을 파악한다

 

항목구분을 보면 시군구 코드(sigunguCd)와 법정동 코드(bjdongCd)가 필수임을 알 수있다.

 

추가적으로 모든 자료를 요청하기 위해 리스트수(numOfRows)도 같이 요청한다.

 

 

또한 해당 자료는 Json 이 제공되지 않고 xml 형태로만 제공되므로 xmltodict을 이용한다.

 

미리보기 디폴트로 제공되는 강남구 개포동을 불러온다.

 

 

 

import requests
import xmltodict
import json
from pandas import json_normalize
params ={'serviceKey' : 인증키,
         'sigunguCd' : '11680',
         'bjdongCd' : '10300',
         'numOfRows' : '10'}
response = requests.get(url, params=params)

contents = json.loads(json.dumps(xmltodict.parse(response.text), indent=3, ensure_ascii=False))
# body > items > item
df = json_normalize(contents["response"]["body"]["items"]["item"])
df
 
 
개포동 df.head(3)
 
 
 

 

 

2. 법정동 데이터 추출

(1) 시군구 / 법정동 코드 텍스트파일 불러오기

 

import pandas as pd
sdf = pd.read_csv('/content/drive/MyDrive/csv/법정동코드 전체자료.txt', sep = "\t",  engine='python', encoding = "cp949")

 

 

 

 

(2) 현재 존재하고 원하는 지역(서대문구)에 속한 데이터 필터링

sdf = sdf[sdf['폐지여부'] == '존재']
sdf_sdm = sdf[sdf['법정동명'].str.contains("서대문구")].reset_index(drop=True)
sdf_sdm

 

 

 

 

 

 

(3) 법정동코드 컬럼을 시군구, 법정동 컬럼으로 분리

sdf_sdm['법정동코드'] = sdf_sdm['법정동코드'].astype(str)
sdf_sdm['시군구'] = sdf_sdm['법정동코드'].apply(lambda x : x[:5])
sdf_sdm['법정동'] = sdf_sdm['법정동코드'].apply(lambda x : x[5:])
sdf_sdm
 
 
 
 
 
 
(4) 법정동 컬럼을 list 로 변환
 
lst_sdm = sdf_sdm['법정동'].tolist()
 
 
 
['00000', '10100', '10200', '10300', '10400', '10500', '10600', '10700', '10800', '10900', '11000', '11100', '11200', '11300', '11400', '11500', '11600', '11700', '11800', '11900', '12000']
 
 
 
 
 
 
 
 

3. openAPI 활용

 

 
import pandas as pd
import requests
import xmltodict
import json
from pandas import json_normalize



df_base= pd.DataFrame(columns=df.columns) # 여기서 df는 1번의 미리보기 df


# 앞서 추출한 법정동리스트(lst_sdm)을 이용한 반복문
for k in range (1,len(lst_sdm)) :
  print()
  params ={'serviceKey' : 인증키,
          'sigunguCd' : '11410',
          'bjdongCd' : lst_sdm[k],
          'numOfRows' : '10000'
  response = requests.get(url, params=params)

  contents = json.loads(json.dumps(xmltodict.parse(response.text), indent=3, ensure_ascii=False))
  # body > items > item
  df = json_normalize(contents["response"]["body"]["items"]["item"])
  df_base = pd.concat([df_base,df], ignore_index=True)
  print(df_base.shape, lst_sdm[k])
df_base

 

df_base.to_csv('건축물대장정보.csv',encoding='utf-8-sig',index=False)

 

 

 

23144 개의 행을 가지는 데이터 추출 성공

 

 

Comments