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

ניתוח בקשות רשת ב-DevTools: המדריך המלא ל-Web Scraping

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

למה רוב ה-scrapers שראיתי נכשלים?

ב-8 השנים שלי בתחום, ראיתי את אותה טעות חוזרת על עצמה מאות פעמים. מפתח מתחיל פרויקט scraping, פותח גוגל, ומוצא מדריך ל-Selenium או Playwright. הוא כותב קוד שמדמה משתמש: פותח דפדפן, מקליק על כפתורים, גולל, ומגרד HTML מהעמוד. זה עובד. בערך.

למשך עשר דקות. ואז זה נשבר.

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

הגישה הנכונה, ב-80% מהמקרים, היא לרדת שכבה אחת למטה. במקום לגרד את ה-HTML הסופי, אנחנו רוצים למצוא את בקשת הרשת המקורית שהביאה את הדאטה. שם נמצא הזהב.

פותחים את ה-DevTools: המכסה מנוע של הדפדפן

כל דפדפן מודרני מגיע עם סט כלים למפתחים (DevTools). הכלי החשוב ביותר עבורנו הוא לשונית ה-Network. תחשבו עליה כעל חדר הבקרה של כל התקשורת בין הדפדפן שלכם לשרתים באינטרנט. כל תמונה, כל קובץ CSS, כל פונט, וחשוב מכל — כל בקשת API — מתועדת שם.

