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

השגיאות הנפוצות ביותר ברשת ב-web scraping

8 במאי 20267 דק׳ קריאה
איור מופשט של נתיבי רשת מסתעפים ומתנגשים, המסמל שגיאות רשת מורכבות ב-web scraping.

למה שגיאות רשת הן החלק הכי מתסכל ב-Scraping?

בנית scraper. הוא עובד. אתה מריץ אותו על 10,000 בקשות, ופתאום אתה רואה ש-30% מהן נכשלות. אתה מסתכל בלוגים ומגלה בליל של שגיאות כמו ECONNRESET או ETIMEDOUT. זה לא 403, זה לא 429, וזה בטח לא CAPTCHA. אין לך מושג אם הבעיה אצלך, ב-proxy, או באתר המטרה. התסכול הזה הוא הלחם והחמאה של כל מי שעושה scraping בסקייל.

שגיאות HTTP הן קלות. הן פרוטוקול אפליקטיבי, הן מדברות איתך. שגיאת 429 אומרת "אתה מהיר מדי". שגיאת 503 אומרת "אני עמוס, תחזור אח"כ". אבל שגיאות רשת? הן מגיעות משכבות נמוכות יותר (TCP/IP), והן הרבה פחות ברורות. הן כמו תינוק שבוכה – אתה יודע שמשהו לא בסדר, אבל אין לך מושג מה בדיוק. המדריך הזה נועד לתרגם את הבכי הזה למילים.

פענוח שגיאות TCP: מה השרת באמת אומר?

רוב הבעיות מתחילות ונגמרות בשכבת ה-TCP. אלו השגיאות הכי נפוצות שתפגוש, וכל אחת מספרת סיפור אחר.

ECONNREFUSED – דחייה על הסף

מה זה אומר: ניסית להתחבר לכתובת ופורט, והמחשב בצד השני ענה מיד: "לא, תודה". השרת קיבל את בקשת החיבור שלך (SYN packet), אבל הקרנל שלו החזיר באופן אקטיבי חבילת RST (Reset). זה אומר שאין שום תהליך שמאזין על הפורט הזה.

למה זה קורה ב-scraping:

  • טעות בפורט ב-URL (למשל, example.com:8080 במקום example.com:80).
  • ה-Proxy שלך לא עובד או שהגדרת אותו לא נכון. אם כל הבקשות שלך נדחות מיד, סביר שה-proxy שלך מת.
  • חומת אש (Firewall) בצד השרת שמזהה אותך וחוסמת אותך ברמת ה-IP, אבל זה פחות נפוץ. רוב חומות האש פשוט יזרקו את הפאקטים שלך (Timeout) ולא יענו במפורש.
איך מתקנים: זו בדרך כלל הבעיה הכי קלה לפתרון. ודא שה-URL תקין. ודא שה-proxy שלך חי ומגיב. נסה לשלוח בקשה דרך אותו proxy עם cURL. אם cURL עובד והסקריפט שלך לא, הבעיה בקוד שלך. אם גם cURL נכשל, הבעיה ב-proxy.

ECONNRESET – השיחה נותקה באמצע

מה זה אומר: זאת השגיאה הכי ערמומית. החיבור נוצר בהצלחה (handshake הושלם), אולי אפילו התחלתם לשלוח ולקבל נתונים, אבל אז הצד השני החליט לנתק את השיחה בפתאומיות על ידי שליחת חבילת RST.

למה זה קורה ב-scraping: זהו סימן קלאסי למערכת הגנה אקטיבית. Web Application Firewall (WAF) כמו Cloudflare או Imperva ראה משהו חשוד בתעבורה אחרי שהחיבור נוצר, והחליט להרוג אותו. זה יכול לקרות אחרי 50ms או אחרי 2 שניות. זה יכול להיות בגלל ה-headers ששלחת, ה-TLS fingerprint שלך, או קצב הבקשות שלך. זו גם יכולה להיות בעיה ב-שרתי פרוקסי זולים שפשוט לא יציבים וסוגרים חיבורים תחת עומס.

הנה תרחיש כישלון אמיתי: עבדתי על scraper לאתר e-commerce גדול. 95% מהבקשות עבדו, אבל 5% נכשלו באופן אקראי עם ECONNRESET. אחרי שעות של דיבאגינג, כולל צלילה ל-tcpdump, גילינו שה-WAF שלהם הרג כל חיבור שנשאר פתוח (keep-alive) יותר מ-5 שניות. הפתרון היה פשוט לכבות את keep-alive בספריית ה-HTTP שלנו ולפתוח חיבור חדש לכל בקשה. זה העלה קצת את ה-latency, אבל הוריד את שיעור השגיאות ל-0.1%.

ETIMEDOUT – אף אחד לא עונה

מה זה אומר: שלחת בקשת חיבור (SYN packet) לשרת, ופשוט לא קיבלת שום תשובה. חיכית, חיכית, ובסוף מערכת ההפעלה שלך התייאשה.

