[부동산 API2] 오픈API를 이용하여 부동산DB 만들기

2018. 2. 13. 06:30

이전 글에서 부동산 실거래가 데이터를 가져오기 위한 API가 공공데이터 포탈에서 있는 것을 확인했다. (참조: 공공데이터 활용하여 전월세 실거래가 가져오기)

오늘은 이 오픈API를 이용하여 부동산 전월세 거래 데이터를 데이터베이스 형태로 PC에 저장하려고 한다. 이전에도 블로글에 비슷한 유형의 작업을 포스팅을 해서 새로 설명할 내용은 없지만,  그래도 처음 보시는 분들도 있을 거라고 생각하고 작성하도록 하겠다. 오픈API를 활용한 작업이 더 궁금하다면 아래 링크를 참조해 보자. (참조: 오픈API로 할 수 있는 것은 어떤 것들이 있을까?)


전월세_실거래가_글



공공데이터 포탈에서 제공하는 url에 원하는 파라미터값을 입력해서 보내면, 원하는 데이터값을 xml형태로 리턴해 준다. 그러면 우리는 해당 결과값을 파싱해서 저장을 하면 된다.

전월세 거래 데이터의 url은 다음과 같다.

- http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptRent 


여기에 원하는 파라미터 값을 붙이면 된다. 해당 API에서 사용할 수 있는 파라미터 값은 년월, 지역코드, 행의 갯수로 총 3개이다. 차례대로 DEAL_YMD, LAWD_CD, numOfRows이다. 행의 갯수는 생략해도 데이터 수신은 가능했다. 그래서 중구, 2017년 10월 데이터를 가져온다고 했을 때 url은 아래와 같이 사용하면 된다.

- http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptRent?&LAWD_CD=11110&DEAL_YMD=201710&serviceKey=(제공받은 API키) 


해당 주소로 브라우저를 이용해 접속하면, 아래와 같은 데이터가 나온다.

회신데이터


이 데이터를 형식에 맞게 파싱해서 저장하면 되는데, 이 작업은 그 동안 많이 해서 코드를 남겨놓는 것으로 대체하도록 하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def collect_lent(ym,lawd_cd):
 
    API_KEY = (제공받은 API키)
 
    url="http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptRent"
 
    # &numOfRows=1000"+
    url=url+"?&LAWD_CD="+lawd_cd+"&DEAL_YMD="+ym+"&serviceKey="+API_KEY
 
    # webbrowser.open(url)
    resultXML = urlopen(url)
    result = resultXML.read()
    xmlsoup = BeautifulSoup(result, 'lxml-xml')
 
    te=xmlsoup.findAll("item")
 
    sil=pd.DataFrame()
 
    for t in te:
        build_y=t.find("건축년도").text
        year=t.find("년").text
        month=t.find("월").text
        day=t.find("일").text
        dong=t.find("법정동").text
        bo_price=t.find("보증금액").text
        mo_price=t.find("월세금액").text
        apt_nm=t.find("아파트").text
        size=t.find("전용면적").text
 
        try:
            jibun=t.find("지번").text
        except:
            jibun=""
 
        ji_code=t.find("지역코드").text
        floor=t.find("층").text
 
        temp = pd.DataFrame(([[build_y,year,month,day,dong,bo_price,mo_price,apt_nm,size,jibun,ji_code,floor]]), columns=["build_y","year","month","day","dong","bo_price","mo_price","apt_nm","size","jibun","ji_code","floor"])
 
        sil=pd.concat([sil,temp])
 
    sil=sil.reset_index(drop=True)
 
    return sil
    
cs


뒤에 for문을 이용해서  기간과 지역코드 값을 바꿔가면서 데이터를 가져오려고 함수 형태로 작성하였다.


금융데이터_파이썬


작업을 하다 보면 지역코드 때문에 어려움에 빠지게 된다. 지역코드가 우리가 아는 우편번호도 아니고 행정구역코드라고 해서 별도의 코드값이다. 찾기 좀 어려운 부분이 있어서 url을 남겨 놓았다. 이게 계속 업데이트 되고 있어, 최신 버전을 원하시면 행정안전부에서 검색해 보면 좋을 듯 하다.

