Playwright هو أحد أقوى الأدوات لأتمتة المتصفح، والاختبار بدون رأس، وزحف البيانات. ولكن بدون إعداد بروكسي صحيح، ستحصل على حظر سريع من IP: المواقع تعلمت كيفية التعرف على الطلبات الآلية وحظرها. في هذا الدليل، سنستعرض جميع طرق توصيل البروكسي في Playwright - من الإعداد الأساسي إلى تدوير IP وتجاوز Cloudflare.
لماذا البروكسي في Playwright ومتى لا يمكن الاستغناء عنه
يقوم Playwright بتشغيل متصفح حقيقي (Chromium أو Firefox أو WebKit) في الخلفية - وهذا هو الاختبار بدون رأس. من وجهة نظر الموقع، تبدو كأنك مستخدم عادي، ولكن فقط حتى نقطة معينة. بمجرد أن تبدأ الطلبات من IP واحد في الوصول إلى مئات الطلبات في الساعة، تستجيب خوارزميات الحماية على الفور: CAPTCHA، حظر مؤقت، حظر كامل.
إليك سيناريوهات محددة يكون فيها البروكسي ضروريًا:
- زحف الأسواق - تقوم Wildberries و Ozon و Avito و Yandex.Market بحظر السكريبتات بعد 50-100 طلب من IP واحد.
- مراقبة أسعار المنافسين - إذا كنت تقوم بالتحقق كل 15 دقيقة، بدون تغيير IP ستحصل على حظر خلال بضع ساعات.
- اختبار الجغرافيا - تحتاج إلى التحقق من كيفية ظهور الموقع للمستخدمين من ألمانيا أو الولايات المتحدة أو كازاخستان.
- ملء النماذج وتسجيل الحسابات - تربط المنصات الحسابات بـ IP وتمنع التسجيل الجماعي.
- مراقبة SEO - جمع المواقع من Google و Yandex يتطلب تغيير IP باستمرار، وإلا سيظهر محرك البحث CAPTCHA.
- اختبار ميزات A/B - بعض الميزات متاحة فقط للمستخدمين من دول أو مناطق معينة.
من المهم أن نفهم: Playwright بحد ذاته لا يجعلك مجهول الهوية. بدون بروكسي، تذهب جميع الطلبات من عنوان IP الحقيقي الخاص بك. إضافة البروكسي هي الخطوة الأولى والأهم نحو عمل أي سكريبت آلي بشكل مستقر.
💡 من المهم أن تعرف
يدعم Playwright البروكسي على مستوى المتصفح بالكامل، وسياق منفصل (BrowserContext) وحتى صفحة منفصلة. وهذا يوفر مرونة: يمكن أن تعمل صفحات مختلفة عبر IPs مختلفة في نفس الوقت.
أي نوع من البروكسي يجب اختياره لأتمتة بدون رأس
ليست جميع البروكسيات مناسبة بنفس القدر لـ Playwright. يعتمد الاختيار على المهمة: ما الذي تقوم بزحفه، ومدى عدوانية حماية الموقع، وكمية الطلبات التي تخطط لها.
| نوع البروكسي | مستوى الثقة | السرعة | مناسب لـ |
|---|---|---|---|
| مركز البيانات | منخفض | عالي جداً | زحف بدون حماية صارمة، اختبار |
| سكني | عالي | متوسط | مواقع مع Cloudflare، أسواق، شبكات اجتماعية |
| محمول | أقصى | متوسط | فيسبوك، تيك توك، إنستغرام، حماية صارمة ضد الروبوتات |
| SOCKS5 | يعتمد على المصدر | عالية | بروتوكول عالمي، مدعوم من Playwright |
لأغلب مهام الزحف، الخيار الأمثل هو البروكسي السكني مع تدوير. لديهم IPs حقيقية لمستخدمين منزليين، لذا لا تحددها المواقع كمركز بيانات ولا تحظرها تلقائيًا. بالنسبة للمواقع ذات الحماية العدوانية (إدارة الروبوتات من Cloudflare، Akamai) من الأفضل استخدام البروكسيات المحمولة - حيث أن IPs تنتمي لمشغلي الهواتف المحمولة، مما يثير أقصى درجة من الثقة.
يدعم Playwright بروتوكولات http، https و socks5. من المهم: SOCKS5 لا يدعم المصادقة عبر username:password مباشرة في بعض الإصدارات - سيتم توضيح ذلك بمزيد من التفصيل في قسم الأخطاء.
الإعداد الأساسي للبروكسي في Playwright (JavaScript و Python)
يسمح Playwright بتحديد البروكسي عند تشغيل المتصفح عبر معلمة proxy. هذه هي الطريقة الأكثر بساطة - ستذهب جميع طلبات المتصفح عبر خادم البروكسي المحدد.
JavaScript / Node.js
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://proxy.example.com:8080'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
const content = await page.textContent('body');
console.log(content); // سيظهر IP خادم البروكسي
await browser.close();
})();
Python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://proxy.example.com:8080"
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body")) # سيظهر IP البروكسي
browser.close()
لتغيير بروكسي SOCKS5، ما عليك سوى تغيير المخطط في عنوان الخادم:
# Python - بروكسي SOCKS5
browser = p.chromium.launch(
proxy={
"server": "socks5://proxy.example.com:1080"
}
)
للتحقق بسرعة من أن البروكسي يعمل، افتح https://httpbin.org/ip أو https://api.ipify.org - يجب أن يكون IP في الرد هو IP خادم البروكسي، وليس IP الحقيقي الخاص بك.
بروكسي مع مصادقة بواسطة اسم المستخدم وكلمة المرور
تستخدم معظم مزودي البروكسي التجاريين المصادقة بواسطة اسم المستخدم وكلمة المرور - هذه ممارسة قياسية. يدعم Playwright ذلك من خلال حقول username و password في كائن البروكسي.
JavaScript
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyprovider.com:7777',
username: 'your_login',
password: 'your_password'
}
});
Python
browser = p.chromium.launch(
proxy={
"server": "http://gate.proxyprovider.com:7777",
"username": "your_login",
"password": "your_password"
}
)
يمكنك أيضًا تمرير اسم المستخدم وكلمة المرور مباشرة في عنوان URL لخادم البروكسي - وهذا مريح إذا كنت تقوم بتكوين السلسلة ديناميكيًا:
# المصادقة في URL (Python)
proxy_url = f"http://{login}:{password}@gate.proxyprovider.com:7777"
browser = p.chromium.launch(
proxy={"server": proxy_url}
)
⚠️ انتبه
لا تخزن اسم المستخدم وكلمة المرور للبروكسي مباشرة في الشيفرة! استخدم متغيرات البيئة (os.environ في Python أو process.env في Node.js) أو ملف .env مع مكتبة dotenv.
التخزين الآمن عبر .env (Python)
import os
from dotenv import load_dotenv
from playwright.sync_api import sync_playwright
load_dotenv()
PROXY_SERVER = os.getenv("PROXY_SERVER")
PROXY_LOGIN = os.getenv("PROXY_LOGIN")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": PROXY_SERVER,
"username": PROXY_LOGIN,
"password": PROXY_PASSWORD
}
)
# ...
تدوير البروكسي: تغيير IP لكل طلب
لن ينقذك بروكسي واحد من الحظر عند وجود حجم كبير من الطلبات. لأغراض الزحف الجادة، تحتاج إلى تدوير IP - تغيير خادم البروكسي تلقائيًا خلال فترات معينة أو لكل طلب جديد.
هناك نهجان للتدوير في Playwright:
النهج 1: نقطة نهاية بروكسي دوارة
تقدم معظم مزودي البروكسي السكني عنوان gateway واحد، والذي يغير IP تلقائيًا عند كل اتصال. لا تحتاج إلى كتابة منطق التدوير - فهو مدمج على جانب المزود.
# نقطة نهاية واحدة - IP جديد عند كل اتصال بالمتصفح
browser = p.chromium.launch(
proxy={
"server": "http://rotating.proxyprovider.com:8888",
"username": "your_login",
"password": "your_password"
}
)
النهج 2: تدوير يدوي عبر قائمة البروكسيات
إذا كان لديك قائمة من البروكسيات الثابتة، يمكنك تنفيذ التدوير يدويًا - من خلال إنشاء متصفح جديد أو سياق لكل تكرار:
import random
from playwright.sync_api import sync_playwright
PROXY_LIST = [
{"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy3.example.com:8080", "username": "user", "password": "pass"},
]
URLS_TO_SCRAPE = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3",
]
with sync_playwright() as p:
for url in URLS_TO_SCRAPE:
proxy = random.choice(PROXY_LIST) # بروكسي عشوائي
browser = p.chromium.launch(proxy=proxy)
page = browser.new_page()
page.goto(url)
# ... زحف البيانات ...
browser.close() # إغلاق المتصفح، تغيير IP
النهج 3: تدوير عبر BrowserContext (بدون إعادة تشغيل المتصفح)
with sync_playwright() as p:
browser = p.chromium.launch() # متصفح بدون بروكسي
for i, url in enumerate(URLS_TO_SCRAPE):
proxy = PROXY_LIST[i % len(PROXY_LIST)] # بالتناوب
# سياق جديد مع بروكسي جديد - أسرع من إعادة تشغيل المتصفح
context = browser.new_context(proxy=proxy)
page = context.new_page()
page.goto(url)
# ... زحف ...
context.close() # إغلاق السياق، وليس المتصفح
browser.close()
النهج الثالث هو الأكثر كفاءة لزحف البيانات بكميات كبيرة. إعادة تشغيل المتصفح تستغرق من 2 إلى 4 ثوانٍ، بينما إنشاء سياق جديد يستغرق أقل من 100 مللي ثانية.
بروكسي على مستوى السياق والصفحة
يدعم Playwright بنية مرنة: يمكن أن يحتوي متصفح واحد على عدة سياقات معزولة، كل منها مع بروكسي خاص بها. وهذا يسمح بالعمل بالتوازي مع عدة IPs ضمن عملية واحدة.
عدة سياقات مع بروكسيات مختلفة (زحف متوازي)
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// السياق 1 - بروكسي من ألمانيا
const context_de = await browser.newContext({
proxy: {
server: 'http://de-proxy.example.com:8080',
username: 'user',
password: 'pass'
}
});
// السياق 2 - بروكسي من الولايات المتحدة
const context_us = await browser.newContext({
proxy: {
server: 'http://us-proxy.example.com:8080',
username: 'user',
password: 'pass'
}
});
const page_de = await context_de.newPage();
const page_us = await context_us.newPage();
// التشغيل المتوازي
await Promise.all([
page_de.goto('https://example.com'),
page_us.goto('https://example.com')
]);
// كلا الصفحتين ترى IPs مختلفة
console.log('DE IP:', await page_de.textContent('body'));
console.log('US IP:', await page_us.textContent('body'));
await browser.close();
})();
هذا النهج مثالي لاختبار الجغرافيا: يمكنك التحقق من كيفية ظهور الموقع للمستخدمين من دول مختلفة في نفس الوقت، دون الحاجة لتشغيل عدة نسخ من المتصفح.
💡 نصيحة للأداء
لزيادة التوازي إلى أقصى حد، استخدم asyncio في Python أو Promise.all في Node.js. يمكن لمتصفح واحد أن يحتفظ بـ 10-20 سياقًا متوازيًا دون تحميل كبير على الذاكرة.
تجاوز حماية مكافحة الروبوتات: Cloudflare، Akamai، DataDome
البروكسي هو جزء فقط من الحل. تقوم أنظمة مكافحة الروبوتات الحديثة بتحليل عشرات الإشارات في نفس الوقت: بصمة المتصفح، سلوك الماوس، سرعة ملء النماذج، رؤوس HTTP والعديد من العوامل الأخرى. حتى مع وجود بروكسي جيد، يمكن حظرك إذا لم تأخذ هذه العوامل في الاعتبار.
1. تمويه وضع بدون رأس
يحتوي Playwright في وضع بدون رأس على سمات مميزة يمكن التعرف عليها بسهولة: قيم محددة لـ navigator.webdriver، عدم وجود إضافات، وأبعاد شاشة غير قياسية. استخدم مكتبة playwright-stealth للتمويه:
# Python: التثبيت
# pip install playwright-stealth
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://residential.proxyprovider.com:8888",
"username": "user",
"password": "pass"
}
)
page = browser.new_page()
stealth_sync(page) # تطبيق التمويه
page.goto("https://bot.sannysoft.com") # اختبار للكشف عن الروبوت
browser.close()
2. وكيل مستخدم واقعي و viewport
context = browser.new_context(
proxy={
"server": "http://proxy.example.com:8080",
"username": "user",
"password": "pass"
},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
locale="ru-RU",
timezone_id="Europe/Moscow" # يجب أن يتطابق مع جغرافيا البروكسي!
)
3. محاكاة سلوك الإنسان
import time
import random
# تأخيرات عشوائية بين الإجراءات
def human_delay(min_ms=500, max_ms=2000):
time.sleep(random.randint(min_ms, max_ms) / 1000)
page.goto("https://example.com")
human_delay()
# تمرير سلس بدلاً من الفوري
page.evaluate("window.scrollBy({top: 500, behavior: 'smooth'})")
human_delay(300, 800)
# حركة الماوس قبل النقر
page.mouse.move(100, 200)
human_delay(100, 300)
page.mouse.move(300, 400)
human_delay(100, 200)
page.click("button#submit")
4. تطابق المنطقة الزمنية مع جغرافيا البروكسي
غالبًا ما يتم تجاهل ذلك، لكن أنظمة مكافحة الروبوتات تتحقق من التوافق: إذا كان بروكسيك من موسكو، وكان المتصفح يظهر المنطقة الزمنية UTC-8 (لوس أنجلوس) - فهذا علم أحمر. دائمًا قم بتعيين timezone_id بما يتوافق مع جغرافيا البروكسي المستخدم.
الأخطاء الشائعة وكيفية إصلاحها
عند العمل مع البروكسي في Playwright، يواجه المطورون بانتظام نفس المشكلات. دعونا نحلل كل واحدة مع الحل المحدد.
الخطأ 1: ERR_PROXY_CONNECTION_FAILED
السبب: عنوان أو منفذ البروكسي غير صحيح، البروكسي غير متاح، بيانات اعتماد غير صحيحة.
الحل: تحقق من توفر البروكسي عبر curl قبل تشغيل Playwright:
# تحقق من البروكسي عبر curl
curl -x http://user:[email protected]:8080 https://api.ipify.org
الخطأ 2: SOCKS5 لا يقبل المصادقة
السبب: Playwright (Chromium) لديه دعم محدود لـ SOCKS5 مع المصادقة عبر username/password.
الحل: استخدم بروكسي HTTP مع المصادقة أو قم بإعداد نفق SOCKS5 محلي عبر ssh -D بدون كلمة مرور.
الخطأ 3: البروكسي يعمل، لكن الموقع لا يزال يحظر
السبب: يتم استخدام بروكسيات مركز البيانات، التي توجد في القوائم السوداء؛ لم يتم تمويه وضع بدون رأس؛ تكرار الطلبات مرتفع جدًا.
الحل: انتقل إلى البروكسيات السكنية أو المحمولة، أضف playwright-stealth، وزد التأخيرات بين الطلبات.
الخطأ 4: تسرب IP الحقيقي (تسرب DNS)
السبب: قد تذهب طلبات DNS عبر البروكسي.
الحل: يقوم Playwright بشكل افتراضي بتوجيه DNS عبر البروكسي عند استخدام بروكسي HTTP. ولكن للتحقق، استخدم https://dnsleaktest.com في المتصفح بدون رأس.
الخطأ 5: أداء بطيء مع البروكسي
السبب: البروكسيات السكنية أبطأ من بروكسيات مركز البيانات؛ المسافة الكبيرة إلى خادم البروكسي.
الحل: اختر بروكسيات في مواقع جغرافية قريبة. لمهام بدون متطلبات صارمة للخصوصية، استخدم بروكسيات مركز البيانات - فهي أسرع بكثير.
| الخطأ | حل سريع |
|---|---|
| ERR_PROXY_CONNECTION_FAILED | تحقق من curl، اسم المستخدم/كلمة المرور، توفر المنفذ |
| 407 Proxy Auth Required | أضف اسم المستخدم وكلمة المرور إلى إعدادات البروكسي |
| الموقع يظهر CAPTCHA | قم بتغيير نوع البروكسي إلى سكني، أضف stealth |
| IP لا يتغير عند التدوير | أغلق السياق/المتصفح بين الطلبات |
| مهلة الاتصال | زيادة المهلة في goto()، اختر بروكسي أقرب |
الخاتمة والتوصيات
إعداد البروكسي في Playwright ليس مهمة لمرة واحدة، بل هو جزء من بنية أداة الأتمتة الخاصة بك. النوع المناسب من البروكسي، تدوير IP بشكل صحيح، وتمويه وضع بدون رأس معًا توفر عملًا مستقرًا حتى على المواقع ذات الحماية العدوانية ضد الروبوتات.
لنلخص اختيار نوع البروكسي لمهام معينة:
- زحف البيانات المفتوحة بدون حماية صارمة - بروكسيات مركز البيانات السريعة ستكون مناسبة.
- الأسواق (Wildberries، Ozon)، المجمعات الإخبارية - تحتاج إلى بروكسيات سكنية مع تدوير.
- الشبكات الاجتماعية (إنستغرام، فيسبوك، تيك توك) والمواقع مع Cloudflare - فقط بروكسيات محمولة أو سكنية.
- اختبار الجغرافيا - أي نوع من البروكسي في الدولة المطلوبة، المهم هو تطابق المنطقة الزمنية.
- زحف جماعي بتكرار عالٍ - بروكسيات سكنية دوارة مع نقطة نهاية gateway.
إذا كنت تبني نظام زحف أو اختبار آلي على Playwright وتحتاج إلى عمل مستقر بدون حظر، نوصي بالنظر في البروكسيات السكنية - فهي توفر مستوى عالٍ من الثقة من قبل المواقع وتدعم تدوير IP عبر نقطة نهاية واحدة، مما يسهل التكامل مع Playwright إلى بضع سطور من الشيفرة.