부동산 API를 이용해서 데이터를 가져오는 간단한 예제입니다
우선 API를 사용하기 위해서는 공공데이터 포털 > 국토교통부 실거래가 정보 > '아파트 매매 실거래 상세자료' 활용 신청을 해야 합니다.
https://www.data.go.kr/dataset/3050988/openapi.do
정상적으로 활용 신청이 되면 '인증키' 를 발급받게 됩니다.
서비스의 기본 호출 URL은 아래와 같습니다.
필수 입력항목은 지역코드, 계약월, 인증키 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
이제 파이썬의 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월 실거래 데이터를 확인할 수 있습니다.
'개발 > 파이썬' 카테고리의 다른 글
[CREON PLUS API 활용] 기본 활용 샘플 코드 (4) | 2020.04.18 |
---|---|
[파이썬] 특정 버전 패키지 설치 (0) | 2020.02.29 |
[파이썬] urllib 사용시 urlopen error unknown url type: https 오류 처리 (2) | 2020.02.29 |
[파이썬] 여러 리스트를 하나로 합쳐주는 zip 함수 (0) | 2020.02.16 |
파이썬 아나콘다 32비트 설치/재설치 (4) | 2019.11.14 |
[파이썬] 딕셔너리를 이용한 카운팅, 정렬 예제 (2) | 2019.11.02 |
댓글