דלגו לתוכן
EN
באוויר2025-היוםמהנדס

BaliProp

מודעות להשכרה ולמכירה מעשרה מקורות נדל״ן בבאלי, מאוחדות על מפה אחת עם חיפוש

13,246מודעות במשיכת הנתונים האחרונה

The listing grid with filter bounds derived from the data itself
The map view with every listing clustered across the island

הבעיה

מי שמחפש דירה להשכרה ארוכת טווח בבאלי צריך לעבור על תריסר אתרים של סוכנויות, כל אחד בפורמט אחר, עם מודעות כפולות ובלי פילטרים משותפים. המחירים מופיעים בשלושה מטבעות ולשתי תקופות השכרה שונות. אותה וילה מפורסמת אצל ארבע סוכנויות בארבעה מחירים. בניתי את זה כדי לפתור את החיפוש שלי, ופשוט המשכתי.

מה בניתי

BaliProp היא אפליקציית React שיושבת מעל צינור scraping ב-Python ו-PostgreSQL. היא מגישה 13,246 מודעות שמאוחדות מעשרה מקורות, עם מפה מקובצת, פילטרים של מחיר וגודל שנגזרים בזמן אמת מהנתונים עצמם, מעבר בין מטבעות ובין מחיר חודשי לשנתי, רשימות שמורות ומאורכבות, וייצוא של רשימה מקוצרת ל-PDF לפנייה לסוכנים.

צינור ה-scraping

עשרה scrapers מזינים מסד נתונים אחד, וכל אחד מהם בנוי סביב המוזרויות של מקור אחד: פידים נקיים של נתונים, דפי HTML מבולגנים, אתרי WordPress וכמה מודעות שבחרתי ידנית. כל אחד עוקב מתי מודעה הופיעה לראשונה ומתי נראתה בפעם האחרונה.

החלק החשוב הוא ההתנהגות כשמשהו נכשל. ריצה שנכשלה שומרת את תמונת המצב הקודמת, כך שמקור שנפל או ששינה את ה-markup שלו אף פעם לא מרוקן את האפליקציה. סקריפט update.py יומי מתזמר את ה-scraping, הורדת התמונות, האיחוד והפרסום לתוך payload של שורה אחת בטבלת app_data, שה-API ב-Express מגיש בבקשה אחת.

איחוד בזהירות

אותה וילה שמפורסמת מחדש אצל שתי סוכנויות מתאחדת רק על סמך שני סימנים:

  • טביעת אצבע של תמונות, שמזהה את אותה תמונת וילה גם אחרי שאתר חתך אותה או שינה את הגודל שלה
  • חפיפה מדויקת של קואורדינטות, בטווח של 15 עד 40 מטר

אף פעם לא לפי כותרת או מחיר. חוסר הסימטריה הזה מכוון: להציג כפילות זה מטרד קטן, להסתיר וילה שהיא באמת נפרדת זה כישלון אמיתי. אחרי האיחוד, כל כרטיס מתיישב על הערך הטוב ביותר שיש: לוקח את המחיר הזול ביותר ומציג את טווח המחירים, מעדיף קואורדינטות מדויקות על פני משוערות, ממלא כל שדה מהמקור העשיר ביותר ומאחד את גלריות התמונות. כל כתובת URL של מודעה מקורית נשמרת כקישור "מופיע גם ב", כך ששום דבר שמקור תרם לא הולך לאיבוד.

שכבת האפליקציה

סליידרים של מחיר וגודל מתאימים את עצמם למה שיש בנתונים, כך שהוספה של מקור חדש עם טווחים אחרים לא מחייבת לבנות מחדש את הפילטרים. אפשר לסנן לפי אזור, חדרי שינה, חדרי רחצה, שטח בנוי, שטח מגרש, תקופת השכרה וסוג נכס, או לחפש בטקסט חופשי. מועדפים ומודעות מאורכבות נשמרים על המכשיר שלכם.

תצוגת המפה: כל המודעות מקובצות על פני האי, בצבע לפי אזור

הפרודקשן רץ על Firebase Hosting, עם תמונות ממוזערות ב-Cloud Storage. הוספת מקור חדש פירושה מודול scraper חדש אחד, לא מיגרציה של הסכמה.

רוצים לדבר על המוצר הזה?