본문으로 바로가기

1) API Key 발급받기

 

2) API 사용해 데이터 끌어와 분석

import requests
from bs4 import BeautifulSoup

# 발급받은 API 키 입력하기
service_key = 'API key 입력'

# base_url은 사이트에서 가져올 수 있음
base_url = 'http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcNrgTrade'
locate_code = '11110' # 종로구 
contract_date = '202112' # 2020년 12월에 거래된 내역 조회

request_url = base_url + '?' + "serviceKey=" + service_key + '&LAWD_CD=' + locate_code + '&DEAL_YMD=' + contract_date
print(request_url) # 아래 링크를 클릭해 결과가 잘 나오는지 확인
response = requests.get(request_url).content
soup = BeautifulSoup(response, 'lxml-xml') # Parser가 바뀜

print(soup)

 

3) 필요한 Tag만 꺼내기

items = soup.find_all('item') # XML의 <~>는 HTML의 Tag와 같이 접근 가능

items[0]

 

4) 꺼낸 Tag 내부에서 개별적으로 꺼내쓰기

for item in items:
    try:
        print('지역 코드 :', item.find('지역코드').get_text())
        print('거래 일자 :', item.find('년').get_text(), item.find('월').get_text(), item.find('일').get_text())
        print('거래 금액 :', item.find('거래금액').get_text())
        print('건물 면적 :', item.find('건물면적').get_text())
        print('대지 면적 :', item.find('대지면적').get_text())
        print('건축 년도 :', item.find('건축년도').get_text())
        print('건물 주용도 :', item.find('건물주용도').get_text())
        print('용도지역 :', item.find('용도지역').get_text())
        print('시군구 :', item.find('시군구').get_text())
        print('법정동 :', item.find('법정동').get_text())
        print('유형 :', item.find('유형').get_text())
        print()
    except:
        # 위 항목 중 하나라도 빠져있으면 해당 항목은 .get_text()가 불가하므로 에러가 발생합니다. 
        print()
        pass # 위 항목 중 하나라도 빠져있으면 출력에서 아예 제외합니다.

5) 데이터프레임으로 정리

loc_code = []
loc = []
date = []
price = []
building_usage = []

for item in items:
    try:
        loc_code.append(item.find('지역코드').get_text())
        loc.append(item.find('시군구').get_text() + item.find('법정동').get_text())
        date.append(item.find('년').get_text() + item.find('월').get_text() + item.find('일').get_text())
        price.append(item.find('거래금액').get_text())
        building_usage.append(item.find('건물주용도').get_text())
    except:
        pass

import pandas as pd

df = pd.DataFrame({'지역코드':loc_code, 
                   '부동산 위치':loc, 
                   '거래 일자':date, 
                   '거래 금액':price, 
                   '부동산 용도':building_usage})
df.head()