티스토리 뷰

Python

부동산 실거래가 크롤링

inasie 2018. 11. 15. 21:58

요새 아파트 가격에 관심이 많아진 관계로, 부동산 실거래가 크롤러를 만들어보도록 하겠습니다. 
최종 목표는 동탄 지역 30평형대 아파트의 최근 실거래가 데이터를 가져오는 것 입니다. 

우선 부동산 실거래 사이트를 들어가 봅니다. 
http://rt.molit.go.kr/


쉽고 편리한 국토교통부 실거래가 공개시스템입니다. 
물론 웹사이트에서 쉽고 편리하게 확인할 수 있겠으나, 전 데이터만을 가져오길 원합니다. 
아파트 메뉴에 들어가 동탄 지역을 검색해봅니다.


지도에 아파트들이 표시됩니다. 
요즘 가격이 부쩍 오른 아이파크를 찍어봅니다.


최근 매매가가 나오는군요
8월에 6건의 거래가 있었고 5억 초반~중반 정도에 거래됬네요.....

데이터를 긁어오기 위해 F12를 눌러 디버깅 모드로 들어갑니다. 
디버깅 모드는 브라우저에 따라 다를 수 있습니다. 전 크롬기반의 네이버 웨일브라우저를 사용합니다. 


짜잔

clear후 아파트를 다시 누르니 5번의 요청이 간 것을 확인할 수 있습니다.
이중에 원하는 데이터는 getDanjiInfoDetail.do?... 에서 얻어온 것으로 확인됩니다. 
response를 보면 아파트명과 거래된 월, 가격등이 json data로 넘어온 것을 확인할 수 있습니다. 

URL을 복사해서 주소창에 붙여봅니다.

실패!

request header에 넘겨야 하는 data가 있나봅니다.
request header를 복사해봅니다. 

GET /new/gis/getDanjiInfoDetail.do?menuGubun=A&p_apt_code=20064683&p_house_cd=1&p_acc_year=2018&areaCode=&priceCode= HTTP/1.1 Host: rt.molit.go.kr Connection: keep-alive Accept: application/json, text/javascript, */*; q=0.01 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.51.7 Safari/537.36 Referer: http://rt.molit.go.kr/new/gis/srh.do?menuGubun=A&gubunCode=LAND Accept-Encoding: gzip, deflate Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: ROUTEID=.HTTP1

다른 데이터는 평범한데 Referer라는 항목이 눈에띄는군요
Postman을 이용해 Referer 정보를 포함하여 Get요청을 시도해봅니다.

성공!

실거래가를 얻어오기 위한 URL, Request header정보를 얻었습니다. 
이제 Python 에 작업을 해 봅니다.

# -*- coding: utf-8 -*- import requests import json import logging URL = "http://rt.molit.go.kr/new/gis/getDanjiInfoDetail.do" param = { 'menuGubun': 'A', 'p_apt_code': 20064683, 'p_house_cd': 1, 'p_acc_year': 2018 } header = { 'Referer': 'http://rt.molit.go.kr/new/gis/srh.do?menuGubun=A&gubunCode=LAND' } logging.basicConfig(level=logging.INFO) resp = requests.get(URL, params=param, headers=header) if resp.status_code != 200: logging.error('invalid status: %d' % resp.status) exit data = json.loads(resp.text) for item in data['result']: if item['BLDG_AREA'] < 80 or item['BLDG_AREA'] > 85: continue logging.info('%02s월 %02s층 %s만원' % (item['DEAL_MM'], item['APTFNO'], item['SUM_AMT']))


실행 결과 데이터를 잘 가져오는 것을 확인할 수 있습니다. 

INFO:root:08451,500만원 INFO:root:08955,000만원 INFO:root:081656,000만원 INFO:root:081454,000만원 INFO:root:081853,000만원 INFO:root:081053,700만원 INFO:root:072454,300만원 INFO:root:06550,500만원 INFO:root:051250,000만원 INFO:root:05950,800만원 INFO:root:05548,000만원 INFO:root:052150,000만원 INFO:root:05343,200만원 INFO:root:052648,000만원 ...

※ 주의: 크롤링은 정상적인 루트로 데이터를 가져오는 방법이 아니므로, 위 내용은 참고만 할 뿐 사용 시 본인이 책임을 져야 합니다.

이 코드는 아래 주소에서 다시볼 수 있습니다.
https://gist.github.com/inasie/23b6fcd13633f3f363e8e403af5be7d8



반응형
댓글