האתגר המרכזי: אינדקס של כאוס
הטעות הראשונה היא לחשוב על 'אינדקס רשויות' כיחידה אחת. זה לא. זה שער לכ-250+ רשויות מקומיות, שלכל אחת יש אתר, תבנית עיצוב, ולעיתים קרובות גם תשתית משלה. חלקן רצות על מערכות מודרניות, אחרות נראות כאילו נתקעו ב-2005. המשמעות היא שאין תבנית אחת (template) שאפשר לבנות עבורה scraper. תנסו לחלץ 'שמות מוצרים/מודעות' ותגלו שברשות אחת זה תג <h2>, באחרת זה <span> עם קלאס ספציפי, ובשלישית זה בכלל חלק מטקסט רציף בתוך <div>.
הגישה הנאיבית של כתיבת סלקטור CSS יחיד נכשלת אחרי הרשות השנייה. הפתרון הוא לא לכתוב 250 scrapers שונים, אלא לבנות פרסר (parser) חכם וגמיש. אנחנו מדברים על מערכת שיודעת לנסות מספר סלקטורים לפי סדר עדיפות, לחפש טקסט לפי דפוסים (regex), ולהשתמש ב-fallbacks. למשל, אם selector_A נכשל, נסה את selector_B, ואם גם הוא נכשל, תייג את הדף לבדיקה ידנית. בניית לוגיקה כזו מראש חוסכת שבועות של תחזוקה ותיקונים. המטרה היא להגיע לכיסוי של 95% מהרשויות באופן אוטומטי, ולהתמודד עם ה-5% הנותרים באופן פרטני. זה הבסיס לכל פרויקט איסוף קטלוג אינדקס רשויות שבאמת עובד.
מתי Playwright מנצח ואיפה requests מספיק
הרבה מהנדסים קופצים ישר לכלים הכבדים כמו Playwright או Puppeteer. לפעמים זה הכרחי, אבל בפרויקט כמו אינדקס רשויות, זו יכולה להיות טעות יקרה במשאבים. חלק גדול מהאתרים של הרשויות הם עדיין Server-Side Rendered. הם פשוטים. בקשת GET רגילה עם requests או HTTPX תחזיר את כל ה-HTML שאתם צריכים, ב-latency של 200ms במקום 2-3 שניות של דפדפן מלא.
אז איך מחליטים? המפתח הוא זיהוי דינמי. ה-scraper הראשי צריך לשלוח בקשת GET פשוטה קודם. אחרי קבלת ה-HTML, הוא בודק אם הנתונים המרכזיים קיימים. אם כן, מעולה – ממשיכים עם הפרסר. אם ה-HTML ריק מתוכן ומכיל בעיקר תגי <script>, זה סימן ברור שהדף דורש הרצת JavaScript. רק במקרה הזה, הבקשה נשלחת לתור עבודה נפרד שמטופל על ידי worker-ים של Playwright. הגישה ההיברידית הזו מאפשרת לנו לעבד כ-80% מהדפים במהירות שיא ובעלות משאבים נמוכה, תוך שימוש בדפדפן מלא רק כשחייבים. אם אתם מתמודדים עם דפים כאלה, ודאו שאתם משתמשים בטכניקות הנכונות, כפי שמפורט ב-מדריך Playwright stealth, כדי להימנע מזיהוי.
קצב, פרוקסים וטביעת רגל דיגיטלית
אתרים ממשלתיים אולי לא משתמשים במערכות הגנה מתוחכמות כמו Cloudflare Bot Management, אבל התשתיות שלהם לעיתים ישנות ורגישות לעומס. הפצצה של אתר כזה באלפי בקשות בדקה היא דרך בטוחה לקבל חסימת IP או אפילו להפיל שירות ציבורי. כאן האחריות היא עלינו.
הכלל הוא לעבוד לאט ובצורה מבוזרת. אנחנו מגבילים כל IP בודד ללא יותר מ-15-20 בקשות בדקה. כדי להגיע לסריקה מלאה של אלפי דפים מדי יום, אנחנו משתמשים ב-proxy rotation. אבל לא כל פרוקסי מתאים. פרוקסים של דאטה סנטר (DC) ייחסמו מהר מאוד. הפתרון הוא רשת של פרוקסים ממקורות אמינים. אם אתם לא בטוחים מאיפה להתחיל, כדאי לקרוא איך לבחור פרוקסי residential כדי להבין את ההבדלים. המטרה היא לא להיראות כמו סקריפט אוטומטי, אלא לחקות התנהגות של עשרות משתמשים שונים שגולשים באתר בקצב סביר. זה קריטי במיוחד עבור מעקב מלאי/זמינות אינדקס רשויות, שדורש בדיקות תכופות לאורך היום.
הפיכת הדאטה הגולמי ל-API שמיש
איסוף הנתונים הוא רק חצי מהעבודה. קיבלתם ערב רב של HTML, JSON חלקי וטקסט לא מובנה. השלב הבא, והחשוב לא פחות, הוא ניקוי, נרמול וסטנדרטיזציה. זה השלב שבו פרויקט API / קובץ נתונים אינדקס רשויות הופך ממאגר מידע גולמי למוצר בעל ערך. התהליך, המכונה ETL (Extract, Transform, Load), חייב להיות חזק.
השלב הראשון הוא נרמול שדות. לדוגמה, שדה 'קטגוריה' יכול להופיע כ-'ארנונה ועסקים', 'ארנונה', או 'מיסים לעסקים' ברשויות שונות. צריך למפות את כל הווריאציות האלה לערך סטנדרטי אחד, למשל 'ארנונה'. אותו דבר לגבי תאריכים, כתובות ומספרים. השלב השני הוא העשרה (enrichment). אפשר להוסיף לכל רשות מידע גיאוגרפי (קודי אזור, קואורדינטות) ממקור חיצוני. לבסוף, כל המידע הנקי והמובנה הזה נטען למסד נתונים – PostgreSQL הוא בחירה מצוינת פה – ונחשף דרך API פנימי. רק כשהנתונים עוברים את כל התהליך הזה, אפשר באמת להשתמש בהם לניתוחים, כמו ניטור מחירים אינדקס רשויות (למשל, השוואת תעריפי ארנונה) או לצרכי מודיעין מתחרים בין גופים שונים.
איפה הגישה הזו לא תעבוד (ולמה זה בסדר)
חשוב להיות ריאליים. הגישה שתיארתי לא תשיג 100% כיסוי מהיום הראשון, וזה בסדר גמור. תמיד יהיו את ה-5% הבעייתיים: רשויות עם מערכות סגורות שדורשות הזדהות, אתרים ישנים שמסתמכים על טכנולוגיות כמו аплеты של Java או Flash, או כאלה שמגישים קבצי PDF סרוקים במקום טקסט. הניסיון לבנות פתרון אוטומטי לכל מקרי הקצה האלה הוא בזבוז זמן ומאמץ. התשואה על ההשקעה פשוט לא שם.
במקרים האלה, הפתרון הוא לא טכנולוגי אלא תפעולי. אנחנו מזהים את הדפים הבעייתיים אוטומטית (למשל, לפי כותרת HTTP שמכילה Content-Type: application/pdf או כישלון של כל הפרסרים) ומנתבים אותם לתהליך חצי-ידני. זה לא אומר לוותר, אלא לבחור את הכלים הנכונים למשימה. במקום לנסות לפצח CAPTCHA מורכב, לפעמים יעיל יותר לשלוח את המשימה לממשק פנימי שבו מפעיל אנושי יכול להשלים את החסר. המטרה היא מערכת שעובדת ב-95% מהזמן באופן אוטומטי, ויודעת לבקש עזרה כשהיא נתקלת בקיר. הניסיון להגיע ל-100% אוטומציה הוא מתכון בטוח לתסכול ולפרויקט שלא נגמר.
