국토부 분양권 실거래가 데이터를 불러오는 파이썬 코드

국토부 분양권 실거래가 데이터를 불러오는 파이썬 코드

부동산 시장을 분석할 때 가장 중요한 데이터 중 하나는 실거래가 정보입니다. 본 글에서는 국토부 API를 활용하여 특정 기간 동안의 분양권 실거래가 데이터를 불러오는 방법을 소개합니다.

1. 국토부 API란?

국토교통부에서 제공하는 실거래가 정보 공개 API를 활용하면 원하는 지역과 기간을 설정하여 분양권 실거래가 데이터를 불러올 수 있습니다. 이 데이터는 실시간으로 갱신되며, 부동산 시장 분석에 필수적인 자료입니다.

2. 파이썬 코드 개요

이 파이썬 코드에서는 다음과 같은 기능을 수행합니다:

사용자가 원하는 기간(년/월)을 입력하면 해당 기간 동안의 데이터를 가져옴

국토부 API를 호출하여 데이터 수집

데이터를 정리 및 가공하여 엑셀 파일로 저장

엑셀 파일을 자동으로 서식 적용 후 저장

3. 파이썬 코드 상세 설명

3.1 필요한 라이브러리 설치

from urllib.request import Request, urlopen
from urllib.parse import urlencode, quote_plus
from datetime import datetime
from dateutil.relativedelta import relativedelta
import openpyxl
import os
import json
import xmltodict
import pandas as pd
from openpyxl.styles import Border, Side, Font, Alignment

위 코드에서는 데이터 요청, 날짜 처리, 엑셀 저장 및 스타일 적용을 위한 라이브러리를 사용합니다.

3.2 국토부 API 호출 함수

def molit_public_api(key, rcode, dealdate):
    try:
        base = "http://apis.data.go.kr/1613000/RTMSDataSvcSilvTrade/getRTMSDataSvcSilvTrade?"
        parameters = "serviceKey=%s&" % (key) + urlencode({
            quote_plus('LAWD_CD'): rcode,
            quote_plus('DEAL_YMD'): str(dealdate),
            quote_plus('numOfRows'): str(9999)}, encoding='UTF-8')

        url = base + parameters
        request = Request(url)
        response = urlopen(request)
        rescode = response.getcode()
        if rescode == 200:
            response_body = response.read().decode('utf-8')
        else:
            print('Error code:', rescode)
            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 occurred:', str(e))
        return None

👉 이 함수는 API를 호출하여 해당 지역의 분양권 실거래 데이터를 가져오는 역할을 합니다.

3.3 사용자 입력 및 데이터 수집

start_year = input("시작 연도를 입력하세요 (예: 2024): ")
start_month = input("시작 월을 입력하세요 (예: 02): ")
end_year = input("종료 연도를 입력하세요 (예: 2024): ")
end_month = input("종료 월을 입력하세요 (예: 10): ")

사용자로부터 데이터를 조회할 기간(년/월)을 입력받습니다.

def get_yearmonth_list(start_year, start_month, end_year, end_month):
    init_yearmonth = datetime.strptime(f"{start_year}{start_month}", "%Y%m").date()
    end_yearmonth = datetime.strptime(f"{end_year}{end_month}", "%Y%m").date()
    year_months = []
    while init_yearmonth <= end_yearmonth:
        year_months.append(init_yearmonth)
        init_yearmonth += relativedelta(months=1)
    return year_months

위 함수는 입력한 기간의 모든 연월 목록을 생성하여 데이터 요청 시 활용합니다.

3.4 데이터 수집 및 엑셀 저장

final_df = pd.DataFrame()
for year_month in year_months:
    try:
        yearmonth = year_month.strftime("%Y%m")
        df_molit_api = molit_public_api(molit_serviceKey, rcode='지역코드입력', dealdate=yearmonth)
        if df_molit_api is not None:
            selected_columns = ['umdNm', 'aptNm', 'floor', 'excluUseAr', 'dealYear', 'dealMonth', 'dealDay', 'dealAmount', 'dealingGbn']
            df_selected = df_molit_api[selected_columns]
            final_df = pd.concat([final_df, df_selected], ignore_index=True)
            print(f"{yearmonth} 데이터가 수집되었습니다.")
        else:
            print(f"{yearmonth}: 조회 가능한 데이터가 없습니다.")
    except Exception as e:
        print(f"에러 발생: {str(e)}")