כדי לפתוח אותה, פשוט לחצו F12 (או Ctrl+Shift+I ב-Windows, Cmd+Opt+I ב-Mac). עברו ללשונית "Network".

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

  • Fetch/XHR: אלו הן בקשות ה-API האסינכרוניות שדפים מודרניים משתמשים בהן כדי לטעון דאטה בלי לרענן את כל העמוד. כאן נמצא הדאטה ברוב המקרים.
  • Doc: מסנן את בקשות ה-HTML הראשיות של העמודים עצמם.
  • WS (WebSockets): לתקשורת דו-כיוונית בזמן אמת. פחות נפוץ ל-scraping קלאסי, אבל קריטי לאתרים עם עדכונים חיים (כמו מניות או צ'אטים).

התחילו תמיד עם סינון ל-Fetch/XHR. זה ינקה 95% מהרעש וישאיר אתכם עם הבקשות שבאמת מעניינות.

איך לזהות את הבקשת הקריטית שמביאה את הדאטה

בואו ניקח תרחיש קלאסי: אתר e-commerce עם גלילה אינסופית. אתה גולל למטה, ומוצרים חדשים נטענים. הם לא היו ב-HTML המקורי. איך מוצאים את הבקשה שטוענת אותם?

  1. פתחו את DevTools -> Network וסננו לפי Fetch/XHR.
  2. נקו את הלוג (אייקון הפח).
  3. גללו למטה בעמוד כדי לגרום לטעינת מוצרים חדשים.
  4. תראו בקשה חדשה שמופיעה ברשימה. זה כנראה החשוד המרכזי שלנו.

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

  • Headers: כל המטא-דאטה של הבקשה. ה-URL, מתודת ה-HTTP (GET/POST), סטטוס קוד, וחשוב מכל, ה-Request Headers (מה הדפדפן שלח) וה-Response Headers (מה השרת ענה).
  • Payload (או Request): אם זו בקשת POST, כאן תראו את הדאטה שנשלח לשרת. למשל, מספר העמוד הבא לטעינה.
  • Response: התשובה מהשרת. כאן אתם מצפים לראות את הדאטה הנקי שחיפשתם, לרוב בפורמט JSON.

אם מצאתם JSON עם רשימת המוצרים בטאב ה-Response, ניצחתם. עכשיו אתם יכולים לדמות את הבקשה הזו ישירות מהקוד שלכם, בלי דפדפן בכלל. הדרך הכי מהירה לבדוק את זה היא ללחוץ על הבקשה קליק ימני -> Copy -> Copy as cURL. הדביקו את זה בטרמינל ותראו אם אתם מקבלים את אותו JSON. אם כן, אתם בדרך הנכונה.


# דוגמה לפלט של "Copy as cURL" מאתר דמיוני
curl 'https://api.example.com/products?page=2&category=electronics' \
  -H 'accept: application/json' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...' \
  -H 'x-request-id: abc-123-def-456' 

מה זה קובץ HAR ולמה הוא חברך הטוב ביותר?

לפעמים, תהליך שלם מורכב מכמה בקשות רשת שתלויות אחת בשנייה. ניתוח שלהן אחת-אחת יכול להיות מייגע. כאן נכנס לתמונה קובץ HAR (HTTP Archive).

קובץ HAR הוא פשוט קובץ JSON שמכיל תיעוד מלא של כל בקשות הרשת שנעשו בפרק זמן מסוים. זה כמו להקליט סשן גלישה שלם. אתם יכולים לשמור את כל הפעילות בלשונית ה-Network לקובץ HAR (אייקון של חץ למטה) ולנתח אותו מאוחר יותר, או אפילו להשתמש בכלים אוטומטיים כדי להמיר אותו לקוד.

למה זה כל כך שימושי?

  • ניתוח Offline: אתם יכולים לשמור את ההקלטה ולנתח אותה בזמנכם החופשי, בלי להשאיר את האתר פתוח.
  • שיתוף עם הצוות: נתקלתם בבעיה? שלחו את קובץ ה-HAR לחבר צוות והוא יראה בדיוק את מה שאתם ראיתם.
  • המרה אוטומטית לקוד: ישנם כלים אונליין וספריות (כמו `har-to-py` בפייתון) שיכולות לקחת קובץ HAR ולהפיק ממנו קוד `requests` שמבצע את אותן הבקשות. זה חוסך שעות של עבודה ידנית.

ה-workflow שלי הוא כזה: אני מבצע את הפעולה באתר, שומר את ה-HAR, ואז מריץ עליו כלי אוטומטי כדי לקבל שלד ראשוני של קוד הפייתון. משם, אני רק צריך לנקות אותו ולהוסיף לוגיקה. זה מקצר את זמן הפיתוח הראשוני ב-50% לפחות.

אבל רגע — זה לא תמיד עובד

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

תרחיש כישלון קלאסי: אתה מזהה בקשת API, מעתיק אותה כ-cURL, מריץ אותה ומקבל שגיאת `403 Forbidden` או `401 Unauthorized`. אתה משווה את הבקשה שלך למקורית ב-DevTools ומגלה שיש header בשם `x-signature` עם ערך שנראה כמו hash ארוך ומשתנה בכל בקשה. אין לך מושג איך הוא נוצר.

זו הנקודה שבה ניתוח רשת פסיבי לא מספיק. תצטרכו לצלול לקוד ה-JavaScript של האתר (לשונית Sources ב-DevTools) ולנסות להבין את הלוגיקה שיוצרת את החתימה. זה תהליך של הנדסה הפוכה והוא יכול להיות מורכב מאוד, במיוחד אם הקוד ממוזער (minified) ומעורפל (obfuscated). מערכות כמו Cloudflare הן המומחיות בטכניקות כאלה. אם נתקלתם בחסימה כזו, המדריך שלנו על איך לעקוף את Cloudflare יכול לעזור לכם להבין את עומק האתגר.

מעבר לדפדפן: ניתוח תעבורה של אפליקציות מובייל

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

הכלים המרכזיים לכך הם פרוקסיז ליירוט תעבורה (intercepting proxies) כמו mitmproxy (קוד פתוח וחזק) או Charles Proxy (מסחרי עם UI נוח). הרעיון הוא להגדיר את רשת ה-WiFi של הטלפון שלכם כך שתעבור דרך המחשב שעליו רץ הפרוקסי. הפרוקסי יושב באמצע (Man-in-the-Middle), מפענח את תעבורת ה-HTTPS, ומציג לכם את כל בקשות ה-API שהאפליקציה מבצעת.

התהליך דורש התקנת תעודת אבטחה (root certificate) של הפרוקסי על המכשיר, מה שמאפשר לו לפענח את התעבורה המוצפנת. ברגע שזה עובד, אתם מקבלים ממשק דומה לטאב ה-Network ב-DevTools, אבל עבור כל תעבורת הרשת של המכשיר שלכם. משם, התהליך זהה: מזהים את הבקשה, מנתחים את ה-headers וה-payload, ומשחזרים אותה בקוד.

ה-Stack המנצח שלי לניתוח רשתות ב-2025

אחרי שנים של ניסוי וטעייה, זה ה-workflow שאני ממליץ עליו לכל פרויקט scraping חדש:

  1. התחל תמיד עם DevTools. אל תכתוב שורת קוד אחת לפני שאתה מבין איך האתר טוען את הדאטה שלו. חפש בקשות Fetch/XHR שמחזירות JSON. זה המצב האידיאלי.
  2. שכפל את הבקשה עם `requests` בפייתון. השתמש ב-"Copy as cURL" כדי לקבל את כל ה-headers הנכונים. אם זה עובד, בנית scraper מהיר, יעיל וצורך פחות מ-1% מהמשאבים של פתרון מבוסס דפדפן.
  3. אם הבקשה נכשלת בגלל חתימות, הערך את המצב. האם אתה יכול למצוא את הלוגיקה ב-JavaScript? אם זה ייקח יותר מכמה שעות, זה כנראה לא שווה את המאמץ.
  4. כשניתוח ישיר נכשל, ורק אז, עבור לפתרון מבוסס דפדפן. כלים כמו Playwright או Puppeteer הם חזקים, אבל הם צריכים להיות המוצא האחרון, לא ברירת המחדל. הם יאפשרו לכם לעקוף את הצורך בהנדסה הפוכה, אבל במחיר של ביצועים ותחזוקה גבוהים יותר.
  5. לאפליקציות מובייל, השתמש ב-mitmproxy. זה כלי חובה בארסנל של כל מהנדס scraping רציני.

הבנה עמוקה של שכבת הרשת היא מה שמבדיל בין scraper חובבני שרץ על מכונה אחת לבין ארכיטקטורת scraping בסקייל שיודעת להתמודד עם מיליוני בקשות ביום. תשקיעו את הזמן בללמוד את ה-DevTools. זה ישתלם לכם, ובגדול.

שאלות נפוצות

השתמש ב-Playwright רק כאשר ניתוח בקשות רשת ישיר נכשל, בעיקר באתרים המשתמשים בחתימות JavaScript מורכבות. אם בקשת API דורשת header כמו `x-csrf-token` שנוצר באופן דינמי וקשה לשחזר את לוגיקת היצירה שלו, פתרון מבוסס דפדפן הוא לרוב מהיר יותר לפיתוח. זהו מוצא אחרון, מכיוון שהוא צורך פי 100 יותר משאבים ונוטה יותר להישבר.

ניתוח חי ב-DevTools הוא אינטראקטיבי ומאפשר לך לראות בקשות בזמן אמת כשאתה מבצע פעולות באתר, מה שהופך אותו לאידיאלי לגילוי ראשוני של נקודות קצה (endpoints). קובץ HAR, לעומת זאת, הוא תמונת מצב סטטית של כל התעבורה. היתרון הגדול שלו הוא היכולת לנתח תהליכים מורכבים המורכבים מעשרות בקשות באופן אסינכרוני, וחשוב מכך, להשתמש בכלים אוטומטיים כדי להמיר את כל רצף הבקשות לקוד.

בטאב ה-Network ב-DevTools, לחץ על הבקשה הרלוונטית ובחר בטאב 'Initiator'. שם תראה את ה-call stack, כלומר את שרשרת קריאות הפונקציות ב-JavaScript שהובילה ליצירת הבקשה. לחיצה על שם הקובץ והשורה תיקח אותך ישירות לקוד הרלוונטי בטאב 'Sources', מה שמאפשר להתחיל בתהליך הדיבוג וההנדסה ההפוכה של הלוגיקה.

כן, בהחלט. mitmproxy יכול ליירט כל תעבורת HTTP/S שעוברת דרכו, לא רק מאפליקציות מובייל. ניתן להגדיר את מערכת ההפעלה (Windows, macOS, Linux) להשתמש ב-mitmproxy כפרוקסי מערכת. כל תוכנת דסקטופ שאינה משתמשת ב-certificate pinning תעביר את התעבורה שלה דרך הפרוקסי, ותאפשר לך לנתח את בקשות ה-API שלה בדיוק כמו באפליקציית מובייל.

הטעות הנפוצה ביותר היא העתקת ה-URL וה-Payload בלבד, תוך התעלמות מה-Request Headers. כותרות כמו `User-Agent`, `Accept`, `Content-Type`, `X-Requested-With`, ובעיקר עוגיות (`Cookie`) הן קריטיות לאימות הבקשה על ידי השרת. בקשה ללא ה-headers הנכונים תיכשל ב-99% מהמקרים ותחזיר שגיאות 401, 403, או פשוט דף HTML במקום JSON.

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

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

הירשמו עכשיו

עוד לקריאה