למה זה קורה ב-scraping:

  • חסימה שקטה (Blackhole): מערכות הגנה מתקדמות לא יגידו לך "לך מפה" (RST). הן פשוט יזרקו את הפאקטים שלך לפח. אתה שולח בקשות לחור שחור. זה יעיל מאוד נגד סורקים אוטומטיים.
  • עומס על השרת: השרת כל כך עמוס שהוא לא מספיק לענות לבקשות חיבור חדשות.
  • Proxy איטי או עמוס: ה-proxy שלך הוא צוואר הבקבוק. הוא לא מצליח להעביר את הבקשה שלך הלאה בזמן.
  • בעיות רשת כלליות: Packet loss בדרך ליעד. נדיר, אבל קורה.
איך מתקנים: הדבר הראשון הוא להגדיר retry-logic עם exponential backoff. נכשל? חכה שנייה ונסה שוב. נכשל שוב? חכה שתי שניות. אם מספר ניסיונות חוזרים לאותו IP נכשלים עם timeout, כנראה שה-IP הזה שרוף. זה הזמן לעשות rotate ל-IP חדש. ניהול נכון של ארכיטקטורת ה-scraping שלך צריך לכלול מנגנון אוטומטי לזיהוי והסרה של פרוקסיז "מתים" כאלה.

צוללים עמוק יותר: DNS ו-SSL

לפעמים הבעיה היא אפילו לא ב-TCP, אלא בשכבות שמעל או ליד.

EAI_AGAIN – איפה הכתובת?

מה זה אומר: זו שגיאת DNS. הסקריפט שלך ניסה לתרגם שם דומיין (למשל, scraping.co.il) לכתובת IP, אבל שרת ה-DNS לא הצליח לענות בזמן. EAI_AGAIN אומר שזו בעיה זמנית ושכדאי לנסות שוב.

למה זה קורה ואיך מתקנים: ב-99% מהמקרים, זו בעיה זמנית של שרת ה-DNS שבו אתה משתמש (יכול להיות של ספק האינטרנט שלך, של ה-proxy, או של ה-VPS). הפתרון הוא פשוט לנסות שוב אחרי שנייה. אם הבעיה חוזרת על עצמה באופן קבוע, שקול להחליף את שרתי ה-DNS שלך (למשל ל-1.1.1.1 של Cloudflare או 8.8.8.8 של גוגל) ברמת מערכת ההפעלה.

שגיאות SSL/TLS – החתימה שלך חשודה

מה זה אומר: שגיאות כמו SSL_ERROR_SYSCALL, DECRYPTION_FAILED_OR_BAD_RECORD_MAC, או סתם חיבור שנסגר במהלך ה-TLS Handshake. אלו הגרסאות של עולם ה-SSL ל-ECONNRESET.

