Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 시각화
- 코딩테스트
- Tensor
- 추천 시스템
- 딥러닝
- recommendation system
- TF-IDF
- 데이터 엔지니어링
- 추천시스템
- pytorch
- 알고리즘
- 파이썬
- 코테
- 백준
- 웹크롤링
- selenium
- Python
- 협업 필터링
- Cosine-similarity
- codingtest
- 데이터
- 부스트캠프
- coursera
- 분산 시스템
- SGD
- Overfitting
- 프로그래머스
- 웹스크래핑
- 머신러닝
- wordcloud
Archives
- Today
- Total
개발자식
[크롤링] 웹 크롤링_Open API 활용 본문
공공데이터 포털의 Open API를 활용하여 "국토교통부_상업업무용 부동산 매매 신고 자료"를 웹 크롤링(XML) 을 해본다.
1. API 인증키 발급 신청하기
국토교통부_상업업무용 부동산 매매 신고 자료 URL : https://www.data.go.kr/data/15057267/openapi.do
국토교통부_상업업무용 부동산 매매 신고 자료
부동산 거래신고에 관한 법률에 따라 신고된 주택의 실거래 자료를 제공
www.data.go.kr
API 인증키 발급 신청하기
- 회원 가입 & 로그인
- "국토교통부_상업업무용 부동산 매매 신고 자료"에 대해 "활용 신청" 버튼을 클릭
- 다른 설정들은 그대로 두고 "상세기능정보 선택" 및 "라이선스 표시"의 체크박스 체크 후 "신청" 버튼 클릭
마이페이지 > 해당 자료 > 일반 인증키 복사
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()
결과 :
'Data > Python' 카테고리의 다른 글
[Python] 함수(function)와 변수(variable) (2) | 2022.09.22 |
---|---|
[Python] 순열과 조합 (Permutation and Combination) (0) | 2022.06.30 |
[크롤링] 웹 크롤링, 네이버 금융TOP (0) | 2022.03.30 |
[크롤링] 무한 스크롤 웹 스크래핑(Selenium) (0) | 2022.03.30 |
[크롤링] Post request 기반의 웹사이트 크롤링 (0) | 2022.03.30 |
Comments