Naver & Zigbang Real Estate Scraper + Gap Finder avatar

Naver & Zigbang Real Estate Scraper + Gap Finder

Pricing

from $2.00 / 1,000 record scrapeds

Go to Apify Store
Naver & Zigbang Real Estate Scraper + Gap Finder

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

Dongwook Kim

Maintained by Community

Actor 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):

RegiongeohashRegiongeohash
서울 강남/서초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.

{
"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:

  • listingssite, complexName, areaLabel, tradeType (SALE/JEONSE/MONTHLY), priceManwon, floor, ...
  • gap-opportunitycomplexName, 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)

EventWhen
listing-scrapedeach unique listing
gap-opportunityeach low-gap opportunity found (premium)

For developers — architecture

src/
core/types.ts SiteAdapter boundary (swap data source without touching
billing/analysis)
analysis/gap.ts Pure 갭투자 logic (median headline + best-case + counts)
adapters/naver*.ts Naver: fingerprinted browser, JWT capture, in-page fetch
pagination, 시세/실거래가 enrichment
adapters/zigbang*.ts Zigbang: token-free HTTP, concurrent per-danji fetch
main.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: Bearer JWT 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.

Scrapes publicly visible listings. Operate on public data, respect rate limits, and review each portal's ToS before commercial use.