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

4

Total users

0

Monthly active users

25 days

Issues response

4 months 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:

  • 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)

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.