למה זה קורה ב-scraping: מערכות הגנה מתוחכמות כמו Cloudflare בודקות את ה-TLS Handshake שלך. הן בונות "טביעת אצבע" (JA3 Fingerprint) על סמך הפרמטרים שלקוח ה-SSL שלך מציע (גרסאות TLS, רשימת ciphers וכו'). אם טביעת האצבע הזו תואמת לספרייה אוטומטית מוכרת (כמו `requests` בפייתון בגרסה ישנה) ולא לדפדפן אמיתי, הן פשוט יסגרו את החיבור עוד לפני שנשלח בית אחד של HTTP. זהו אתגר משמעותי שדורש כלים מתקדמים יותר.

איך מתקנים: כאן ספריות HTTP פשוטות כבר לא מספיקות. צריך כלים שיכולים לחקות את טביעת האצבע של דפדפנים אמיתיים. כלים כמו Playwright או Puppeteer עושים את זה מחוץ לקופסה. לסביבות אחרות, יש ספריות ייעודיות כמו `curl-impersonate` או `pyhttpx` שיודעות לשנות את ה-handshake כדי להיראות כמו כרום. זה נושא מורכב, ואנחנו מכסים אותו לעומק במדריך על שימוש ב-Playwright Stealth.

איך לדבג את זה בפועל?

כשאתה תקוע, תיאוריה לא מספיקה. צריך כלים.

השתמש ב-Proxy Debug Headers: ספקי פרוקסי איכותיים מציעים headers שניתן להוסיף לבקשה כדי לקבל מידע דיבאג. למשל, header שיחזיר לך בתשובה את ה-IP האמיתי שיצאת ממנו, כמה זמן הבקשה בילתה בתשתית הפרוקסי, ואיזה node ספציפי שירת אותך. זה יכול לעזור לך להבין אם הבעיה היא ב-proxy ספציפי או בכל הרשת.

לרדת לרמת ה-Packets עם `tcpdump`: זהו המוצא האחרון, אבל הוא הכי חזק. אתה יכול להריץ `tcpdump` על השרת שלך ולראות את תעבורת הרשת בעיניים. למשל:


sudo tcpdump -i eth0 host example.com and port 443 -A

הפקודה הזו תראה לך את כל הפאקטים שנשלחים ומגיעים מ-example.com בפורט 443. אתה תראה את ה-SYN, SYN-ACK, ACK של ה-handshake, ואז את חבילות ה-RST אם החיבור נקטע. זה יכול לגלות לך בדיוק באיזה שלב בשיחה הבעיה מתרחשת. זה לא כלי ליומיום, אבל כשאתה באמת אבוד, הוא יציל אותך.

שגיאות רשת הן לא רעש, הן סיגנל

קל לפטור שגיאות רשת כ"בעיות אינטרנט" ולנסות שוב. אבל זו טעות. כל שגיאה כזו היא פיסת מידע. ECONNRESET אומר לך "זיהיתי אותך". ETIMEDOUT אומר "אני מתעלם ממך". ECONNREFUSED אומר "אתה במקום הלא נכון".

השלב הבא בבניית scraper חסין וסקיילבילי הוא להפסיק להתייחס לשגיאות האלה כרעש ולהתחיל להתייחס אליהן כסיגנלים. כשה-scraper שלך ידע לפרש את הסיגנלים האלה ולהגיב בהתאם – להחליף IP, לשנות טביעת אצבע, להאט את הקצב – אז תעבור מ-70% הצלחה ל-99.9%.

שאלות נפוצות

ההבדל המעשי הוא בין חסימה אקטיבית לפסיבית. ECONNRESET אומר שהשרת יצר איתך קשר ואז החליט באופן פעיל לנתק אותך, לרוב בגלל זיהוי של WAF. זה סימן שאתה צריך לשנות את טביעת האצבע שלך (headers, TLS). ETIMEDOUT, לעומת זאת, אומר שהשרת פשוט מתעלם ממך. זה יכול להיות בגלל חסימת IP שקטה (blackhole) או עומס. הפתרון כאן הוא בדרך כלל להחליף IP ולנסות שוב ממקום אחר, כי השרת אפילו לא טורח לדבר איתך.

כן, אבל זה תלוי באיכות הפרוקסי. שימוש בפרוקסי מוסיף עוד נקודת כשל פוטנציאלית לרשת. פרוקסיז זולים או ציבוריים סובלים מאי יציבות, עומס יתר וניהול רשת לקוי, מה שמוביל לשכיחות גבוהה של ECONNRESET ו-ETIMEDOUT. לעומת זאת, רשת פרוקסי איכותית, כמו residential proxies, מנהלת את העומסים ומחליפה צמתים כושלים אוטומטית, ובכך יכולה דווקא להפחית את שיעור השגיאות הכולל על ידי עקיפת חסימות IP.

הדרך הטובה ביותר היא לבודד משתנים. נסה לשלוח את אותה בקשה בדיוק לשלושה יעדים שונים דרך אותו פרוקסי: 1. אתר המטרה. 2. אתר גדול ויציב כמו google.com. 3. שירות כמו httpbin.org/ip. אם הבקשות לגוגל ו-httpbin מצליחות באופן עקבי, אבל הבקשה לאתר המטרה נכשלת, סביר מאוד להניח שהבעיה היא באתר המטרה שחוסם אותך. אם כל הבקשות נכשלות, הבעיה היא כנראה בפרוקסי עצמו.

שגיאה גנרית כמו `SSL_ERROR_SYSCALL` או פשוט חיבור שנסגר ללא הודעה ברורה במהלך ה-TLS handshake היא הנפוצה ביותר. אין קוד שגיאה ספציפי שאומר "נחסמת בגלל טביעת אצבע TLS", כי המטרה של מערכת ההגנה היא להיראות כמו תקלת רשת אקראית. אם אתה רואה שחיבורי ה-HTTPS שלך נכשלים באופן שיטתי בשלב מוקדם מאוד עבור אתר מסוים, בעוד שחיבורי HTTP או חיבורים לאתרים אחרים עובדים, זו אינדיקציה חזקה לחסימה ברמת ה-TLS, למשל על בסיס JA3 fingerprint.

tcpdump הוא כלי של מוצא אחרון, אבל הוא הכרחי במצבים מורכבים. השתמש בו כשאתה רואה שגיאות לא עקביות כמו ECONNRESET ואתה לא בטוח באיזה שלב החיבור נקטע. לדוגמה, אם אתה חושד שמערכת הגנה הורגת את החיבור אחרי ששלחת header מסוים, tcpdump יאפשר לך לראות את חבילות ה-TCP ולראות אם חבילת ה-RST הגיעה מיד אחרי חבילת ה-ClientHello של ה-TLS או רק אחרי ששלחת את בקשת ה-HTTP GET. זה מספק רמת פירוט שלא ניתן לקבל משום לוג אפליקטיבי.

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

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

הירשמו עכשיו

עוד לקריאה