본문 바로가기
개발/파이썬

[파이썬] 부동산 API로 아파트 매매 실거래가 구하기

by esstory 2020. 2. 28.

부동산 API를 이용해서 데이터를 가져오는 간단한 예제입니다 

우선 API를 사용하기 위해서는 공공데이터 포털 > 국토교통부 실거래가 정보 > '아파트 매매 실거래 상세자료' 활용 신청을 해야 합니다.

https://www.data.go.kr/dataset/3050988/openapi.do

정상적으로 활용 신청이 되면 '인증키' 를 발급받게 됩니다. 

 

서비스의 기본 호출 URL은 아래와 같습니다.

http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev

필수 입력항목은 지역코드, 계약월, 인증키 3가지네요

 

위 정보를 이용해 호출정보를 아래처럼 구성합니다.

여기서 서비스키는 각자 받은 인증키를 사용해야 합니다.

serviceKey = '발급받으신 인증키를 여기에 넣어 주세요'
ymd = '202002'
landcode = '11440'
numrow = 1000
url = f'http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev?LAWD_CD={landcode}&DEAL_YMD={ymd}&serviceKey={serviceKey}&numOfRows={numrow}'

 

계약월은 2020년 2월(202002)로 했습니다. 

지역코드는 숫자 5자리인데요 '11440' 은 서울 마포구입니다. 모든 지역은 아래 링크에서 확인할 수 있습니다.

https://github.com/drtagkim/kor_gg_code/blob/master/region_code5.csv

 

drtagkim/kor_gg_code

한국코드데이터. Contribute to drtagkim/kor_gg_code development by creating an account on GitHub.

github.com

이제 파이썬의 urllib을 이용해 URL 을 호출하고, 이를 XML 파서를 통해 분해합니다 

데이터는 'item' 배열로 들어 있기 때문에 soup.findAll('item')으로 모든 item 리스트를 배열로 받아 옵니다.

res = urllib.request.urlopen(url)
result = res.read()
soup = BeautifulSoup(result, 'lxml-xml')
items = soup.findAll('item')

keylist = [
    '거래금액',
    '건축년도',
    '년',
    '도로명',
    '도로명건물본번호코드',
    '도로명건물부번호코드',
    '도로명시군구코드',
    '도로명일련번호코드',
    '도로명코드',
    '법정동',
    '법정동본번코드',
    '법정동부번코드',
    '법정동시군구코드',
    '법정동읍면동코드',
    '법정동지번코드',
    '아파트',
    '월',
    '일',
    '전용면적',
    '지번',
    '지역코드',
    '층',    
]



itemList = []

for v in items:
    item = {}

    for key in keylist :      
        # print(key)          
        item[key] = v.find(key).text

    item['매매일'] = int(item['년']) * 10000 + int(item['월']) * 100 + int(item['일'])
    item['거래금액'] = int(item['거래금액'].replace(',', ''))
    item['전용면적'] = float(item['전용면적'])
    item['층'] = int(item['층'])
    item['건축년도'] = int(item['건축년도'])
    itemList.append(item)

수신받은 데이터 중 원하는 포맷으로 변경(매매일, 숫자 등을 숫자로 변환)했습니다 

이건 편하신대로 하면 됩니다

 

이제 가져온 데이터를 엑셀로 내보냅니다 

처음에는 데이터 확인 차 엑셀로 하지만, 결국 DB를 이용해 저장해야 제대로 데이터를 확인할 수 있습니다 

또한 데이터 조회가 하루 1,000건 제한이라, 호출 회수를 줄이기 위해서라도 DB저장이 정답입니다 

def exportExcel2(itemList, fileName):
    
    writer = pd.ExcelWriter(fileName, engine='xlsxwriter')
    df = pd.DataFrame(columns=itemList[0])

    for data in itemList:
        item = data

        df.loc[len(df)] = data

        print(item)

    ###########################################
    # 매매일 역순으로 정렬
    df = df.sort_values(by='매매일', ascending=False)
    # Convert the dataframe to an XlsxWriter Excel object.
    df.to_excel(writer, sheet_name='마포구')
    # Close the Pandas Excel writer and output tdf = df.sort_values(by='통합순위')he Excel file.
    writer.save()
    os.startfile(fileName)
    return

 

전체 코드입니다. 

# Landapitest.py
# 요약: 부동산 api 이용, 단순 테스트 

import os
import pandas as pd
import urllib.request
from requests import get
from bs4 import BeautifulSoup


serviceKey = '본인의 인증키는 여기 넣어주세요'
ymd = '202002'
landcode = '11440'
numrow = 1000
url = f'http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev?LAWD_CD={landcode}&DEAL_YMD={ymd}&serviceKey={serviceKey}&numOfRows={numrow}'



def exportExcel2(itemList, fileName):
    
    writer = pd.ExcelWriter(fileName, engine='xlsxwriter')
    df = pd.DataFrame(columns=itemList[0])

    for data in itemList:
        item = data

        df.loc[len(df)] = data

        print(item)

    ###########################################
    # 매매일 역순으로 정렬
    df = df.sort_values(by='매매일', ascending=False)
    # Convert the dataframe to an XlsxWriter Excel object.
    df.to_excel(writer, sheet_name='마포구')
    # Close the Pandas Excel writer and output tdf = df.sort_values(by='통합순위')he Excel file.
    writer.save()
    os.startfile(fileName)
    return

print(url)


res = urllib.request.urlopen(url)
result = res.read()
soup = BeautifulSoup(result, 'lxml-xml')
items = soup.findAll('item')

keylist = [
    '거래금액',
    '건축년도',
    '년',
    '도로명',
    '도로명건물본번호코드',
    '도로명건물부번호코드',
    '도로명시군구코드',
    '도로명일련번호코드',
    '도로명코드',
    '법정동',
    '법정동본번코드',
    '법정동부번코드',
    '법정동시군구코드',
    '법정동읍면동코드',
    '법정동지번코드',
    '아파트',
    '월',
    '일',
    '전용면적',
    '지번',
    '지역코드',
    '층',    
]



itemList = []

for v in items:
    item = {}

    for key in keylist :      
        # print(key)          
        item[key] = v.find(key).text

    item['매매일'] = int(item['년']) * 10000 + int(item['월']) * 100 + int(item['일'])
    item['거래금액'] = int(item['거래금액'].replace(',', ''))
    item['전용면적'] = float(item['전용면적'])
    item['층'] = int(item['층'])
    item['건축년도'] = int(item['건축년도'])
    itemList.append(item)


exportExcel2(itemList, 'd:\\dnld\\landlist.xlsx')

 

마지막  코드에서 수신받은 데이터를 D:\DNLD 폴더에 수신 받은 데이터를 엑셀로 저장했습니다 

엑셀을 확인해 보시면 매매일 역순으로 정렬된 마포구의 2020년 2월 실거래 데이터를 확인할 수 있습니다.

댓글