개발자식

[크롤링] 웹 크롤링_Open API 활용 본문

Data/Python

[크롤링] 웹 크롤링_Open API 활용

밍츠 2022. 3. 31. 00:24

공공데이터 포털의 Open API를 활용하여 "국토교통부_상업업무용 부동산 매매 신고 자료"를 웹 크롤링(XML) 을 해본다.

 


 

 

 

 

 

 

1. API 인증키 발급 신청하기

 

국토교통부_상업업무용 부동산 매매 신고 자료 URL : https://www.data.go.kr/data/15057267/openapi.do 

 

국토교통부_상업업무용 부동산 매매 신고 자료

부동산 거래신고에 관한 법률에 따라 신고된 주택의 실거래 자료를 제공

www.data.go.kr

 

API 인증키 발급 신청하기

  1. 회원 가입 & 로그인
  2. "국토교통부_상업업무용 부동산 매매 신고 자료"에 대해 "활용 신청" 버튼을 클릭
  3. 다른 설정들은 그대로 두고 "상세기능정보 선택" 및 "라이선스 표시"의 체크박스 체크 후 "신청" 버튼 클릭 

 

마이페이지 > 해당 자료 > 일반 인증키 복사

serviceKey 의 인증키에 복사한 인증키 붙여 넣어 결과를 미리 볼 수 있다.

위 "미리보기" 버튼을 눌렀을 때 브라우저에서 열린 새로운 Tab에서 URL 복사해 가져온다.

 

url 구조 :

http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcNrgTrade+ "serviceKey=" + service_key + '&LAWD_CD=' + locate_code + '&DEAL_YMD=' + contract_date 

 

위 사진의 요청변수들을 Parameter로 보내야 한다.

 

 

기술문서 파일로 자세한 추가 정보를 얻을 수 있다.

  • 서비스 인증/권한으로 Servie Key가 필요하다
  • 교환 데이터는 XML이다

 

 

2. XML 웹 크롤링

 

import requests
from bs4 import BeautifulSoup

 

service_key = "?????"
base_url = 'http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcNrgTrade'
locate_code = '11110' # 종로구 
contract_date = '202112

request_url = base_url + '?' + "serviceKey=" + service_key + '&LAWD_CD=' + locate_code + '&DEAL_YMD=' + contract_date
print(request_url) # 아래 링크를 클릭해 결과가 잘 나오는지 확인합니다.

 

데이터 포맷이 XML이므로 파서를 lxml-xml로 설정한다.

 

 

 

 

XML 구조는 위와 같으며 html의 tag 접근과 동일하게 찾고, get_text()를 이용하여 text값을 얻는다.

 

items = soup.find_all('item')

# item : 하나의 거래건
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 # 위 항목 중 하나라도 빠져있으면 출력에서 아예 제외합니다.

 

 

얻고 싶은 데이터를 리스트에 추가하여 dataframe으로 만들어준다.

 

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()

 

결과 :

 

 

 

 

 

Comments