자기개발/데이터분석

[데이터분석] 국토부 아파트 실거래가 분석 - 2. 데이터 수집(1)

코대장 2021. 4. 1. 01:40
반응형

공공데이터 아파트 실거래 데이터 수집(1)

이전 글에서는 국토부 아파트 실거래가 수집에 앞서 공공데이터 계정 생성 및 서비스키 발급을 진행하였습니다.

1. 요청변수 확인

오픈API 참고문서 또는 미리보기 기능으로 제공되는것처럼 필수 요청변수는 아래와 같습니다.

  • LAWD_CD(각 지역별코드)
  • DEAL_YMD(월 단위 신고자료)
  • 그리고 발급받은 서비스키

보통 오픈API 활용을 위해 명세서(가이드)가 제공이 되며, 문서를 참고하여 개발을 하게 됩니다.

요청메시지 명세
응답메시지

2. python 활용한 데이터 수집

특정시점(예를들어 12년 7월)부터 현재까지 아파트 실거래 데이터를 수집하고 CSV파일로 저장하는 기능을 구현해 볼게요.

구글 코랩(colab)을 활용하며, 최종코드는 맨 아래 첨부파일로 올려드릴게요.

아래는 코드에 대한 설명을 같이 해드리겠습니다.

  • 국토부 아파트실거래 데이터의 경우 'xml'로 응답이 제공되며, DataFrame에 넣기 위해 json으로 변환을 하겠습니다.
 ! pip install xmltodict  # 국토부 실거래 데이터 xml -> json 변환

 

  • 필요한 라이브러리를 불러옵니다.
import os
import json
import xmltodict
import pandas as pd
from urllib.request import Request, urlopen
from urllib.parse import urlencode, quote_plus, quote
from datetime import datetime, date
from dateutil.relativedelta import relativedelta

 

  • 발급받은 서비스키를 입력하고, Request 모듈을 이용해서 호출합니다.
  • json.loads 를 통해 데이터를 json 형태로 불러와 DataFrame에 넣습니다.
molit_serviceKey = '발급받은서비스키입력'

Exception 처리 : 아직 실거래가 등록이 되지 않은 년월 조회할 때 None 리턴(업데이트: 2021.5.1.)

def molit_public_api(key, rcode, dealdate):
  try:
    # print(rcode, dealdate)
    base = "http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?"

    try:
      parameters = "serviceKey=%s&" % (key) + urlencode({quote_plus('LAWD_CD'): rcode, quote_plus('DEAL_YMD'): str(dealdate), quote_plus('numOfRows'): str(9999)}, encoding='UTF-8')
    except:
      return None
        
    url = base + parameters
    # print('url', url)

    request = Request(url)
    response = urlopen(request)
    rescode = response.getcode()
    # print(rescode)
    if rescode == 200:
      response_body = response.read().decode('utf-8')
    else:
      print('error code :' + rescode)

    if response_body == None:
      return None

    jsonData = json.loads(json.dumps(xmltodict.parse(response_body)))
    if jsonData['response']['body']['items'] is not None:
      df = pd.DataFrame(jsonData['response']['body']['items']['item'])
      return df
    else:
      return None

  except Exception as e:
    print('exception occur!', str(e))

 

  • 호출할 함수 구현은 완료 되었고, 다음은 데이터를 불러올 기간에 대한 설정입니다.
def get_yearmonth_list(year, month):
    this_yearmonth = date.today()
    init_yearmonth = datetime.strptime(year+month, "%Y%m").date()
    year_months = []
    while init_yearmonth <= this_yearmonth:
        year_months.append(init_yearmonth)
        init_yearmonth = init_yearmonth + relativedelta(months=1)
    return year_months
year_months = get_yearmonth_list(year='2021', month='2')

업데이트: 2021.5.1. 

Exception 처리 : 아직 실거래가 등록이 되지 않은 년월 조회할 때 None 리턴(업데이트: 2021.5.1.)

for year_month in year_months:
  try:
      dirname = '/content/drive/MyDrive/국토부_실거래'
      yearmonth = year_month.strftime("%Y%m") #202102
      
      filename = os.path.join(dirname, '{}.csv'.format(yearmonth))
      if not os.path.isfile(filename):
        df_molit_api = molit_public_api(molit_serviceKey, rcode='36110', dealdate=yearmonth)
        if df_molit_api is not None:
          df_molit_api.to_csv(filename, encoding='utf8', index=False)
        else:
          print(yearmonth, '조회 가능한 데이터가 없어 파일을 생성할 수 없습니다.')
      else:
        print(yearmonth, '이미 파일이 존재합니다.')
  except Exception as e:
    print(str(e))

 

  • 수집된 데이터 불러와 봅니다.
df = pd.read_csv('/content/drive/MyDrive/국토부_아파트실거래/202102.csv')
df.head()

구글 코랩으로 작성한 .ipynb 파일을 올려드립니다.

 

mskim8717/python-scripts

업무를 효율적으로 만들어줄 유용한 파이썬 스크립트 모음집. Contribute to mskim8717/python-scripts development by creating an account on GitHub.

github.com

 

국토부_오픈API_아파트실거래가_수집.ipynb
0.01MB

 

 

이상 끝.