המטרה
למשוך נכסי 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 חוסך שעות כשהסכמה משתנה
