SEAN TEAM
Work · DATA AGGREGATION MVP --:-- 서울 · 내 컴퓨터에서 도는 MVP

서울 월세 매물을
한 모양으로
모아 보기.

RENT

모든 매물을 모으는 일은기술보다 권한의 문제입니다.그래서 소스 위의 층부터 만들었습니다.

ABOUT · WHAT IT DOES

서울 월세는 여러 곳의 매물을 한 모양으로 바꾸고, 같은 방을 한 번만 세고, 자치구·월세·보증금·면적·유형·역 키워드로 걸러 보는 작은 파이썬 프로그램입니다. 지금 화면의 매물은 데모 소스 두 개에서 불러온 14건이고, 합치면 11건이 됩니다. 공공데이터포털의 국토교통부 전월세 실거래 API 를 읽는 소스도 구현돼 있어, 서비스키를 넣으면 데모 대신 실거래 자료를 읽습니다.

README 가 한계부터 적습니다. 플랫폼마다 약관과 robots 정책, 봇 차단이 달라 ‘서울의 모든 매물’ 을 한 번에 모을 수는 없다고. 그래서 크롤러 대신 소스를 갈아 끼우는 구조를 먼저 세웠습니다.

01 — Dashboard

요약, 조건, 목록이 한 화면에 있습니다.

서울 월세 매물 정리판 실제 화면 — 적재 소스 demo-alpha 7건·demo-beta 7건, 총 매물 수 11(중복 제거 후), 평균 월세 88.8만원, 조건별 탐색 여덟 칸, 소스 배지가 붙은 매물 11건 목록
  1. 14건을 불러와 11건소스별 적재 건수 아래에 중복을 뺀 총계가 뜹니다.
  2. 조건을 바꾸는 즉시입력칸이 바뀔 때마다 /api/listings 를 다시 부릅니다.
  3. 줄마다 출처어느 소스에서 온 매물인지 배지로 남깁니다.
02 — From one listing to the list

불러오고, 합치고, 거릅니다.

모든 소스는 BaseSource 를 상속하고 load() 하나만 구현합니다. 그 아래는 매물이 어느 소스에서 왔는지 모릅니다.

  1. ① Load

    소스마다 다른 필드를 한 레코드로

    demo-alpha 는 월세를 rent_monthly 에 “85” 같은 글자로, demo-beta 는 price.monthly 에 숫자로 적습니다. 소스가 각자 자기 필드를 Listing 한 모양으로 바꾸고, 원본은 raw 에 그대로 둡니다.

  2. ② Merge

    같은 방은 한 번만

    주소와 보증금, 월세, 유형이 같고 면적이 0.5㎡ 단위로 같으면 한 방으로 봅니다. 제목이 달라도 합치고 등록일이 늦은 쪽을 남깁니다. ‘잠실’ 로 찾으면 두 소스에 있던 투룸이 4월 13일 한 건으로 나옵니다.

  3. ③ Filter

    사람이 방을 찾는 방식으로

    월세 80만 원 이하에 월세 낮은순을 고르면 11건이 5건으로 줄고 62만 원부터 올라갑니다. 역 키워드는 역 이름과 매물 제목을 함께 찾습니다.

대시보드 윗부분 실제 화면 — 데이터 다시 불러오기 버튼, 적재 소스 demo-alpha 7건·demo-beta 7건, 요약 카드 네 장
역 키워드 ‘잠실’ 로 거른 실제 화면 — 조회 결과 1건, 잠실역 역세권 실거주 투룸 2,000/120만원 2026-04-13 demo-beta
최대 월세 80, 월세 낮은순으로 거른 실제 화면 — 조회 결과 5건, 서울대입구역 62만원부터

작게, 그러나 갈아 끼울 수 있게.

서버는 파이썬 표준 라이브러리만 씁니다. 설치할 패키지가 없습니다.

demo-alphademo-beta 매물 목록 실제 화면 — 조회 결과 11건, 줄마다 demo-alpha 또는 demo-beta 배지 출처가 남는 목록제목과 주소, 자치구, 보증금/월세, 면적, 유형, 역, 등록일 옆에 소스 배지까지 한 줄에 둡니다.
최신월세보증금면적 면적 넓은순으로 정렬한 매물 목록 실제 화면 — 34.8㎡ 용산역 오피스텔부터 정렬 네 가지최신 등록순, 월세 낮은순, 보증금 낮은순, 면적 넓은순. 값이 같으면 다음 기준으로 한 번 더 가릅니다.
POST /api/refresh 데이터 다시 불러오기 버튼과 ‘적재 소스: demo-alpha 7건, demo-beta 7건’ 실제 화면 다시 불러오기버튼을 누르면 모든 소스를 다시 읽고 소스별 건수를 보고합니다. 한 소스가 실패해도 나머지는 뜨고, 실패한 소스는 경고로 따로 적습니다.
자치구역 키워드 조건별 탐색 실제 화면 — 자치구, 최대 월세, 매물 유형, 역 키워드 입력칸 조건 여덟 칸자치구와 매물 유형 목록은 실제로 있는 값만 건수와 함께 채웁니다. 숫자 칸에 글자가 들어오면 서버가 400 으로 돌려보냅니다.

