בקצרה
איש מקצוע בנדל"ן רצה לקבל את כל שוק המודעות בארץ כטבלה, במקום לדפדף בשני אתרים עמוד אחרי עמוד. בניתי כלי שאוסף את כל מודעות המכירה וההשכרה מיד2 וממדלן, כ-167,000 מודעות ו-1,070 פרויקטים חדשים, לקובץ אקסל אחד בתוך כשעה וחצי. הקובץ גם מראה עד כמה הוא שלם ועד כמה הוא מדויק, בבדיקה מול האתרים עצמם, כך שאפשר לסמוך עליו.
סרטון הדגמה
המצב לפני
יד2 ומדלן מציגים מודעות עמוד אחרי עמוד, עם סינונים שנבנו למי שמחפש דירה אחת. מי שצריך את השוק כולו, כדי להשוות מחירים לפי שכונה, לראות מודעות חדשות ראשון או לעקוב אחרי ירידות מחיר, נשאר עם העתקה ידנית של מודעות או עם תמונה חלקית.
מה נבנה
כלי שמופעל לפי דרישה, עובר על שני האתרים בכל הארץ וכותב כל מודעה לקובץ אקסל: גיליון ליד2, גיליון למדלן וגיליון לפרויקטים החדשים בכל אתר. כל שורה היא מודעה אחת, עם עד 60 עמודות: עיר, שכונה, רחוב, מחיר מבוקש, מחיר קודם, חדרים, קומה, שטח, מצב הנכס, חניה, ממ"ד, מעלית, תאריך פרסום, פרטי או תיווך, טקסט המודעה וקישור שפותח אותה. בשורות של מדלן יש גם את ציוני השכונה ואת שכר הדירה והתשואה המשוערים שהאתר מציג. שני גיליונות נוספים מדווחים על כיסוי (כמה מודעות נאספו מול כמה שכל אתר אומר שיש לו) ועל דיוק (מדגם אקראי של מודעות שנפתחו באתר והושוו שדה אחרי שדה). ריצה שנעצרה באמצע ממשיכה מאותה נקודה, ולכן ריצה שנייה כעבור שבועיים נותנת את אותן עמודות באותו מבנה.
מה זה שינה לעסק
- כ-122,000 מודעות יד2, 45,000 מודעות מדלן ו-1,070 פרויקטים חדשים בקובץ אחד
- כל הארץ בריצה אחת של כשעה וחצי
- בין 99.1% ל-100% מהמודעות שכל אתר מדווח, לכל אזור ולכל סוג עסקה
- 420 מתוך 420 שדות שנבדקו תאמו את מה שמופיע בעמוד המודעה
- סינון לפי עיר, מחיר או חדרים באקסל עצמו: חיפה לבדה היא 6,401 שורות
זה מתאים לכם אם
- אתם מתווכים, שמאים, משקיעים או יזמים שצריכים מחירי שוק לפי אזור, ולא מודעה אחרי מודעה
- אתם רוצים לראות מודעות חדשות או ירידות מחיר לפני אחרים
- אתם כבר עובדים באקסל ורוצים את הנתונים שם, עם העמודות שתבחרו
- אתם צריכים את אותם נתונים שוב כל שבוע או שבועיים, באותו פורמט
צריכים משהו דומה?
ספרו לי מה אתם צריכים, ונבדוק יחד בשיחה קצרה אם ואיך אפשר לבנות את זה.
גלריה
שאלות נפוצות
אפשר לקבל רק עיר אחת או רק סוג נכס אחד?
כן. הריצה המלאה מכסה את כל הארץ, ואותו כלי יכול לרוץ על סינון שתגדירו, כמו עיר אחת, מכירה בלבד, טווח מחירים או מספר חדרים. העמודות נקבעות מראש לפי טבלת דוגמה, לפני הריצה הראשונה.
האם בקובץ יש את הטלפון של המפרסם?
בקובץ יש קישור לכל מודעה, שפותח אותה ביד2 או במדלן, ועמודה שאומרת אם המודעה פרטית או מתיווך. בדוגמה שבעמוד הזה הוסרו שמות מפרסמים ומספרי טלפון.
איך יודעים שהנתונים נכונים?
הקובץ בודק את עצמו. גיליון אחד משווה את מספר המודעות שנאספו למספר שכל אתר מציג לאותו חיפוש, לכל אזור. גיליון אחר פותח מדגם אקראי של מודעות באתר ומשווה כל שדה לקובץ. בריצה הראשונה, כל שדה שנבדק ומוצג בעמוד המודעה תאם.
אפשר לאסוף גם מאתרים אחרים?
הפרויקט הזה מכסה את יד2 ומדלן. בניתי גם כלי איסוף להומלס ולאתרי נדל"ן ורכב במדינות אחרות, כך שאתר נוסף הוא בדרך כלל עוד כלי איסוף שנכנס לאותו קובץ.
פרטים טכנייםאיך זה בנוי, למי שרוצה לדעת
הפתרון
סורק שאפשר להפסיק ולהמשיך, שעובר על שני האתרים בכל הארץ: ביד2 דרך נקודות הקצה של האתר עצמו (מפת המודעות מפוצלת לפי אזור, מחיר וחדרים עד שאף פרוסה לא נחתכת, ואז קריאת פרטים אחת לכל מודעה), ובמדלן דרך מפות האתר הציבוריות ו-GraphQL באצוות של 100 מודעות. כל רשומה נכתבת ל-SQLite ברגע שהיא מגיעה, ולכן ריצה שנעצרה ממשיכה מאותה נקודה. שלב נפרד בונה את קובץ האקסל: גיליון לכל מקור וסוג, קישור למודעה בעמודה B, גיליון כיסוי שמשווה את מה שנאסף לסך שכל אתר מדווח לאותו חיפוש, וגיליון דיוק שפותח מדגם אקראי של מודעות באתר עצמו ובודק את הערכים מול הקובץ. הריצה המלאה הראשונה לקחה כשעה וחצי.
עיקרי הדברים
- כ-122,000 מודעות יד2, 45,000 מודעות מדלן ו-1,070 פרויקטים חדשים בריצה אחת של כשעה וחצי
- כיסוי של 99.1% עד 100% מול הסכומים שהאתרים עצמם מדווחים
- 420 מתוך 420 שדות מוצגים תאמו בבדיקת דיוק אקראית מול האתר
האתגר
ה-API של מפת יד2 מחזיר עד 200 מודעות לבקשה, ובארץ יש הרבה יותר מ-100,000.
האינדקס מפצל כל אזור לפי מחיר ואחר כך לפי חדרים עד שכל פרוסה מתחת לתקרה, ורושם כל פרוסה שעדיין נחתכת, כך שפער נראה לעין ולא שקט.
שני האתרים מפעילים הגנה מבוטים, ובקשות HTTP פשוטות מקבלות דף אתגר.
פרופיל Chrome קבוע לכל אתר עובר את הבדיקה פעם אחת, וכל בקשת נתונים רצה כ-fetch בתוך אותו עמוד עם העוגיות שלו. חסימה מפעילה השהיה שגדלה וחימום מחדש, וחסימות חוזרות עוצרות את הריצה במקום להציף את האתר.
קובץ עם 170,000 שורות חסר ערך אם אי אפשר לדעת עד כמה הוא שלם ועד כמה הוא מדויק.
גיליון הכיסוי משווה את המודעות שנאספו לסך שכל אתר מדווח לכל אזור וסוג עסקה (בין 99.1% ל-100% בריצה הראשונה). גיליון הדיוק פותח מדגם אקראי באתר ומשווה 423 שדות: כל 420 השדות שהעמוד מציג תאמו.
אקסל מתייחס לטקסט שמתחיל ב-= כנוסחה ופוסל תווי בקרה, ותיאורי מודעות מכילים את שניהם.
שלב ניקוי יחיד מנטרל תווי נוסחה בתחילת טקסט ומסיר תווים אסורים; רק קישור המודעה נכתב כנוסחה, כשה-URL נשמר גם כערך המטמון שלה.
מה נמסר
- סקרייפרים ב-Python ליד2 ולמדלן, עם המשך מנקודת העצירה
- בונה אקסל עם גיליונות כיסוי ודיוק
- הקובץ שנמסר, ודגימה שאפשר להוריד כאן
תוצאות
122,243
מודעות יד2
45,079
מודעות מדלן
1,072
פרויקטים חדשים
420/420
דיוק שדות
מה זה לימד אותי
- לספור מול הסך של האתר עצמו לפני שסומכים על סריקה
- לשמור כל רשומה ברגע שהיא מגיעה, כך שחסימה עולה דקות ולא את כל הריצה
- לבדוק דיוק בעמוד החי ולא מול הפרסר שלך





