דלג לתוכן הראשי
scraping.
חזרה לכל המאמרים

Reverse Engineering של APIs פנימיים: המדריך המלא ל-Scraping מקצועי

8 במאי 20268 דק׳ קריאה
איור מופשט של דיאגרמת רשת עם צמתים וקווים המייצגים קריאות API וזרימת נתונים

למה אתם מבזבזים את הזמן על גירוד HTML?

בואו נדבר ישר. רוב ה-web scrapers שאתם כותבים כנראה עושים עבודה כפולה. אתם מורידים דף HTML שלם, עם כל ה-CSS, ה-JavaScript, התמונות. אתם מריצים מנוע רינדור כבד כמו Playwright או Selenium. ואז, אתם מפעילים parser מסורבל כדי לחפש `div` עם `class` ספציפי, בתקווה שהוא לא ישתנה במחר בבוקר.

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

מאחורי כל אתר מודרני שמציג נתונים דינמיים — רשימת מוצרים, תוצאות חיפוש, תגובות לפוסט — מסתתר API פנימי. ה-frontend (מה שאתם רואים בדפדפן) קורא ל-API הזה כדי לקבל נתונים נקיים בפורמט JSON. המשימה שלנו היא פשוטה: לעקוף את ה-frontend ולדבר ישירות עם ה-API. זה מהיר פי 10, יציב לאין שיעור, וצורכת 99% פחות רוחב פס.

איך מוצאים את מכרה הזהב? ה-Network Tab הוא החבר הכי טוב שלכם

השלב הראשון הוא הפשוט ביותר, ועדיין רוב האנשים לא עושים אותו. פתחו את כלי המפתחים (DevTools) בדפדפן שלכם. ב-Chrome זה F12 או Cmd+Option+I.

עכשיו, עברו ללשונית Network. זה המקום שבו הדפדפן רושם כל בקשת רשת שהוא מבצע. בהתחלה זה ייראה כמו רעש, אבל אנחנו צריכים פילטר אחד פשוט: Fetch/XHR.

בקשות XHR (XMLHttpRequest) ו-Fetch הן הדרך שבה JavaScript בדף מבקש נתונים מהשרת בלי לרענן את כל העמוד. זה בדיוק מה שאנחנו מחפשים. בצעו פעולה באתר שמעניינת אתכם: טענו עוד מוצרים, סננו תוצאות, עברו לעמוד הבא. אתם תראו בקשות חדשות מופיעות ברשימה. אחת מהן היא ה-API call שלנו.

חפשו בקשות שמחזירות JSON. לחצו על בקשה, עברו ללשונית Preview או Response, ותראו אם הנתונים שאתם רוצים נמצאים שם בצורה מובנית. מצאתם? מעולה. זה 80% מהעבודה.

שלב הפיצוח: הבנת הבקשה (The Request)

אחרי שמצאנו את ה-endpoint, אנחנו צריכים לדעת איך לשחזר את הבקשה בקוד שלנו, למשל עם Python וספריית `requests`. לחצו קליק ימני על הבקשה בלשונית ה-Network ובחרו "Copy as cURL". זה ייתן לכם פקודת command-line שמכילה את כל מה שצריך כדי לשחזר את הבקשה.

בואו נפרק את המרכיבים שלה:

1. כתובת ה-URL וה-Query Parameters

הכתובת עצמה תכיל לרוב פרמטרים ששולטים על הנתונים המוחזרים. לדוגמה:


https://api.example.com/products?category=electronics&page=2&limit=50

כאן קל לראות איך שולטים בעמוד (`page=2`), במספר התוצאות (`limit=50`) ובסינון (`category=electronics`). שינוי הפרמטרים האלה הוא הדרך שלנו לנווט בנתונים.

2. Headers: תעודת הזהות שלכם

