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

Playwright + Cloudflare — מה שבאמת צריך לדעת כדי לעקוף חסימות

8 במאי 20268 דק׳ קריאה
איור מופשט של מגן דיגיטלי (Cloudflare) המנסה לחסום רובוט (Playwright) בסגנון מודרני.

למה Playwright "נקי" נכשל מול Cloudflare כמעט תמיד

בוא נתחיל מהסוף: אם אתה מריץ Playwright עם קוד ברירת המחדל שלו, יש לך סיכוי של 99% להיחסם על ידי אתר שמוגן ב-Cloudflare. נקודה. זה לא משנה אם אתה משתמש ב-proxy הכי יקר בעולם. הסיבה פשוטה: דפדפן headless צורח "אני בוט" בעשרות דרכים שונות.

Cloudflare לא מסתכל רק על כתובת ה-IP שלך. הוא מריץ סדרת בדיקות JavaScript בצד הלקוח כדי לבנות "טביעת אצבע" של הדפדפן שלך. דפדפן Playwright ונילה נכשל במבחנים האלה באופן מחפיר. הנה כמה מהדגלים האדומים שהוא מרים:

  • navigator.webdriver: המאפיין הזה הוא המתנה הכי גדולה שאתה יכול לתת למערכת זיהוי בוטים. בדפדפן רגיל הוא false או לא קיים. ב-Playwright (ובכל כלי אוטומציה מבוסס WebDriver) הוא true. זה הדבר הראשון שבודקים.
  • מאפייני Chrome חסרים: בדפדפן Chrome אמיתי, לאובייקט window.chrome יש עשרות מאפיינים שקשורים ל-runtime. בגרסת headless, הרבה מהם חסרים. חוסר עקביות כזה הוא סימן מובהק לאוטומציה.
  • חוסר עקביות בהרשאות (Permissions): ה-API של Permissions בדפדפן מתנהג אחרת בסביבת אוטומציה. למשל, כשסקריפט מנסה לבדוק הרשאת 'notifications', התשובה בדפדפן אוטומטי תהיה שונה מזו של דפדפן אנושי.
  • טביעת אצבע של Canvas: סקריפטים יכולים לבקש מהדפדפן לצייר תמונה נסתרת על אלמנט Canvas וליצור ממנה hash. ה-hash הזה ייחודי מאוד למערכת ההפעלה, הדרייברים הגרפיים והדפדפן. לדפדפני headless יש טביעות אצבע מוכרות וקלות לזיהוי.

פעם, לפני כמה שנים, בניתי סקרייפר שהיה צריך לרוץ על אתר גדול. הוא עבד מושלם במשך שעתיים. ואז, בבת אחת, 100% מהבקשות התחילו לקבל את דף האתגר של Cloudflare. ה-IP היה נקי, ה-User-Agent היה מושלם. אחרי לילה של דיבוגים, הבנתי ש-Cloudflare פשוט התחילו לבדוק מאפיין JavaScript חדש שחשף את הדפדפן. זה היה שיעור כואב: אי אפשר לנצח במלחמה הזאת עם פתרון נקודתי אחד.

הסטאק המנצח: Playwright Stealth וכל מה שמסביב

אז אם Playwright רגיל לא עובד, מה כן? התשובה היא לא כלי אחד, אלא גישה שכבתית. הבסיס לכל הפעילות הוא שימוש ב-plugin ייעודי שמטרתו "להפוך את הדפדפן לאנושי" יותר. הכלי המוביל בתחום הוא playwright-stealth.

ה-plugin הזה הוא לא קסם. הוא בסך הכל אוסף של תיקונים (patches) שמטפלים בנקודות התורפה שציינו קודם. הוא משנה את ערך navigator.webdriver ל-false, מזייף מאפייני Chrome חסרים, מתקן את ה-Permissions API, ומשבש טביעות אצבע נפוצות. השילוב שלו בקוד הוא פשוט:

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False) # תמיד כדאי להתחיל דיבוג עם headless=False
    page = browser.new_page()

    # הפעלת ה-stealth על העמוד לפני הניווט הראשון
    stealth_sync(page)

    page.goto("https://bot.sannysoft.com/") # אתר מעולה לבדיקת טביעת האצבע
    page.wait_for_timeout(5000)
    browser.close()

