Sunday, August 16, 2026

Free AI Vision Guide: Scrape Real Estate Data Step by Step

Real estate professionals waste 12+ hours weekly manually copying listings from Zillow, Redfin, and MLS portals into spreadsheets. Traditional scrapers break when sites update layouts or add CAPTCHAs. Since GPT-4V launched in September 2023, multimodal models can "read" property photos, floor plans, and listing screenshots — extracting price, beds, baths, square footage, and amenities without touching HTML. This guide shows you how to build a free AI vision pipeline using open-source tools and free-tier APIs that handles 500+ listings per month at zero cost.

Quick Answer: Use Tesseract OCR for text-heavy screenshots, Google Cloud Vision API free tier (1,000 units/month) for layout analysis, and GPT-4V via OpenAI's free credits or local Llama 3.2-Vision via Ollama for complex property photos. Capture listings with Playwright, feed images to vision models with structured prompts, parse JSON output into CSV. Total cost: $0 for up to 500 listings/month.

Why AI Vision Beats Traditional Scraping for Real Estate

Layout Changes Break Selectors, Not Vision

CSS selectors target specific DOM elements. When Zillow redesigned in March 2024, every XPath-based scraper failed. AI vision models process pixels, not markup — a bedroom count reads the same whether it's in a table, card, or modal. Computer vision extracts high-dimensional data from images regardless of HTML structure, making it resilient to frontend updates that cripple traditional parsers.

Visual-Only Data Requires Vision

Floor plans, property photos, virtual tour thumbnails, and handwritten agent notes never appear in HTML. OCR and vision transformers convert these into structured fields: room dimensions from floor plans, condition scores from photos, renovation flags from listing images. The 2023 NAR member survey found 78% of buyers decide using photos first — vision scraping captures what drives decisions.

Anti-Bot Defenses Block Crawlers, Not Screenshots

Cloudflare, Akamai, and PerimeterX fingerprint headless browsers. Playwright with stealth plugins still triggers challenges at scale. Taking full-page screenshots via authenticated user sessions bypasses bot detection entirely — you're capturing what a human sees, not requesting raw HTML. The hiQ Labs v. LinkedIn ruling (9th Cir. 2019, affirmed 2022) established that accessing publicly available data via automated means is generally permissible; screenshots of public listings strengthen this position.

Toolstack: Free Tiers That Cover 500+ Listings Monthly

Screenshot Capture: Playwright + Chrome DevTools Protocol

Microsoft's Playwright automates Chromium, Firefox, and WebKit. Its CDP session captures full-page screenshots at 1920x1080 in 2-3 seconds per listing. Run headless with --disable-blink-features=AutomationControlled to avoid detection. Zero cost, unlimited runs. Install: npm i playwright then npx playwright install chromium.

OCR Engine: Tesseract 5.x (Local, Unlimited)

Google's Tesseract 5.3.0 (released February 2023) adds LSTM neural nets for 100+ languages. Processes a listing screenshot in 800ms on a 2021 M1 Mac. No API keys, no rate limits, no data leaves your machine. Install via Homebrew: brew install tesseract. Use --psm 6 (uniform block) for listing cards, --psm 11 (sparse text) for photo overlays.

Vision API: Google Cloud Vision Free Tier (1,000 Units/Month)

Each image annotation request consumes 1 unit. The free tier covers 1,000 units monthly — enough for 33 listings/day. Enables DOCUMENT_TEXT_DETECTION for dense MLS tables and OBJECT_LOCALIZATION to find "pool," "garage," "solar panels" in property photos. Requires GCP project with billing enabled (no charge within free tier).

Multimodal LLM: GPT-4V Free Credits or Local Llama 3.2-Vision

OpenAI grants $5 free credits to new accounts (expires 30 days) — roughly 2,500 GPT-4V calls at 256-token outputs. For sustained free use, run Llama 3.2-Vision 11B via Ollama locally: ollama pull llama3.2-vision then POST to http://localhost:11434/api/generate with base64 images. Zero cost, unlimited, private. Benchmarks show 92% field extraction accuracy on Zillow screenshots vs. GPT-4V's 95%.

Step-by-Step Pipeline: From URL to Structured CSV

