Naver & Zigbang Real Estate Scraper + Gap Finder
Pricing
from $2.00 / 1,000 record scrapeds
Naver & Zigbang Real Estate Scraper + Gap Finder
Scrape Korean apartment listings from Naver 부동산 and Zigbang (직방) and auto-surface low-gap 갭투자 opportunities (sale vs jeonse) with 전세가율, market position, and recent actual transaction prices. Zigbang mode is token-free; Naver mode needs a KR residential proxy.
Pricing
from $2.00 / 1,000 record scrapeds
Rating
0.0
(0)
Developer
Dongwook Kim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Naver & Zigbang Real Estate Scraper + Gap-Investment Finder
Scrape Korean apartment listings from Naver 부동산 and Zigbang (직방), and automatically surface low-gap 갭투자 (gap-investment) opportunities — where a tenant's 전세 deposit covers most of the purchase price, so a buyer fronts only the gap.
- 🟢 Zigbang mode (default) — token-free, works on any IP, no proxy needed.
- 🔵 Naver mode — richer coverage + 시세/실거래가 (actual transaction prices), needs a KR residential proxy (Naver blocks datacenter IPs).
- 💡 Gap finder — pairs 매매 vs 전세 per complex/평형 and ranks the lowest-gap opportunities with 전세가율, market position, and recent actual transactions.
Quick start (free, no proxy)
Just press Run — the default input scrapes Zigbang in 강남 (geohash wydm6):
{ "site": "zigbang", "targets": ["wydm6"], "maxListings": 300, "gapAnalysis": true }
Target other regions (geohash)
Zigbang targets are geohashes. Verified examples (2026-06):
| Region | geohash | Region | geohash |
|---|---|---|---|
| 서울 강남/서초 | wydm6 | 성남 분당 | wydks |
| 서울 송파 잠실 | wydmk | 수원 영통 | wyd7g |
| 서울 마포 | wydm8 | 부산 해운대 | wy7b5 |
| 서울 성동 | wydmd | 대구 수성 | wy77z |
| 서울 (광역) | wydm (4-char = wider) | 인천 송도 | wydh9 |
Shorter geohash = wider area. Get any area's geohash from its lat/lng (e.g.
geohash.org) or pass a https://www.zigbang.com/...?geohash=... URL.
Naver mode (premium coverage, needs proxy)
{"site": "naver","targets": ["https://new.land.naver.com/complexes?ms=37.4949,127.0521,15&a=APT&e=RETAIL"],"useResidentialProxy": true,"enrichMarket": true,"maxListings": 500}
Naver mode adds, per gap opportunity: 전세가율, 시세위치 (where the sale
sits in the complex's asking range), and the latest actual transaction (실거래가).
It requires useResidentialProxy: true with a KR residential proxy.
Output
Dataset records:
- listings —
site, complexName, areaLabel, tradeType (SALE/JEONSE/MONTHLY), priceManwon, floor, ... - gap-opportunity —
complexName, areaLabel, saleManwon, jeonseManwon, gapManwon, gapRatioPct, bestCaseGapManwon, bestCaseGapRatioPct, sampleConfidence, saleCount, jeonseCount, saleListingId, jeonseListingId(+ Naver:complexSalePositionPct, recentRealSaleManwon, askingVsRealPct) - run-insights — one per run, with counts and top gap opportunities for quick inspection
Prices are in 만원 (10,000 KRW). Gap opportunities are sorted lowest-gap first.
Pricing (pay-per-event)
| Event | When |
|---|---|
listing-scraped | each unique listing |
gap-opportunity | each low-gap opportunity found (premium) |
For developers — architecture
src/core/types.ts SiteAdapter boundary (swap data source without touchingbilling/analysis)analysis/gap.ts Pure 갭투자 logic (median headline + best-case + counts)adapters/naver*.ts Naver: fingerprinted browser, JWT capture, in-page fetchpagination, 시세/실거래가 enrichmentadapters/zigbang*.ts Zigbang: token-free HTTP, concurrent per-danji fetchmain.ts site router → adapter → PPE charge → dataset → RUN_SUMMARY
Both adapters implement the same SiteAdapter; main.ts is site-agnostic.
The actor emits a RUN_SUMMARY with a DATA_QUALITY_FAIL flag and per-run stats
for health monitoring. Run npm run health:local before deployment; it fails on
non-OK run quality, low listing count, high parse failure rate, and actor
timeout/start failures. Run npm run verify for the local release gate
(tests, TypeScript build, and Apify schema validation), and npm run verify:ops
to add the latest cloud-health report status, scheduled-task status snapshot,
scheduled-task registration preview self-test, and scheduled-task wrapper
self-test without starting a new cloud run. After the scheduled task is
registered, use npm run verify:ops:strict so a missing task fails the gate.
After deployment, run npm run health:cloud to smoke the latest Apify build and
verify the Actor output links, RUN_SUMMARY, and dataset row mix. For schedulers
or alerting wrappers, set HEALTH_REPORT_PATH to write a small machine-readable
success/failure report, e.g. PowerShell:
$env:HEALTH_REPORT_PATH='storage-healthcheck/cloud-health-latest.json'; npm run health:cloud.
Use npm run health:cloud:status as a cheap follow-up probe; it reads the latest
report and fails if it is stale, failed, missing run-insights, or below the
minimum listing count. The shared health thresholds are MIN_LISTINGS,
MAX_PARTIAL_PCT, MAX_COMPLEX_FAILURE_PCT (default 25), and
MAX_MALFORMED_RESPONSES (default 0).
On Windows, preview the scheduled-task registration with:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/register-cloud-health-task.ps1
Register or update the daily task only when the preview looks right:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/register-cloud-health-task.ps1 -Register -Force -At 08:00
For failure alerts, set ALERT_WEBHOOK_URL in the task user's environment. Treat
that URL as a credential; do not put it in the command line, README, logs, or
Task Scheduler arguments. The task wrapper posts only on failure and logs only
whether the alert send succeeded.
The task log is bounded by default. scripts/run-cloud-health-task.ps1 rotates
storage-healthcheck/cloud-health-task.log to .log.1 when it reaches 1 MB;
override with -MaxLogBytes if needed.
Check both Task Scheduler registration state and the latest health report with
npm run health:cloud:task:status. Add -RequireRegisteredTask when calling
scripts/check-cloud-health-task.ps1 directly if a missing scheduled task should
fail the check, or use npm run health:cloud:task:status:strict after the task
has been registered.
Exercise the wrapper failure path without starting an Apify cloud run with
npm run health:cloud:task:self-test. The self-test suppresses webhook delivery,
expects the wrapped task to fail, and passes only if the failure marker and alert
suppression are written to the self-test log.
Exercise the scheduled-task registration preview without creating or updating an
OS task with npm run health:cloud:task:register:self-test. It verifies that
the preview remains non-mutating and that the generated task arguments include
the report path, log path, report staleness threshold, and log rotation limit.
Notes
- Naver's PC API requires an
Authorization: BearerJWT and rejects datacenter direct fetch (401/429); the adapter captures the JWT from the warmed browser session and refreshes on expiry. - Zigbang apartment inventory is sparser than Naver's (it began as 원룸/오피스텔); many large 재건축 complexes have 0 Zigbang listings.
Legal / ToS
Scrapes publicly visible listings. Operate on public data, respect rate limits, and review each portal's ToS before commercial use.