👉 API를 호출하여 수집한 데이터를 정리하고, 원하는 컬럼만 선택하여 최종 데이터프레임에 추가합니다.

final_df.to_excel(final_filename, index=False, engine='openpyxl')
wb = openpyxl.load_workbook(final_filename)
ws = wb.active
thin = Side(style='thin')
border = Border(left=thin, right=thin, top=thin, bottom=thin)
font = Font(name='맑은 고딕', size=11)
alignment = Alignment(horizontal='center')
for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
    for cell in row:
        cell.border = border
        cell.font = font
        cell.alignment = alignment
wb.save(final_filename)

👉 엑셀 파일을 저장할 때 가독성을 높이기 위해 서식을 적용합니다.

4. 결론

이 코드를 실행하면 원하는 기간 동안의 분양권 실거래가 데이터를 자동으로 수집하고, 정리하여 엑셀 파일로 저장할 수 있습니다. 📊

국토부 API를 활용한 부동산 데이터 수집을 자동화할 수 있으며, 추가적인 분석 및 가공도 가능합니다.

✅ 이 데이터를 활용하여 부동산 트렌드 분석, 투자 전략 수립, 가격 변동성 파악 등이 가능합니다.

👉 앞으로 국토부 API를 활용한 심화 데이터 분석 방법도 다뤄볼 예정이니, 관심 있으시면 댓글과 공유 부탁드립니다! 😊

 
 

전체코드입니다.

 
from urllib.request import Request, urlopen
from urllib.parse import urlencode, quote_plus
from datetime import datetime
from dateutil.relativedelta import relativedelta
import openpyxl
import os
import json
import xmltodict
import pandas as pd
from openpyxl.styles import Border, Side, Font, Alignment
 
 
# 서비스키 설정 (발급받은 서비스키 입력)
molit_serviceKey = ‘발급받은 서비스키 입력’
# 국토부 API 호출 함수
def molit_public_api(key, rcode, dealdate):
    try:
        base = “http://apis.data.go.kr/1613000/RTMSDataSvcSilvTrade/getRTMSDataSvcSilvTrade?”
        parameters = “serviceKey=%s&” % (key) + urlencode({
            quote_plus(‘LAWD_CD’): rcode,
            quote_plus(‘DEAL_YMD’): str(dealdate),
            quote_plus(‘numOfRows’): str(9999)}, encoding=’UTF-8′)
 
        url = base + parameters
        request = Request(url)
        response = urlopen(request)
        rescode = response.getcode()
        if rescode == 200:
            response_body = response.read().decode(‘utf-8’)
        else:
            print(‘Error code: ‘ + str(rescode))
            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 occurred:’, str(e))
        return None
 
# 연도와 월 리스트를 생성하는 함수
def get_yearmonth_list(start_year, start_month, end_year, end_month):
    init_yearmonth = datetime.strptime(f”{start_year}{start_month}”, “%Y%m”).date()
    end_yearmonth = datetime.strptime(f”{end_year}{end_month}”, “%Y%m”).date()
    year_months = []
 
    while init_yearmonth <= end_yearmonth:
        year_months.append(init_yearmonth)
        init_yearmonth += relativedelta(months=1)
 
    return year_months
 
# 사용자로부터 시작 연도와 종료 연도 입력 받기
start_year = input(“시작 연도를 입력하세요 (예: 2024): “)
start_month = input(“시작 월을 입력하세요 (예: 02): “)
end_year = input(“종료 연도를 입력하세요 (예: 2024): “)
end_month = input(“종료 월을 입력하세요 (예: 10): “)
# 연도와 월 리스트 생성
year_months = get_yearmonth_list(start_year, start_month, end_year, end_month)
# 현재 작업 디렉토리 경로 설정
dirname = os.getcwd()  # 현재 작업 디렉토리 가져오기
# 최종 데이터프레임 초기화
final_df = pd.DataFrame()
# 각 월에 대한 데이터 수집
for year_month in year_months:
    try:
        yearmonth = year_month.strftime(“%Y%m”)
 
        # API를 호출하여 데이터를 가져옴
        df_molit_api = molit_public_api(molit_serviceKey, rcode=’지역코드입력’, dealdate=yearmonth)  #지역변경
 
        # 데이터가 존재하면 최종 데이터프레임에 추가
        if df_molit_api is not None:
            # 원하는 컬럼만 선택
            selected_columns = [‘umdNm’, ‘aptNm’, ‘floor’, ‘excluUseAr’, ‘dealYear’, ‘dealMonth’, ‘dealDay’, ‘dealAmount’, ‘dealingGbn’ ]
            df_selected = df_molit_api[selected_columns]
            final_df = pd.concat([final_df, df_selected], ignore_index=True)
            print(f”{yearmonth} 데이터가 수집되었습니다.”)
        else:
            print(f”{yearmonth}: 조회 가능한 데이터가 없어 수집할 수 없습니다.”)
    except Exception as e:
        print(f”에러 발생: {str(e)}”)