Step 1: Collect Target URLs with Pagination Logic

  1. Build search URLs for target markets: https://www.zillow.com/homes/for_sale/Austin-TX/ with query params for price, beds, baths.
  2. Use Playwright to navigate, wait for networkidle, extract listing card hrefs via page.locator('article[data-test="property-card"] a').evaluateAll(els => els.map(e => e.href)).
  3. Handle infinite scroll: loop page.keyboard.press('End') until no new cards appear for 3 consecutive scrolls.
  4. Deduplicate URLs, save to urls.json. Expect 40-60 listings per page.

Step 2: Capture Full-Page Screenshots Authentically

  1. Launch persistent context: await chromium.launchPersistentContext(userDataDir, { headless: true, args: ['--disable-blink-features=AutomationControlled'] }) — preserves cookies, localStorage, login state.
  2. Login once manually, then reuse context. Navigate each URL with waitUntil: 'networkidle'.
  3. Scroll to bottom to trigger lazy-loaded images: await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight)).
  4. Capture: await page.screenshot({ path: `shots/${listingId}.png`, fullPage: true, type: 'png' }).
  5. Rate limit: 2 seconds between requests. 500 listings ≈ 17 minutes.

Step 3: Extract Text via Tesseract, Enrich via Vision API

  1. Batch process screenshots: tesseract shots/*.png output -l eng --psm 6 txt produces output.txt per image.
  2. Regex parse for structured fields: price (\\$[\\d,]+), beds ((\\d+)\\s*(bd|bed|bedroom)), baths ((\\d+(\\.5)?)\\s*(ba|bath)), sqft ((\\d[\\d,]*)\\s*sq ?ft).
  3. For fields regex misses (HOA fees, year built, lot size), send screenshot to Google Vision DOCUMENT_TEXT_DETECTION. Parse fullTextAnnotation.text with same regex — Vision handles tables and columns Tesseract mangles.
  4. Merge results: prefer Vision for tabular data, Tesseract for body text. Flag conflicts for LLM review.

Step 4: Multimodal LLM Pass for Complex Fields

  1. Prepare prompt with JSON schema: {"price": "number", "beds": "number", "baths": "number", "sqft": "number", "address": "string", "hoa_fee": "number|null", "year_built": "number|null", "lot_size_sqft": "number|null", "features": "string[]", "description": "string", "photos_count": "number"}.
  2. Encode screenshot to base64, POST to Ollama endpoint with format: "json" and temperature 0.1.
  3. Validate response against schema, retry once on parse failure. Llama 3.2-Vision 11B averages 1.2s per image on M1 Pro.
  4. Merge LLM output with OCR/Vision results — LLM wins on ambiguous fields (e.g., "2.5 baths" vs "3 baths" in conflicting sources).

Step 5: Dedupe, Validate, Export to CSV

  1. Deduplicate by address + price + beds + baths (compound key).
  2. Validate ranges: price 50k-50M, beds 0-10, baths 0-10, sqft 200-20k. Flag outliers for manual review.
  3. Enrich with geocoding: free OpenStreetMap Nominatim API (1 request/sec) for lat/lng, walk score, school ratings.
  4. Export: pandas.DataFrame(records).to_csv('listings.csv', index=False). Include source URL, capture timestamp, extraction method per field for auditability.

Comparison: Free AI Vision Tools for Real Estate Scraping

Each tool serves a distinct extraction layer — OCR for text, Vision API for layout, LLM for reasoning. Combine all three for maximum coverage.

Tool Free Tier Limit Best For
Tesseract 5.x (local) Unlimited Body text, agent remarks, photo overlays — 800ms/image, zero cost
Google Cloud Vision API 1,000 units/month MLS tables, columnar data, object detection in property photos
GPT-4V (OpenAI free credits) $5 ≈ 2,500 calls Complex reasoning: condition assessment, renovation detection, ambiguous fields
Llama 3.2-Vision 11B (Ollama local) Unlimited (hardware-dependent) Sustained production: 92% accuracy, 1.2s/image on M1, private data
Playwright + CDP Unlimited Authenticated screenshots, lazy-load handling, bot detection bypass

Mistakes That Kill Free-Tier Pipelines

Mistake: Skipping Persistent Browser Context

Why It Hurts: Fresh contexts trigger CAPTCHAs on every request. Zillow serves reCAPTCHA v3 to headless Chrome without cookies. Fix: Use launchPersistentContext with a dedicated user data directory. Login once manually, then reuse — cookies persist across runs.

Mistake: Sending Full-Page Screenshots to Vision LLMs

Why It Hurts: GPT-4V and Llama 3.2-Vision downscale images to 512x512 or 1024x1024. A 1920x8000 full-page shot loses listing-card detail. Fix: Crop screenshots to individual listing cards using Playwright's locator.screenshot() before sending to LLM. Keep full-page only for OCR/Vision API which handle native resolution.

Mistake: No Validation Layer Before CSV Export

Why It Hurts: LLMs hallucinate: "3.5 baths" becomes 35, "$1,250,000" becomes 125000000. One bad record poisons analysis. Fix: Enforce JSON schema with Pydantic/Zod, apply range checks (price 50k-50M, beds 0-10), flag any field where OCR, Vision, and LLM disagree by >10%.

Mistake: Ignoring robots.txt and ToS While Claiming "Public Data"

Why It Hurts: hiQ v. LinkedIn protects access to public data, not unrestricted use. Zillow's ToS §12 prohibits scraping for competitive products. Fix: Scrape only for personal research/internal analysis. Add User-Agent: ResearchBot/1.0 (+your@email.com). Respect robots.txt crawl-delay. Document purpose in code comments.

Pro Tips

  • Cache screenshots locally — re-run extraction with improved prompts without re-capturing. 500 listings ≈ 2.5 GB PNG.
  • Use Vision API's IMAGE_PROPERTIES to detect dominant colors — flags "staged" vs "vacant" photos automatically.
  • Chain prompts: first extract raw fields, second normalize (e.g., "2 car garage" → garage_spaces: 2), third enrich (walk score, flood zone).
  • Monitor free-tier usage daily — Google Vision emails at 80% quota. Set Cloud Function alert to pause pipeline at 950 units.
  • Version your prompts — store prompt hash with each record. When accuracy drifts, diff prompts to find regression.

FAQ

Is scraping real estate listings legal?

Accessing publicly listed data via automated means is generally permissible under the hiQ Labs v. LinkedIn precedent (9th Cir. 2022). However, terms of service may prohibit competitive use or republication. Scrape for personal research, respect robots.txt crawl-delay, and identify your bot with a legitimate User-Agent string containing contact info.

Which free vision model is best for property photos?

Llama 3.2-Vision 11B via Ollama offers the best balance: unlimited local inference, 92% field extraction accuracy on Zillow screenshots, and no data leaves your machine. GPT-4V scores ~95% but requires paid credits after the $5 trial. For pure OCR, Tesseract 5.x beats both on text-dense MLS tables.

How do I handle infinite scroll on listing pages?

Use Playwright's page.keyboard.press('End') in a loop with waitForTimeout(1500) between scrolls. Track listing count; stop when no new cards appear for 3 consecutive scrolls. Zillow loads ~20 cards per scroll; 60 listings takes ~3 scrolls.

Why does my LLM output invalid JSON?

Multimodal models occasionally omit braces or add commentary. Fix: use format: "json" parameter in Ollama, set temperature to 0.1, and wrap in a retry loop that validates against a Pydantic/Zod schema. If parse fails, re-prompt with "Return ONLY valid JSON matching this schema:" + schema.

Will AI vision scraping still work in 2025?

Yes. Vision models improve monthly — Llama 4, GPT-5, and Gemini 2 will raise accuracy toward 99%. Sites may add visual watermarks or dynamic layouts, but pixel-based extraction adapts faster than selector maintenance. The arms race favors vision: updating a prompt takes minutes; rewriting 50 CSS selectors takes hours.

Conclusion

AI vision scraping shifts the bottleneck from brittle selectors to prompt engineering — a trade that pays compounding dividends as models improve. The free-tier stack (Playwright + Tesseract + Google Vision + local Llama 3.2-Vision) handles 500+ listings monthly at $0, extracting 15+ structured fields including visual-only data like floor plans and photo amenities. Start with one market, validate 50 listings against manual entry, then scale. The pipeline you build today runs on better models tomorrow without code changes.

  • Persistent browser context + full-page screenshots bypass bot detection entirely
  • Layer OCR → Vision API → LLM for 95%+ field accuracy on messy real estate data
  • Local Llama 3.2-Vision eliminates API costs and privacy concerns for production
  • Validate every field with schema + range checks before CSV export — one hallucination ruins analysis

Sources

Share:

0 comments:

Post a Comment