국토부 실거래는 아파트오피스텔연립다세대단독/다가구서울 25개 구 법정동 코드최근 N개월500건씩 페이지 환경변수로 고릅니다.

서비스키가 있으면 실거래 소스가 데모를 대신하고, RENT_INCLUDE_DEMO=true 일 때만 둘을 섞습니다.

01

권한부터 적는다

민간 플랫폼 매물을 모으려면 공개 API, 제휴, 크롤링 허용 범위를 먼저 확인해야 합니다. README 는 그 사실을 첫머리에 적고, 한 곳씩 확인하고 붙이라고 순서를 정해 둡니다.

02

경계에서 한 모양으로

정규화는 소스 안에서 끝납니다. 필터와 정렬, 요약은 Listing 하나만 알기 때문에, 소스를 더해도 나머지 코드가 휘지 않습니다.

03

데모는 데모라고

데모 소스 이름은 demo-alpha 와 demo-beta, 링크는 example.com 입니다. 겹치게 만든 매물에는 ‘alpha 소스와 중복되는 예시 매물’ 이라고 적어 두었습니다.

04

첫 실행은 작게

기본값이면 네 가지 유형 × 25개 구 × 2개월, 최소 200번을 호출합니다. 그래서 README 는 구 한두 개, 한 달로 먼저 돌려 보라고 권합니다.

05

월세 0원은 버린다

실거래 자료에는 전세 거래도 섞여 옵니다. 월세가 0 인 행은 정규화 단계에서 버리고, 월세 거래만 목록에 올립니다.

06

지금은 메모리에

불러온 매물은 서버 메모리에만 있어서 끄면 사라집니다. MVP 로는 충분하고, 실제 소스가 붙으면 SQLite 나 PostgreSQL 저장이 가장 먼저 바뀔 곳입니다.

03 — Counted from the folder · 2026-09-25
887줄의 Python · 표준 라이브러리만
657줄의 화면 · HTML·CSS·JS
11건으로 합친 데모 매물 · 불러온 건 14건
25개 자치구 법정동 코드
4개 국토부 전월세 실거래 API
ROLE
단독 개발 — 수집 구조 · 정규화 · 화면
SERVER
Python 3.12 · http.server · 외부 패키지 없음
UI
HTML · CSS · 바닐라 JS 한 장
DATA
데모 소스 JSON 2개 · 국토교통부 전월세 실거래 API
API
/api/summary · /api/listings · /api/refresh · /api/health
STATUS
LOCAL MVP · DEMO DATA
WHY

만들면서 스스로에게
물은 것들.

왜 크롤러를 만들지 않았나요?

플랫폼마다 이용약관, robots 정책, 인증, 봇 차단이 다릅니다. 허락 없이 긁는 수집기는 언젠가 깨지거나 선을 넘습니다. 그래서 공개된 공공 API 를 먼저 붙이고, 민간 플랫폼은 한 곳씩 확인한 뒤 클래스 하나로 붙일 수 있는 자리만 만들어 두었습니다.

실거래 자료와 매물 광고는 같은 건가요?

아닙니다. 국토부 자료는 이미 계약된 전월세 거래이고, 지금 광고 중인 매물이 아닙니다. README 도 그 차이를 적습니다. 그래서 실거래 행에는 매물 링크가 없고, 제목은 건물명과 유형으로, 설명은 건축년도와 계약구분, 계약기간으로 채웁니다.

중복은 어떻게 판단하나요?

글이 아니라 방을 봅니다. 주소와 유형의 공백을 지우고 소문자로 맞춘 뒤, 보증금과 월세가 같고 면적이 0.5㎡ 단위로 같으면 한 방입니다. 데모 소스 두 개에 겹친 세 쌍이 이렇게 합쳐져 14건이 11건이 됩니다.

화면의 매물은 진짜인가요?

아닙니다. 지금 보이는 11건은 데모 소스이고 링크도 example.com 입니다. 소스 배지를 demo-alpha, demo-beta 그대로 보이게 둔 이유입니다. 이 사이트의 데모는 앱이 내려준 API 응답을 저장해 서버 없이 띄운 것이라, 필터는 돌지만 정렬은 바뀌지 않습니다.

다음은 무엇인가요?

README 가 순서를 정해 두었습니다. 플랫폼 한 곳을 정해 붙이고, 필터 조건을 확정하고, 저장소와 정기 수집을 더한 뒤, 소스를 늘립니다. 희망 목록이 아니라 차례입니다.

프로젝트 전체 보기 →