מה למדתי מגריפת 10,000 מוצרים מהסופר
5 בפברואר 2026 · 9 דק׳ קריאה
הלב של PriceGuess הוא הנתונים. בלי מוצרים אמיתיים עם מחירים אמיתיים, המשחק הוא חסר משמעות. בפוסט הזה אני הולך לספר על איך בנינו את מערכת הסקרייפינג — ועל הבעיות המוזרות שגיליתי בנתוני מחירים של סופרמרקטים בישראל.
איפה מגיעים הנתונים?
בישראל, יש חובה חוקית על רשתות השיווק לפרסם את המחירים שלהן בפורמט פתוח. זה נקרא "פרויקט השקיפות" של הפיקוח על המזון. הנתונים זמינים כ-XML files שמתעדכנים מספר פעמים ביום. שופרסל, הרשת הגדולה בישראל, מפרסמת את המחירים באתר פתוח.
אבל יש פער בין "הנתונים זמינים" ל"הנתונים שמישים". קבצי ה-XML ענקיים (חלקם מעל 100MB), והם כוללים אלפי מוצרים שלא מתאימים למשחק — כמו מוצרים בלי תמונה, מוצרים עם מחיר 0, או מוצרים שהשם שלהם הוא קוד מספרי בלבד.
ה-CRON Worker
הסקרייפר שלנו רץ כ-Cloudflare CRON Worker — Worker שרץ באופן אוטומטי כל שעה. בכל הרצה הוא:
- בוחר קטגוריה אקראית (חלב, בשר, ירקות, חטיפים...)
- שולף רשימה של מוצרים מהקטגוריה
- מסנן מוצרים בלי תמונה, בלי מחיר, או עם שמות לא קריאים
- בוחר 10 מוצרים אקראיים מהרשימה המסוננת
- שומר אותם ב-D1 בטבלת
daily_challengesעם תאריך היום
באגים מוזרים שגיליתי
1. מוצרים שמשנים מחיר בלילה
חלק מהמוצרים משנים מחיר בין 00:00 ל-06:00. הסקרייפר רץ כל שעה, אז אם הוא גרף מוצר ב-23:00 עם מחיר של ₪12.90, ובבוקר המחיר כבר ₪14.90, השחקן מנסה לנחש מחיר שכבר לא נכון. הפתרון: ה-CRON שגורף את המוצרים לאתגר היומי רץ רק בין 06:00-22:00.
2. מוצרים עם משקל משתנה
בשר, גבינות, ופירות נמכרים לפי משקל. המחיר שמופיע ב-API הוא "מחיר לקילו" אבל מה שהלקוח משלם תלוי במשקל האריזה. זה יוצר בעיה: המחיר "אמיתי" אבל לא מה שהצרכן רגיל לשלם. הפתרון: סיננתי החוצה את כל המוצרים שנמכרים לפי משקל ולא לפי יחידה.
3. מוצרים במבצע
מבצעים בשופרסל יכולים להוריד מחיר ב-50% או יותר. אם הסקרייפר גורף מוצר במבצע, השחקן מקבל מוצר שנראה "נורמלי" אבל עם מחיר חצי ממה שהוא ציפה. הפתרון: אני לוקח את המחיר הרגיל (לפני הנחה) כשזמין, ואת מחיר המבצע רק כ-fallback.
הדוגמא הכי מצחיקה
פעם אחת, הסקרייפר גרף מוצר עם השם "שקית ניילון גדולה" ומחיר של ₪0.30. שחקנים ניחשו ₪5, ₪10, ₪15 — אף אחד לא חשב שמוצר יכול לעלות 30 אגורות. מאז אני מסנן מוצרים עם מחיר מתחת ל-₪2.
טיפים לסקרייפינג אחראי
- תכבדו rate limits — גם אם הנתונים פתוחים, אל תעמיסו על השרתים. הסקרייפר שלנו עושה בקשה אחת בכל הרצה.
- תשמרו cache — אין סיבה לגרוף את אותם נתונים פעמיים. אנחנו בודקים אם המוצר כבר קיים ב-D1 לפני שמירה.
- תתכוננו לשינויי API — שופרסל שינו את מבנה ה-API פעמיים מאז שהתחלנו. כל פעם שזה קורה, הסקרייפר שובר ואני צריך להתאים. לכן, יש לנו alerting ב-Cloudflare שמתריע אם ה-CRON נכשל.
- תסננו נתונים בקפדנות — נתונים גולמיים מלאים בזבל. עדיף פחות מוצרים באיכות גבוהה מהרבה מוצרים בעייתיים.