כל הפרויקטים

סקרייפר נדל"ן מסחרי של Crexi

עקיפת Cloudflare + חילוץ __NEXT_DATA__ של Next.js + API chaining לפרטי נכסי CRE מלאים מ-Crexi.

המטרה

למשוך נכסי retail CRE מלאים מ-Crexi לאזור Washington State עם פרטים פר-נכס (ייעוד, תמחור, שטח, חכירה) — דרך Cloudflare ו-Next.js hydration.

הפתרון

Pipeline תלת-שכבתי ב-Python: cloudflare_utils.py פותר את Cloudflare; crexi_search.py מחלץ נכסים מ-__NEXT_DATA__; crexi_properties.py צולל לפרטים של כל נכס. crexi_pipeline.py מתזמר, crexi_api_probe.py שימש בגילוי.

עיקרי הדברים

  • עקיפת Cloudflare שומרת session של Playwright לכל הקריאות
  • המתנה ל-hydration מסלקת סקרייפינג של שלד ריק
  • API פנימי של Crexi שהוסגר חושף מטא-דאטה מלא

האתגר

Crexi מוגן ב-Cloudflare Turnstile — requests פשוטים מקבלים 403.

solve_cloudflare_checkbox() דרך Playwright פותר את ה-challenge; ה-session נשמר לנווט הבא.

דף החיפוש מרנדר רק דרך __NEXT_DATA__ אחרי hydration — קריאה מוקדמת מחזירה שלד ריק.

wait_for_home_ready() סוקר את window.__NEXT_DATA__ && window.__NEXT_DATA__.props עם timeout 60s — משומש גם ב-detail fetcher.

תוצאות החיפוש חסרות פרטים — ייעוד, פיננסים, תנאי חכירה רק בדף הנכס.

Pipeline דו-שלבי: חיפוש → רשימת IDs → משיכת פרטים לכל נכס; כל שלב כותב sample ל-audit.

Crexi לא מתעדת את ה-API; דרוש גילוי.

crexi_api_probe.py לכד והדפיס תגובות גולמיות בשלב הגילוי ונשאר ברפו כ-documentation.

מה נמסר

  • crexi_pipeline.py
  • crexi_search.py
  • crexi_properties.py
  • cloudflare_utils.py
  • crexi_api_probe.py
  • debug_utils.py, logger.py
  • Samples (crexi_property_sample.json, crexi_search_sample.json)
  • requirements.txt

תוצאות

Cloudflare

עקיפה

Detail API

העשרה

Map-bounded

כיסוי

מה זה לימד אותי

  • לאתרי Next.js, המתנה ל-__NEXT_DATA__.props היא ניצחון האמינות הגדול
  • עקיפת Cloudflare דרך דפדפן אמיתי + שיתוף session היא הדפוס העמיד
  • Probe script כ-documentation חוסך שעות כשהסכמה משתנה