ה-Headers הם החלק הקריטי ביותר. הם מספרים לשרת מי אתם ומה אתם רוצים. כמה Headers נפוצים שכדאי להכיר:

  • Authorization: לרוב מכיל Bearer Token (JWT). זה המפתח הראשי שלכם ל-API.
  • Cookie: מכיל את ה-session שלכם. לפעמים כל מה שצריך זה להעתיק את ה-cookie מהדפדפן.
  • x-csrf-token: מנגנון אבטחה נפוץ. לרוב צריך לחלץ אותו מה-HTML הראשוני של הדף או מ-cookie.
  • User-Agent: תמיד תעתיקו את ה-User-Agent של הדפדפן שלכם. שרתים רבים חוסמים בקשות בלי User-Agent סטנדרטי.

3. Body (עבור בקשות POST)

אם הבקשה היא מסוג POST (למשל, חיפוש מורכב), הפרמטרים לא יהיו ב-URL אלא בגוף הבקשה, לרוב בפורמט JSON.


{
  "query": "smartphones",
  "filters": {
    "brand": ["Apple", "Samsung"],
    "min_price": 1000
  },
  "sortBy": "popularity"
}

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

אימות (Authentication) והתמודדות עם Rate Limits

רוב ה-APIs המעניינים דורשים סוג כלשהו של אימות. בדרך כלל, זה אומר שתצטרכו לבצע קודם בקשת login עם שם משתמש וסיסמה. בתגובה לבקשה הזו, השרת יחזיר לכם cookie או Bearer Token. אתם צריכים לשמור את הערך הזה ולהוסיף אותו לכל הבקשות העתידיות שלכם ל-API.

אבל גם עם אימות, APIs פנימיים לא אוהבים שמפציצים אותם. סביר להניח שתתקלו במגבלת קצב (rate limit) שתתבטא בקוד סטטוס 429. בניגוד ל-HTML scraping, כאן המגבלות הן לרוב יותר ברורות ונדיבות. אם אתם מקבלים שגיאת 429, זה אומר שאתם צריכים להאט. אל תנסו להילחם בזה עם עוד proxies. פשוט תכבדו את ה-API. הוספת `time.sleep(1)` בין בקשות יכולה לפתור 90% מהבעיות. למידע נוסף על אסטרטגיות מתקדמות, קראו את המדריך שלנו על התמודדות עם שגיאות 429 ו-rate limiting.

כשאתם עובדים בסקייל גבוה, חשוב לתכנן את הגישה שלכם מראש. תכנון נכון של תורים, proxies, וניהול sessions הוא קריטי. תוכלו לקרוא עוד על ארכיטקטורת web scraping בסקייל במאמר הייעודי שלנו.

אבל רגע — זה לא תמיד כל כך פשוט

יש מקרים שבהם הגישה הזו נתקלת בקיר. זהו ה-failure scenario הקלאסי: חתימה דיגיטלית בצד הלקוח (Client-Side Signature).

דמיינו את התרחיש הבא: אתם מבודדים את קריאת ה-API, מעתיקים את כל ה-headers וה-body, מריצים את בקשת ה-cURL שלכם... ומקבלים 401 Unauthorized או 403 Forbidden. אתם משווים את הבקשה שלכם לבקשה המקורית מהדפדפן 20 פעם. הכל נראה זהה. מה קורה פה?

מה שקורה הוא שה-JavaScript של האתר מייצר "חתימה" דינמית לכל בקשה. זה יכול להיות header מיוחד כמו `x-request-signature` שהערך שלו הוא hash של רכיבים אחרים בבקשה (כמו ה-timestamp, ה-URL, וה-body) יחד עם "סוד" שמוטמע בקוד ה-JS. בכל פעם שאתם שולחים בקשה, החתימה משתנה.

כאן אין ברירה. צריך לצלול לתוך קוד ה-JavaScript המכווץ (minified) של האתר, לשים breakpoints בלשונית ה-Sources בכלי המפתחים, ולנסות לאתר את הפונקציה שמייצרת את החתימה. זה תהליך מייגע של reverse engineering אמיתי. לפעמים זה לוקח שעות, לפעמים ימים. במקרים כאלה, צריך לשאול את עצמכם אם המאמץ שווה את זה, או שאולי חזרה ל-scraping מבוסס דפדפן מלא עם כלים כמו Playwright היא הפתרון הפרגמטי יותר.