# 한글 컬럼 이름으로 변경
if not final_df.empty:
    final_df.columns = [‘읍면동명’, ‘아파트명’,’층수’, ‘전용면적’,’거래년도’, ‘거래월’,  ‘거래일’, ‘거래금액’,’거래구분’ ]
 
    # 거래월이 숫자가 아닌 경우 숫자로 변환
    final_df[‘거래월’] = pd.to_numeric(final_df[‘거래월’], errors=’coerce’)
    # 거래월을 한 자리 숫자일 경우 앞에 0을 붙이고, 두 자리 숫자는 그대로 유지
    final_df[‘거래월’] = final_df[‘거래월’].apply(lambda x: f'{int(x):02}’ if x < 10 else str(int(x)))
    # 거래일을 정수형으로 변환하고, 한 자리 숫자일 경우 앞에 0을 붙임
    final_df[‘거래일’] = pd.to_numeric(final_df[‘거래일’], errors=’coerce’)  # 거래일을 숫자로 변환
    final_df[‘거래일’] = final_df[‘거래일’].apply(lambda y: f'{int(y):02}’ if y < 10 else str(int(y)))
    # 아파트명 내림차순, 거래월 내림차순 정렬
    final_df = final_df.sort_values(by=[‘아파트명’, ‘거래월’, ‘거래일’], ascending=[True, False, False])
    # 엑셀 파일 이름에 시작 년월과 마지막 년월 포함
    final_filename = os.path.join(
        dirname,
        f’국토부_분양권_데이터_{start_year}{start_month}_{end_year}{end_month}.xlsx’
    )  # 엑셀 파일 이름 설정
    # 최종 데이터를 하나의 엑셀 파일로 저장
if not final_df.empty:
    final_filename = os.path.join(dirname, f’분양권_실거래데이터_{start_year}{start_month}_{end_year}{end_month}.xlsx’)  # 엑셀 파일 이름 설정
    final_df.to_excel(final_filename, index=False, engine=’openpyxl’)  # 엑셀로 저장
    # 저장한 엑셀 파일 열기
    wb = openpyxl.load_workbook(final_filename)
    ws = wb.active
    # 테두리 스타일 설정
thin = Side(style=’thin’)
border = Border(left=thin, right=thin, top=thin, bottom=thin)
# 글꼴 설정 (고딕체)
font = Font(name=’맑은 고딕’, size=11)  # ‘Malgun Gothic’이 일반적인 고딕체입니다.
# 정렬 설정 (가운데 정렬)
alignment = Alignment(horizontal=’center’)
# 테두리 및 셀 크기 조정
for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
    for cell in row:
        cell.border = border  # 테두리 적용
        cell.font = font  # 글꼴 적용
        cell.alignment = alignment  # 가운데 정렬 적용
 
        # 셀의 크기를 글자 수에 맞춰 수동으로 조정
        if cell.value:
            max_length = max(len(str(cell.value)), 10)  # 최소 너비를 10으로 설정
            ws.column_dimensions[cell.column_letter].width = max_length
# 아파트명 열 너비 조정
apt_nm_col_letter = ‘B’  # ‘aptNm’이 두 번째 열이라고 가정
max_length_apt_nm = max(final_df[‘아파트명’].apply(lambda x: len(str(x))))  # 아파트명 최대 길이 계산
ws.column_dimensions[apt_nm_col_letter].width = max_length_apt_nm + 20  # 여유 공간 추가
# 변경된 내용 저장
wb.save(final_filename)
print(f”모든 데이터가 {final_filename}에 저장되었습니다.”)