"Diese Wohnung, kann man sie jetzt kaufen?"
Um diese Frage zu beantworten, benötigen Sie letztendlich Daten. Sie müssen Zahlen anstelle von Vermutungen verwenden, wie die Entwicklung der tatsächlichen Transaktionen, die umliegenden Marktpreise, das Verhältnis von Miet- zu Kaufpreisen und Veränderungen im Handelsvolumen. Immobilieninvestoren, PropTech-Startups, Immobilienvermittler und akademische Forscher haben alle dieselbe Frage: "Wie können diese Daten automatisch gesammelt werden?"
In diesem Artikel werden drei Methoden zur Sammlung von Immobilientransaktionsdaten behandelt:
- Öffentliche API - Öffentliche API für Immobilientransaktionen des Ministeriums für Land, Infrastruktur und Verkehr (kostenlos, am sichersten)
- Direktes Crawling - Crawling von Websites wie Naver Real Estate (technisch anspruchsvoll)
- Professionelle Dienste - Automatische Datenerfassung mithilfe von Crawling-Services (am bequemsten)
Es werden die Vor- und Nachteile jeder Methode, praktischer Python-Code, Problembehandlung und rechtliche Hinweise zusammengefasst.
Inhaltsverzeichnis
- Wo befinden sich Immobiliendaten?
- Methode 1: Nutzung der öffentlichen API des Ministeriums für Land, Infrastruktur und Verkehr
- Methode 2: Crawling von Naver Real Estate
- Methode 3: Nutzung von professionellen Crawling-Services
- Nutzung der gesammelten Daten - Analyse und Visualisierung
- Problembehandlung - Häufig auftretende Probleme und Lösungen
- Rechtliche Hinweise
- Häufig gestellte Fragen (FAQ)
Wo befinden sich Immobiliendaten?
Immobilientransaktionsdaten in Korea werden von verschiedenen Quellen bereitgestellt. Je nach Zweck gibt es unterschiedliche geeignete Quellen.
1. Öffentliches System für Immobilientransaktionen des Ministeriums für Land, Infrastruktur und Verkehr
URL: rt.molit.go.kr
Dies sind die offiziellen öffentlichen Transaktionsdaten des Ministeriums für Land, Infrastruktur und Verkehr. Wenn eine Immobilientransaktion gemeldet wird, wird sie in diesem System veröffentlicht.
Bereitgestellte Daten:
- Kauf- und Miettransaktionen von Apartments, Reihenhäusern/Mehrfamilienhäusern, Einfamilienhäusern/Mehrfamilienhäusern
- Kauf- und Miettransaktionen von Bürogebäuden
- Transaktionen von Grundstücken, Verkauf/Miete von Baurechten, gewerblichen/geschäftlichen Transaktionen
- Transaktionsdatum, Transaktionsbetrag, Fläche, Stockwerke, Baujahr usw.
Öffentliche Datenportal-API:
Auf der Website Datenportal der Regierung (data.go.kr) können Sie die API des Ministeriums für Land, Infrastruktur und Verkehr für Immobilientransaktionen kostenlos nutzen. Sobald Sie einen API-Schlüssel erhalten haben, können Sie die Daten automatisch mit Programmierung sammeln.
Vorteile: Offizielle Daten, kostenlos, kein rechtliches Risiko
Nachteile: Nur Transaktionsdaten verfügbar (keine Informationen zu Marktpreisen oder Immobilienangeboten), verzögerte Aktualisierungen
2. Naver Real Estate
URL: land.naver.com
Hier werden nicht nur Transaktionsdaten angeboten, sondern auch umfangreiche Zusatzinformationen wie Angebotsinformationen, Marktpreise, Schulbezirke und umliegende Infrastruktur.
Bereitgestellte Daten:
- Transaktionsdaten (basierend auf den Daten des Ministeriums für Land, Infrastruktur und Verkehr)
- Aktuelle Angebotsinformationen (Angebotspreis, Art des Angebots)
- Preisinformationen (KB-Preise, von Naver geschätzte Preise)
- Komplexe Informationen zu Wohnanlagen (Anzahl der Einheiten, Parkplätze, Verwaltungskosten usw.)
- Schulbezirke und Informationen zu umliegenden Einrichtungen
Vorteile: Umfangreiche Daten, benutzerfreundlich
Nachteile: Schwieriges Crawling, Einschränkungen in den Nutzungsbedingungen
3. Zigbang / Dabang
URL: zigbang.com / dabangapp.com
Diese Plattformen haben einen Schwerpunkt auf Informationen zu kleinen Wohnungen wie Einzimmer- und Zweizimmerwohnungen. Insbesondere verfügen sie über reichhaltige Daten zum Mietmarkt.
Vorteile: Reiche Daten zu kleinen Wohnungen/Mietobjekten
Nachteile: Weniger Daten zu Apartmentkäufen im Vergleich zu Naver Real Estate
4. Korea Real Estate Institute (ehemals Korea Appraisal Board)
URL: reb.or.kr
Hier werden Immobilienpreistrends, Miet- zu Kaufpreisverhältnisse, Preisindizes für Kauf/Miete usw. bereitgestellt. Über das R-ONE Real Estate Statistics System haben Sie Zugriff auf verschiedene Statistiken.
Vorteile: Offizielle Statistiken, Bereitstellung von Preisindizes
Nachteile: Keine individuellen Transaktionsdaten, nur aggregierte Statistiken
Methode 1: Nutzung der öffentlichen API des Ministeriums für Land, Infrastruktur und Verkehr
Dies ist die traditionellste und stabilste Methode. Da es sich um öffentliche Daten handelt, gibt es kein rechtliches Risiko.
Schritt 1: API-Schlüssel erhalten
- Registrieren Sie sich auf dem Datenportal der Regierung.
- Suchen Sie nach "Immobilientransaktionsdaten für Apartmentkäufe des Ministeriums für Land, Infrastruktur und Verkehr".
- Klicken Sie auf "Nutzung beantragen" → Geben Sie den Verwendungszweck ein.
- API-Schlüssel erhalten (normalerweise sofort bis zu 1 Tag)
Tipp: Es werden zwei Arten von API-Schlüsseln ausgegeben: ein codierter Schlüssel (Codierung) und ein decodierter Schlüssel (Dekodierung). In Python ist es praktischer, den decodierten Schlüssel zu verwenden. Die Verwendung des codierten Schlüssels kann zu Fehlern führen, da die requests-Bibliothek ihn doppelt codiert.
Haupt-API-Liste
| API-Name | Beschreibung | Service-Code |
|---|---|---|
| Immobilientransaktionsdaten für Apartments | Transaktionsdaten für Apartmentkäufe | getRTMSDataSvcAptTrade |
| Daten zu Apartmentmieten | Miet- und Leasingtransaktionen für Apartments | getRTMSDataSvcAptRent |
| Transaktionsdaten für Reihenhäuser/Mehrfamilienhäuser | Transaktionspreise für Villen/Reihenhäuser | getRTMSDataSvcRHTrade |
| Transaktionsdaten für Bürogebäude | Transaktionspreise für Bürogebäude | getRTMSDataSvcOffiTrade |
| Transaktionsdaten für Einfamilienhäuser/Mehrfamilienhäuser | Transaktionspreise für Einfamilienhäuser | getRTMSDataSvcSHTrade |
| Transaktionsdaten für Grundstücke | Transaktionspreise für Grundstücke | getRTMSDataSvcLandTrade |
Python-Code - Abrufen von Transaktionsdaten für Apartmentkäufe
import requests
import xml.etree.ElementTree as ET
import pandas as pd
# API 설정 — 디코딩된 키를 사용하세요
SERVICE_KEY = "발급받은_디코딩_API_키"
BASE_URL = "http://openapi.molit.go.kr/OpenAPI_ToolInstall/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade"
def get_apt_trade(lawd_cd: str, deal_ymd: str) -> pd.DataFrame:
"""
아파트 매매 실거래가를 조회합니다.
Args:
lawd_cd: 법정동 앞 5자리 코드 (예: "11680" = 서울 강남구)
deal_ymd: 계약년월 (예: "202601")
Returns:
거래 데이터가 담긴 DataFrame
"""
params = {
"serviceKey": SERVICE_KEY,
"LAWD_CD": lawd_cd,
"DEAL_YMD": deal_ymd,
"numOfRows": "9999",
"pageNo": "1"
}
response = requests.get(BASE_URL, params=params, timeout=30)
response.raise_for_status()
root = ET.fromstring(response.text)
# 에러 체크
result_code = root.find(".//resultCode")
if result_code is not None and result_code.text != "00":
result_msg = root.find(".//resultMsg")
raise Exception(f"API 오류: {result_msg.text if result_msg is not None else 'Unknown'}")
items = root.findall(".//item")
if not items:
return pd.DataFrame()
data = []
for item in items:
row = {}
for child in item:
text = child.text.strip() if child.text else ""
row[child.tag] = text
data.append(row)
return pd.DataFrame(data)
# 사용 예시: 서울 강남구(11680) 2026년 1월 거래 조회
df = get_apt_trade("11680", "202601")
print(f"조회된 거래 수: {len(df)}")
if not df.empty:
# 거래금액 정수 변환 (쉼표와 공백 제거)
df["거래금액_만원"] = df["거래금액"].str.replace(",", "").str.strip().astype(int)
print(df[["거래금액_만원", "아파트", "전용면적", "층"]].head(10))
Jährliche Datenerfassung für alle Bezirke in Seoul
import time
# 서울시 구별 법정동 앞 5자리 코드
SEOUL_CODES = {
"강남구": "11680", "서초구": "11650", "송파구": "11710",
"강동구": "11740", "마포구": "11440", "용산구": "11170",
"성동구": "11200", "광진구": "11215", "중구": "11140",
"종로구": "11110", "영등포구": "11560", "동작구": "11590",
"관악구": "11620", "강서구": "11500", "양천구": "11470",
"구로구": "11530", "금천구": "11545", "노원구": "11350",
"도봉구": "11320", "강북구": "11305", "성북구": "11290",
"동대문구": "11230", "중랑구": "11260", "은평구": "11380",
"서대문구": "11410"
}
def collect_seoul_yearly(year: int) -> pd.DataFrame:
"""서울시 전체 구의 1년치 아파트 매매 데이터를 수집합니다."""
all_data = []
months = [f"{year}{m:02d}" for m in range(1, 13)]
total = len(SEOUL_CODES) * len(months)
count = 0
for gu_name, code in SEOUL_CODES.items():
for month in months:
count += 1
try:
df = get_apt_trade(code, month)
if not df.empty:
df["구"] = gu_name
all_data.append(df)
print(f"[{count}/{total}] {gu_name} {month}: {len(df)}건")
except Exception as e:
print(f"[{count}/{total}] {gu_name} {month}: {e}")
time.sleep(0.3) # API 호출 간격
if all_data:
result = pd.concat(all_data, ignore_index=True)
return result
return pd.DataFrame()
# 2025년 전체 데이터 수집
result = collect_seoul_yearly(2025)
result.to_csv("서울_아파트_실거래가_2025.csv", index=False, encoding="utf-8-sig")
print(f"\n총 {len(result)}건 수집 완료!")
Grenzen der öffentlichen API
Die öffentliche API ist stabil, hat jedoch Einschränkungen:
| Grenze | Beschreibung |
|---|---|
| Datenbereich | Bietet nur Transaktions- und Grundinformationen. Keine Zusatzinformationen wie Marktpreise, Angebote, Schulbezirke usw. |
| Verzögerte Aktualisierung | Nicht in Echtzeit, sondern nach einigen Tagen bis Wochen nach der Meldung |
| Aufrufbeschränkung | Tägliche API-Aufrufe begrenzt (normalerweise 1.000/Tag, kann auf Anfrage erweitert werden) |
| Datenformat | Standardmäßige XML-Antwort (einige APIs unterstützen auch JSON) |
| Gebietscode | Verwaltung von gesetzlichen Bezirkscodes erforderlich |
| Änderung der API-URL | Die API-URL des Datenportals der Regierung ändert sich gelegentlich |
Methode 2: Crawling von Naver Real Estate
Wenn Sie umfangreichere Daten als die öffentliche API benötigen, können Sie diese Methode in Betracht ziehen. Sie können Daten wie Marktpreise, Angebote und Informationen zu Wohnanlagen sammeln, die von der öffentlichen API nicht bereitgestellt werden.
Interne API von Naver Real Estate
Naver Real Estate ruft Daten über eine interne API im Frontend ab, um sie zu rendern. Sie können diese API-Aufrufe im Browser-Entwicklertools (F12 → Netzwerk-Tab) überprüfen.
Hauptendpunkte (können sich ändern):
# 단지 기본 정보
GET https://fin.land.naver.com/complexes/{complexNo}
# 단지 매물 목록
GET https://fin.land.naver.com/complexes/{complexNo}/articles
# 단지 실거래가
GET https://fin.land.naver.com/complexes/{complexNo}/real-estates/trades
# 지역별 단지 목록
GET https://fin.land.naver.com/front-api/v1/complex/marker
Python-Codebeispiel - Informationen zu Wohnanlagen von Naver Real Estate
import requests
import json
import time
def get_naver_complex(complex_no: str) -> dict | None:
"""
네이버 부동산에서 아파트 단지 정보를 조회합니다.
주의: 네이버 내부 API는 수시로 변경될 수 있습니다.
이 코드가 동작하지 않으면 브라우저 개발자 도구에서
최신 API 엔드포인트를 확인하세요.
"""
url = f"https://fin.land.naver.com/complexes/{complex_no}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://land.naver.com/",
"Accept": "application/json"
}
try:
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
return response.json()
else:
print(f"HTTP {response.status_code}: {complex_no}")
return None
except requests.exceptions.JSONDecodeError:
# HTML이 반환된 경우 (API 변경 가능성)
print(f"JSON 파싱 실패 — API 엔드포인트가 변경되었을 수 있습니다")
return None
except requests.exceptions.RequestException as e:
print(f"요청 실패: {e}")
return None
Praktische Probleme beim Crawling
Das Crawling von Naver Real Estate ist theoretisch einfach, erfordert jedoch kontinuierliche Wartung:
- Änderung des API-Endpunkts: Naver ändert häufig die interne API-URL. Der Code, der gestern funktionierte, kann heute fehlschlagen.
- Authentifizierungstoken: Einige Daten erfordern Sitzungstoken oder separate Authentifizierung, für die Sie eine Token-Aktualisierungslogik implementieren müssen.
- IP-Blockierung: Bei zu vielen Anfragen in kurzer Zeit wird Ihre IP-Adresse blockiert. Möglicherweise benötigen Sie eine Proxy-Rotation.
- JavaScript-Rendering: Einige Seiten verwenden Client-Rendering anstelle von Server-Rendering, sodass Sie Browser-Automatisierungstools wie Selenium oder Playwright benötigen.
- Nutzungsbedingungen: Die Nutzungsbedingungen von Naver verbieten das Sammeln von Daten durch automatisierte Mittel. Weitere Informationen zu rechtlichen Problemen beim Crawling finden Sie in einem separaten Artikel.
Methode 3: Nutzung von professionellen Crawling-Services
Wenn Sie über die Grenzen der öffentlichen API hinausgehen möchten, aber die Wartung eines eigenen Crawlers vermeiden möchten, ist die Nutzung von professionellen Crawling-Services eine praktische Wahl.
Vergleich der drei Methoden
| Kriterium | Öffentliche API | Direktes Crawling | Professionelle Dienste |
|---|---|---|---|
| Erstkonfiguration | Einige Tage | Mehrere Wochen bis Monate | Sofort |
| Datenbereich | Nur Transaktionsdaten | Preise+Angebote+Zusatzinfos | Preise+Angebote+Zusatzinfos |
| Wartung | Kaum vorhanden | Viel (Anpassung an API-Änderungen) | Vom Service verwaltet |
| Rechtliches Risiko | Keines | Vorhanden | Vom Service verwaltet |
| Kosten | Kostenlos | Entwicklung/Betriebskosten | Servicegebühr |
| IP-Blockierungsrisiko | Keines | Hoch | Keines |
| Datenqualität | Hoch (offizielle Daten) | Variabel | Hoch |
| Skalierbarkeit | Begrenzt | Eigene Implementierung erforderlich | Hoch |
Daten sammeln mit Hashscraper für Immobilien
Hashscraper verfügt über umfangreiche Erfahrung in der Datenerfassung im Immobilienbereich:
- Daten von Naver Real Estate: Automatische Erfassung von Listen von Objekten nach Region/Typ, Angebotspreisen, Flächen, Stockwerken, Informationen zu Wohnanlagen
- Integrierte Erfassung von Transaktionsdaten: Komplexe öffentliche API-Aufrufe werden über eine einfache Benutzeroberfläche bereitgestellt
- Überwachung von Preisänderungen: Regelmäßige Verfolgung von Preisänderungen zur Benachrichtigung
- Excel/API-Integration: Herunterladen der erfassten Daten als Excel oder Integration in bestehende Systeme über REST-API
Wenn Sie Ihren eigenen Crawler erstellen, müssen Sie ständig Zeit für die Anpassung an API-Änderungen, die Behandlung von IP-Blockierungen und die Datenbereinigung aufwenden. Durch die Nutzung eines professionellen Services können Sie sich jedoch auf die Datenanalyse konzentrieren.
Möchten Sie mehr über die Datenerfassung im Immobilienbereich erfahren? Erhalten Sie eine kostenlose Beratung von Hashscraper.
Nutzung der gesammelten Daten - Analyse und Visualisierung
Wenn Sie Daten gesammelt haben, ist es nun an der Zeit, durch Analyse Mehrwert zu generieren.
Grundlegende Analyse: Preisentwicklung nach Bezirken
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
# 한글 폰트 설정
matplotlib.rcParams['font.family'] = 'AppleGothic' # macOS
# matplotlib.rcParams['font.family'] = 'Malgun Gothic' # Windows
matplotlib.rcParams['axes.unicode_minus'] = False
# 데이터 로드 및 전처리
df = pd.read_csv("서울_아파트_실거래가_2025.csv")
df["거래금액_만원"] = (
df["거래금액"].astype(str).str.replace(",", "").str.strip().astype(int)
)
df["거래월"] = df["년"].astype(str) + "-" + df["월"].astype(str).str.zfill(2)
# 구별 월평균 매매가
monthly = df.groupby(["구", "거래월"])["거래금액_만원"].mean().reset_index()
# 강남 3구 비교 그래프
fig, ax = plt.subplots(figsize=(12, 6))
for gu in ["강남구", "서초구", "송파구"]:
data = monthly[monthly["구"] == gu].sort_values("거래월")
ax.plot(data["거래월"], data["거래금액_만원"] / 10000, marker="o", label=gu)
ax.set_title("강남 3구 아파트 평균 매매가 추이 (2025)", fontsize=14)
ax.set_xlabel("거래월")
ax.set_ylabel("평균 매매가 (억 원)")
ax.legend()
ax.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("강남3구_매매가_추이.png", dpi=150)
plt.show()
Fortgeschrittene Analyse: Berechnung des Miet- zu Kaufpreisverhältnisses
Das Miet- zu Kaufpreisverhältnis (Mietpreis ÷ Kaufpreis × 100) ist ein Schlüsselindikator für Immobilieninvestitionen. Je höher das Miet- zu Kaufpreisverhältnis ist, desto attraktiver ist die Lücke für Investitionen, und je niedriger es ist, desto höher ist das Risiko eines überhitzten Kaufmarktes.
def analyze_jeonse_rate(trade_file: str, rent_file: str, gu: str) -> pd.DataFrame:
"""
특정 구의 아파트별 전세가율을 계산합니다.
전세가율 = 전세 보증금 / 매매가 × 100
"""
trade = pd.read_csv(trade_file)
rent = pd.read_csv(rent_file)
# 해당 구 필터링
trade = trade[trade["구"] == gu].copy()
rent = rent[rent["구"] == gu].copy()
# 금액 정수 변환
trade["매매가"] = trade["거래금액"].astype(str).str.replace(",", "").str.strip().astype(int)
rent["보증금"] = rent["보증금액"].astype(str).str.replace(",", "").str.strip().astype(int)
# 전세만 필터링 (월세 제외: 월세금액이 0인 경우)
rent = rent[rent["월세금액"].astype(str).str.strip().replace("", "0").astype(int) == 0]
# 아파트별 평균가
avg_trade = trade.groupby("아파트")["매매가"].mean()
avg_rent = rent.groupby("아파트")["보증금"].mean()
# 전세가율 계산
common = avg_trade.index.intersection(avg_rent.index)
rates = pd.DataFrame({
"아파트": common,
"평균매매가_만원": avg_trade[common].values,
"평균전세가_만원": avg_rent[common].values,
})
rates["전세가율"] = (rates["평균전세가_만원"] / rates["평균매매가_만원"] * 100).round(1)
rates = rates.sort_values("전세가율", ascending=False)
return rates
# 강남구 전세가율 분석
rates = analyze_jeonse_rate(
"서울_아파트_매매_2025.csv",
"서울_아파트_전세_2025.csv",
"강남구"
)
print(rates.head(20))
Anwendungsfälle für die Nutzung von Daten
| Benutzer | Anwendungszweck | Benötigte Daten |
|---|---|---|
| Individuelle Investoren | Entscheidung über den Kaufzeitpunkt, Auswahl des Investitionsgebiets | Preisentwicklung, Miet- zu Kaufpreisverhältnis, Transaktionsvolumen |
| PropTech-Startups | Preisvorhersagemodell, automatische Preisbewertung | Große Menge an Transaktionsdaten, Preise, Informationen zu Wohnanlagen |
| Immobilienmakler | Vergleich von Immobilienangeboten, Kundenberatungsmaterial | Aktuelle Angebote, Transaktionspreise, Preise |
| Akademische Forschung | Analyse der Faktoren für Immobilienpreisbestimmung | Transaktionspreise + Bevölkerungs-/Wirtschaftsdaten |
| Finanzinstitute | Bewertung von Sicherheiten, Risikomanagement | Preise, Transaktionspreise, Preisindizes |
Problembehandlung - Häufig auftretende Probleme und Lösungen
Bezug zur öffentlichen API
Problem 1: Fehler "SERVICE_KEY_IS_NOT_REGISTERED_ERROR"
→ Verwenden Sie den decodierten Schlüssel, wenn Sie den Fehler erhalten, dass der Schlüssel nicht registriert ist. Verwenden Sie den decodierten Schlüssel.
Problem 2: Fehler "LIMITED_NUMBER_OF_SERVICE_REQUESTS_EXCEEDS_ERROR"
→ Sie haben das tägliche Aufruflimit überschritten. Beantragen Sie auf der Datenportal-Website eine Erhöhung des Datenverkehrs oder versuchen Sie es am nächsten Tag erneut.
Problem 3: Daten werden als 0 zurückgegeben
→ Überprüfen Sie, ob die Gebietscode (LAWD_CD