אבל ה-plugin לבדו לא מספיק. הוא מטפל בטביעות האצבע הברורות, אבל Cloudflare מסתכל על התמונה המלאה. כדי להשלים את הסטאק, אתה צריך עוד שלושה מרכיבים קריטיים. תוכלו לקרוא על כך בהרחבה במדריך שלנו על התמודדות עם זיהוי בוטים ב-Playwright, אבל העקרונות הם אלה.

מעבר ל-Stealth: כתובת IP, Viewport וטיימינג

1. כתובת IP היא עדיין המלך

גם עם הדפדפן הכי "אנושי" בעולם, אם אתה יוצא מכתובת IP של דאטה סנטר (כמו AWS או Google Cloud), אתה חשוד מיידית. Cloudflare מנהל רשימות מוניטין של טווחי IP, וכתובות של ספקי ענן נמצאות בראש הרשימה השחורה. הפתרון היחיד שעובד באופן עקבי הוא שימוש ב-Residential Proxies.

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

2. הגדרות דפדפן נכונות

בוטים רבים עושים טעות של מתחילים: הם לא מגדירים viewport (גודל החלון) או משתמשים ברזולוציה לא סטנדרטית. משתמש אמיתי גולש עם דפדפן בגודל הגיוני, כמו 1920x1080 או 1366x768. הגדרה נכונה היא קריטית:

# הגדרת viewport ו-User-Agent שתואמים למערכת נפוצה
page.set_viewport_size({"width": 1920, "height": 1080})
page.set_extra_http_headers({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
})

חשוב לוודא שה-User Agent, הרזולוציה, ומערכת ההפעלה שאתה מדמה (דרך ה-headers) מתאימים זה לזה. שליחת User Agent של Mac עם רזולוציה שקיימת רק על Windows היא דגל אדום.

3. התנהגות אנושית (או לפחות לא רובוטית)

הסקרייפר שלך מהיר מדי. הרבה יותר מדי. בן אדם לא טוען עמוד, מזהה את הכפתור הנכון תוך 3 מילישניות ולוחץ עליו. Cloudflare מנטר את התנהגות המשתמש בעמוד. סקריפט שעובר בין עמודים במהירות של 200ms נראה חשוד.

הפתרון הוא להאט. הוסף השהיות אקראיות בין פעולות. אל תעשה page.click() מיד אחרי טעינת העמוד. חכה שנייה או שתיים. תן לעמוד "לנשום".

import random

# אחרי טעינת עמוד
page.wait_for_timeout(random.randint(1500, 3500))

# לפני לחיצה על כפתור
button = page.locator('#submit-button')
button.scroll_into_view_if_needed()
page.wait_for_timeout(random.randint(500, 1200))
button.click()

הקוד הזה אולי נראה לא יעיל, אבל הוא קריטי. הוא מדמה את הזמן שלוקח למשתמש אמיתי לקרוא, להזיז את העכבר וללחוץ. האטת קצב הבקשות גם תעזור לך להימנע משגיאות 429 ו-rate limiting.

כשכל זה לא מספיק: Cloudflare Turnstile ו-Challenge Pages

לפעמים, גם עם הסטאק המושלם, תיתקל באתגר. Cloudflare מציגה שני סוגים עיקריים של אתגרים: Turnstile (ה-CAPTCHA הבלתי נראה) ודפי אתגר אינטראקטיביים (כמו "Click to verify you are human").

Cloudflare Turnstile הוא אתגר פאסיבי. הוא מריץ סדרת בדיקות ברקע בלי לדרוש אינטראקציה. אם טביעת האצבע שלך מספיק טובה, הוא פשוט יאמת אותך ויעביר אותך הלאה. הסטאק שתיארנו (stealth + residential IP + התנהגות אנושית) עובר את Turnstile ברוב המקרים, בסביבות 80-90% מהפעמים.

אם אתה עדיין נתקל באתגר, זה סימן שאחד המרכיבים בסטאק שלך חלש. בדרך כלל הבעיה היא במוניטין של ה-IP. נסה להחליף IP (לעשות proxy rotation) ולנסות שוב. אם גם זה לא עובד, ייתכן שתצטרך להשתמש בשירותי פתירת CAPTCHA מקצועיים, אבל זה כבר נושא למאמר אחר ודורש ארכיטקטורת scraping מתקדמת יותר.

סיכום: המתכון המלא לעקיפת Cloudflare עם Playwright

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