סיכום: תפסיקו לעבוד קשה, תתחילו לעבוד חכם

גירוד HTML הוא כמו לנסות לקרוא ספר דרך משקפת מהצד השני של החדר. גישה ישירה ל-API הפנימי היא כמו לקבל את קובץ ה-Word המקורי של הספר. הנתונים מגיעים אליכם נקיים, מובנים, ובלי כל הרעש מסביב.

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

שאלות נפוצות

התמודדות עם תוקף של טוקנים דורשת אוטומציה של תהליך האימות. הפתרון הוא לכתוב פונקציה שמבצעת את בקשת ה-login עם שם המשתמש והסיסמה, מחלצת את הטוקן החדש מהתגובה, ושומרת אותו. לפני כל בקשת API, הסקריפט שלך צריך לבדוק אם הוא מקבל שגיאת 401 (Unauthorized). אם כן, הוא יקרא לפונקציית הרענון, יקבל טוקן חדש, וינסה לבצע את הבקשה המקורית שוב. זהו דפוס נפוץ שנקרא "Token Refresh Flow".

השאלה המשפטית מורכבת ותלויה בתנאי השימוש של האתר ובחוקי המדינה. גישה ל-API פנימי אינה שונה מהותית מגישה לדפי HTML, כל עוד אינך עוקף אמצעי הגנה הדורשים אימות (כמו login). אם הנתונים זמינים ציבורית דרך האתר, גישה אליהם דרך ה-API נחשבת לרוב בתחום האפור. חשוב לפעול באחריות: לא להעמיס על השרתים, לכבד קבצי robots.txt (למרות שהם פחות רלוונטיים ל-API), ולהימנע מאיסוף מידע אישי ורגיש.

API ציבורי מיועד ומתוכנן לשימוש על ידי מפתחים חיצוניים. יש לו תיעוד מסודר, מפתחות גישה (API keys) ייעודיים, ומדיניות שימוש ברורה. דוגמאות כוללות את ה-API של טוויטר או גוגל מפות. API פנימי, לעומת זאת, נוצר אך ורק כדי לשרת את ה-frontend של האתר עצמו. אין לו תיעוד, הוא יכול להשתנות ללא הודעה מוקדמת, והגישה אליו מתבצעת לרוב עם session cookies או טוקנים זמניים. אנחנו מתמקדים בפיצוח ה-API הפנימי כי רוב האתרים לא מציעים API ציבורי.

זו אחת הבעיות המאתגרות ביותר, המכונה client-side hashing או encryption. במצב זה, תצטרך לבצע reverse engineering לקוד ה-JavaScript של האתר. השתמש בלשונית ה-Sources בכלי המפתחים של הדפדפן כדי לחפש את הקוד שיוצר את הבקשה. חפש מילות מפתח כמו `encrypt`, `hash`, `signature` או את שם הפרמטר המוצפן. תצטרך להבין את הלוגיקה ולשכתב אותה בשפת התכנות שלך (למשל, Python) או להשתמש בספרייה כמו PyExecJS כדי להריץ את קוד ה-JavaScript המקורי ישירות מהסקריפט שלך.

הכלי החשוב ביותר הוא לשונית ה-Network בדפדפן שלך. לאחר מכן, כדי לבדוק ולשחק עם הבקשות מחוץ לדפדפן, Postman הוא כלי מצוין עם ממשק גרפי נוח. כשאתה מוכן לכתוב קוד, בפייתון הספריות `requests` ו-`httpx` (לפעולות אסינכרוניות) הן הסטנדרט. הן מאפשרות לך לשלוט באופן מלא על ה-headers, ה-cookies וה-body של הבקשה. עבור תרחישים מורכבים יותר שדורשים הרצת JavaScript, כלים כמו Playwright יכולים לעזור ליירט ולנתח את בקשות ה-API באופן אוטומטי.

אהבתם את הכתבה? הצטרפו לניוזלטר ה-AI.

סיכום שבועי של כל מה שחדש ב-AI, פרומפטים מעשיים וביקורות כלים — ישר למייל שלכם.

הירשמו עכשיו

עוד לקריאה