파이썬은 인기가 많은 언어입니다. 저와는 인연이 없어서 사용할 일이 없었는데 요즘 인공지능에 대한 관심이 많아지고 회사에서도 파이썬을 이용하는 개발자분들이 증가하고 있어 저도 준비를 해야겠다는 생각에 파이썬 개발환경을 구축해 보고자 합니다. 인터넷 시용이 제한 되는 환경이라면 파이썬 패키지를 다운로드 받거나 업데이트는 진행할수 있습니다. 이때 사용할수 있는 방법이 인터넷이 되는 환경에서 아나콘다 의 conda 시스템을 통해서 패키지를 업데이트한후 전체를 압축한후 사용하면 인터넷 사용 제한에 따른 문제를 해결할수 있습니다. 이에 저는 아나콘다를 사용합니다.
파이썬(python) + 오픈 API(open api) 를 이용한 아파트 매매 실거래 가격 가져오기
공공데이터 open api 이용하기
공공데이터 포털https://www.data.go.kr/라는 곳이 있습니다. 공공기관이 생성 또는 취득하여 관리하고 있는 공공데이터를 한 곳에서 제공하는 통합 창구 이며 국민이 쉽고편리하게 공공데이터를 이용할 수 있도록 파일데이터, 오픈API, 시각화 등 다양한 방식으로 제공하고 있으며, 누구라도 쉽고 편리한 검색을통해 원하는 공공데이터를 빠르고 정확하게 찾을 수 있는 곳입니다.
가져온 데이터를 데이터 베이스화 하기 위해 BeautifulSoup,Pandas란 라이브러리를 사용하겠습니다. BeautifulSoup 은 HTML 및 XML 파일에서 원하는 데이터를 손쉽게 Parsing 할 수 있는 Python 라이브러리 이며 Pandas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며 보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 도구 입니다.
api에서 인자로 넘겨줘야 될 법정코드(LAWD_CD)이 값을 알아야 되는데요.. 이값은 api설명문서에 있는http://code.go.kr을 통해서 데이터를 확보하겠습니다. 해당 사이트에 접속한후 자주 이용하는 코드 부분의 2번항목 법정동 메뉴를 클릭합니다.
법정동코드 전체 다운로드 버튼을 클릭하세요
다운로드 파일을 열어보면 아래와 같은 문자열로 구성되어 있습니다.
법정동코드 법정동명 폐지여부
1100000000 서울특별시 존재
1111000000 서울특별시 종로구 존재
1111010100 서울특별시 종로구 청운동 존재
...
1~3 번째 row까지 지우고 아래와 같은 형태로 변경합니다. 이렇게 변경하는 이유는 텍스트파일을 읽어서 Pandas dataframe형태로 변경한후 sqllite에 손쉽게 데이터를 넣기 위함입니다.
dong_cd do si my ri exyn
1111010100 서울특별시 종로구 청운동 존재
1111010200 서울특별시 종로구 신교동 존재
1111010300 서울특별시 종로구 궁정동 존재
1111010400 서울특별시 종로구 효자동 존재
1111010500 서울특별시 종로구 창성동 존재
1111010600 서울특별시 종로구 통의동 존재
1111010700 서울특별시 종로구 적선동 존재
1111010800 서울특별시 종로구 통인동 존재
파일명을 cd.txt로 바꾸고 쥬피터 노트북에서 python코드 작성중인 곳에 적당한 폴더에 위치합니다.
아래와 같은 순서대로 코딩하겠습니다. 부동산 실거래 데이터가 언제부터 존재하는지 확인한 결과 2006년1월부터 데이터가 존재 했습니다. for문 사용해서 2006년 01월부터 2020년 07월 현재까지 모든 데이터를 가져오고 싶었지만 데이터량이 너무 많아서 데이터 베이스 구축할때 타임아웃이 발생하여 1년씩 데이터 베이스를 생성하겠습니다. 1년생성하고 또 1년생성하고 총 15번 정도 아래 코드를 실행하겠습니다. 아래 코드중 아래 4가지 변수값을 수정해서 데이터를 생성하시기 바랍니다.
sYear = 2011
eYear = 2011
sMonth = 1
eMonth = 12
코드 간단설명
법정동 정보 5자리를 distinct 해서 가져옵니다.
가져오고자 하는 년도를 입력합니다.
1~12월까지 데이터를 가져오도록 코드를 작성합니다.
import sqlite3
from bs4 import BeautifulSoup
import pandas as pd
import urllib.request
req = urllib.request
def getRTMSDataSvcAptTrade(LAWD_CD,DEAL_YMD,serviceKey):
url="http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade"
url=url+"?&LAWD_CD="+LAWD_CD
url=url+"&DEAL_YMD="+DEAL_YMD
url=url+"&serviceKey="+serviceKey
xml = req.urlopen(url)
result = xml.read()
soup = BeautifulSoup(result, 'lxml-xml')
items = soup.findAll("item")
aptTrade = pd.DataFrame()
for item in items:
dealAmount = item.find("거래금액").text
dealYear = item.find("년").text
dong = item.find("법정동").text
apartmentName = item.find("아파트").text
dealMonth = item.find("월").text
dealDay = item.find("일").text
areaForExclusiveUse = item.find("전용면적").text
regionalCode = item.find("지역코드").text
floor = item.find("층").text
try:
jibun = item.find("지번").text
except:
jibun = ""
try:
buildYear = item.find("건축년도").text
except:
buildYear = ""
temp = pd.DataFrame(([[dealAmount,buildYear,dealYear,dong,apartmentName,dealMonth,dealDay,areaForExclusiveUse,jibun,regionalCode,floor]]), columns=["dealAmount","buildYear","dealYear","dong","apartmentName","dealMonth","dealDay","areaForExclusiveUse","jibun","regionalCode","floor"])
aptTrade=pd.concat([aptTrade,temp])
aptTrade=aptTrade.reset_index(drop=True)
return aptTrade
con = sqlite3.connect("files/conn.db")
cursor = con.cursor()
sYear = 2011
eYear = 2011
sMonth = 1
eMonth = 12
rows = cursor.execute('''select distinct substr(dong_cd,0,6) from dong ''')
silTrade = pd.DataFrame()
for row in rows:
if row[0][2:3] != '0':
for i in range(sYear, eYear+1, 1):
for j in range(sMonth, eMonth+1, 1):
yy = str(i)
mm = str(j)
if(j < 10): mm = '0' + str(j);
temp = getRTMSDataSvcAptTrade(row[0],yy+mm,'인증키')
silTrade = pd.concat([silTrade,temp])
silTrade.to_sql('sil_trade',con,if_exists='append',index=False)
con.close()