- 지역코드 url: http://www.mois.go.kr/frt/bbs/type001/commonSelectBoardArticle.do?bbsId=BBSMSTR_000000000052&nttId=61552


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if __name__ == "__main__":
 
    # 지역코드 가져오기
    code=pd.read_excel("KIKcd_B.20180122.xlsx")
    code_seo=code[(code["시도명"]=="서울특별시"| (code["시도명"]=="경기도")]
    code_seo=code_seo[code_seo["읍면동명"].isnull()==True]
    code_seo = code_seo[code_seo["시군구명"].isnull() == False]
    code_seo["ji_code"= code_seo["법정동코드"].astype(str).str[0:5]
    sil_trade=pd.DataFrame()
 
    ym=list(["201701","201702","201703","201704","201705","201706","201707","201708","201709","201710","201711","201712","201801"])
 
    for m in ym:
        for co in code_seo["ji_code"]:
            temp=collect_lent(m,co)
            sil_trade=pd.concat([sil_trade,temp])
            print(co+", "+str(len(temp))+" is compleded")
        print("*"+str(m)+" is completed")
 
    con = sqlite3.connect("./data/real_trade.db")
    sil_trade.to_sql('lent', con, if_exists='append', index=False)
    con.close()
cs


위와 같이 실행하여 서울, 경기 지역의 17년 1월부터 18년 1월까지 전월세 실거래가 데이터를 가져오는데 성공하였다. 가지고 온 데이터는 sqlite를 통해서 데이터베이스 형태로 저장하였다. 수집한 데이터를 가지고 서울, 경기 지역의 전월세 실거래가를 비교해보았다. 자세한 내용은 아래 포스팅을 참조하기 바란다.
( 참조: [부동산 API3] 전월세 실거래가 현황(17년1월~18년1월, 서울&경기지역) 분석하기 )


위에서는 API를 이용해 부동산 데이터를 수집하는 방법을 다루었다. 하지만, 최근에 더 쉽게 부동산 관련 데이터를 수집할 수 있는 방법을 알았다. 파이썬 패키지를 이용하는 방법이고, 자세한 내용은 아래 포스팅 3-2)를 참조하기 바란다.
( 참조: 가장 쉬운 아파트 실거래가 조회하고, 데이터 수집하는 방법은?! )


오픈API를 사용하면 다양한 재미있는 일들을 해 볼 수 있다. 파이썬을 활용한 오픈API 사용이 궁금하다면 아래 글을 참조해보자.
(참조: 오픈API를 활용한 사례는 어떤 것들이 있을까?)


이 글 공유하기




댓글()
  1. JUNHO 2018.10.31 21:37 댓글주소  수정/삭제  댓글쓰기

    실거래가 정보를 제공하는 웹사이트를 예제삼아 만들어보려하는데 많은 도움이 되었습니다.
    제가 초보라 잘 몰라서 여쭤봅니다만, 글 중간에 제공해주신 소스코드를 어디에 입력하고 실행해야 되는건가요? 전국의 토지 실거래가 정보를 저장하고싶습니다.

    • Favicon of https://tariat.tistory.com BlogIcon 테리엇 2018.11.04 20:27 신고 댓글주소  수정/삭제

      중간에 있는 코드는 main앞에 작성하시면 됩니다. main에서 사용할 부분을 함수로 작성한 겁니다.
      실거래가 정보 제공 웹싸이트라 멋진 주제네요. 자주 오셔서 진행상황도 공유해주시면 좋겠네요. 감사합니다.^^

  2. 까치 2019.12.06 17:27 댓글주소  수정/삭제  댓글쓰기

    위 강의에서 많은 도움 받았습니다. 감사합니다.
    제가 실가래가 정보를 db에 저장 할려고합니다.
    실거래가의 경우 계약일 기준 60일 안에 등록하면 되는 것으로 알고 있습니다.
    제가 공공Data포탈에서 받아서 DB에 저장한 Data와 공공Data 포탈에 새로 추가로 등록된 Data를 구별 할 수 있는 방법이 있는지 궁금합니다. 공공Data포탈의 경우 내려받은 data의 키값이없는것 같습니다
    이 부분 어떻게 해결했는지 궁금합니다.

    • Favicon of https://tariat.tistory.com BlogIcon 테리엇 2019.12.08 11:51 신고 댓글주소  수정/삭제

      데이터를 구분할 수 있는 키값은 없는 것으로 알고 있습니다. 날짜 단위로 데이터를 받아서, 기존 것을 업데이트하는 것이 최신 데이터를 유지하는 가장 좋은 방법이지 않을까 싶네요.

  3. hs 2020.10.16 14:38 댓글주소  수정/삭제  댓글쓰기

    공공데이터 포털 Oepn API 데이터를 공부하고있습니다.
    공유해주신 코드 응용해서 날씨 데이터에 적용을 해보았는데 collect_lent함수 적용이 안된거 같더라고요 혹시 메일 통해서 코드 봐주실수 있으실가요?

  4. kk27 2020.12.10 19:34 댓글주소  수정/삭제  댓글쓰기

    안녕하세요 블로그글 정말 많은 도움이 되었습니다. 한가지 질문이 있는데 sqlite을 이용하지 않고 csv나 db파일로 저장하는 방법이 있을까요?
    file = open('output.csv','wt+')
    file.write(df)
    file.close()
    이런식으로 시도해봤는데
    TypeError: write() argument must be str, not DataFrame 이렇게 에러가 뜨고
    파일 생성은 되는데 안에 아무것도 들어있지가 않네요...

    • Favicon of https://tariat.tistory.com BlogIcon 테리엇 2020.12.12 23:29 신고 댓글주소  수정/삭제

      dataframe을 저장하는 방법은 여러가지가 있습니다. CSV로 저장하는 방법도 가능합니다. 예전에 아래 포스팅에 내용을 담았으니 참고하시기 바랍니다. https://tariat.tistory.com/583