הנה המתכון המלא, צעד אחר צעד:

  1. התחל עם playwright-stealth: זהו הבסיס. הוא מסתיר את סימני האוטומציה הברורים ביותר.
  2. השתמש ב-Residential IP: אל תנסה אפילו עם IP של דאטה סנטר. זה בזבוז זמן. השקיעו ב-proxy איכותי.
  3. הגדר Viewport ו-User-Agent הגיוניים: ודא שהם תואמים זה לזה ולפרופיל של משתמש אמיתי. 1920x1080 עם User Agent עדכני של Chrome על Windows 10 זו התחלה טובה.
  4. האט את הקצב: הוסף השהיות אקראיות וטבעיות בין פעולות. אל תהיה מהיר מדי. 2-4 שניות בין טעינת עמוד לפעולה הבאה זה כלל אצבע טוב.
  5. טפל באתגרים בחן: אם אתה נתקל באתגר, הצעד הראשון הוא להחליף IP ולנסות שוב. אל תנסה לתקוף את אותו עמוד עם אותו IP עשרות פעמים.

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

שאלות נפוצות

לא, playwright-stealth לבדו אינו מספיק. הוא מהווה שכבת בסיס קריטית שמטפלת בטביעות האצבע הברורות ביותר של הדפדפן, כמו הסתרת המאפיין `navigator.webdriver`. עם זאת, Cloudflare בודק גם את המוניטין של כתובת ה-IP, התנהגות הגלישה, והגדרות הדפדפן. ללא שילוב של residential proxy איכותי, הגדרת viewport נכונה, והוספת השהיות בין פעולות, הסיכוי שלך לעבור את ההגנות המתקדמות של Cloudflare נמוך מאוד, במיוחד באתרים עם הגנה אגרסיבית.

עם הסטאק המלא, הכולל playwright-stealth, residential proxy איכותי, הגדרות דפדפן נכונות וטיימינג אנושי, ניתן לצפות לאחוזי הצלחה של 85-95% מול רוב האתרים המוגנים ב-Cloudflare. חשוב להבין ש-100% הצלחה אינו ריאלי, מכיוון ש-Cloudflare מעדכנת את האלגוריתמים שלה כל הזמן ומוניטין של IP ספציפי יכול להשתנות. באתרים עם הגנה מקסימלית, ייתכן שאחוז ההצלחה ירד ל-70-80% ויידרש טיפול אקטיבי באתגרי CAPTCHA.

הדרך הטובה ביותר לטפל ב-Cloudflare Turnstile היא באופן פאסיבי, על ידי הצגת פרופיל גלישה אמין ככל האפשר. אם הסטאק שלך (stealth, IP, התנהגות) מספיק טוב, Turnstile יאמת אותך ברקע ללא צורך בפעולה. אם אתה עדיין נכשל, זה סימן שהפרופיל שלך חשוד. הצעד הראשון הוא לבצע רוטציה של ה-proxy ולקבל IP חדש. אם הבעיה נמשכת, ייתכן שתצטרך לשלב שירותי פתירת CAPTCHA של צד שלישי, כמו 2Captcha, שיכולים לפתור את האתגר דרך API.

לצורך דיבוג ופיתוח, תמיד עדיף להתחיל עם UI מלא (headless=False). זה מאפשר לך לראות בדיוק מה הסקריפט עושה ואיזה דף חסימה מוצג. בסביבת פרודקשן, המטרה היא בדרך כלל לרוץ במצב headless כדי לחסוך במשאבים. עם playwright-stealth, ההבדלים בטביעת האצבע בין שני המצבים מצטמצמים משמעותית. כלל האצבע הוא: אם הסקרייפר שלך עובד באופן יציב עם UI, העבר אותו למצב headless ובדוק אם אחוזי ההצלחה נשמרים. אם יש ירידה, ייתכן שיש בדיקות ספציפיות שה-plugin לא מכסה.

ההבדל הוא קריטי. Proxy של דאטה סנטר מספק לך כתובת IP שמגיעה משרת בענן (כמו AWS, Azure). טווחי ה-IP האלה ידועים, מתועדים וקל מאוד ל-Cloudflare לזהות ולחסום אותם כפעילות לא אנושית. לעומת זאת, residential proxy מנתב את התעבורה שלך דרך חיבור אינטרנט ביתי של משתמש אמיתי (דרך ספק כמו Comcast או Verizon). מבחינת Cloudflare, התנועה הזו נראית כלגיטימית לחלוטין, ולכן הסיכוי שלה להיחסם נמוך בסדרי גודל.

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

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

הירשמו עכשיו

עוד לקריאה