العودة إلى المدونة

إعداد البروكسي في Selenium WebDriver: دليل كامل مع أمثلة كود لـ Python و Java

دليل مفصل لدمج البروكسي في Selenium WebDriver مع أمثلة كود بلغة Python وJava لـ Chrome وFirefox.

📅٢٥ شعبان ١٤٤٧ هـ
```html

Selenium WebDriver هو أحد أكثر الأدوات شعبية لأتمتة المتصفح واستخراج البيانات. عند العمل مع كميات كبيرة من الطلبات أو عند الحاجة لتجاوز القيود الجغرافية، من الضروري إعداد البروكسي بشكل صحيح. في هذا الدليل، سنستعرض جميع طرق دمج البروكسي في Selenium لمتصفحات مختلفة ولغات برمجة متعددة، وسنحل أيضًا المشكلات الشائعة التي يواجهها المطورون.

لماذا نحتاج إلى البروكسي في Selenium

عند أتمتة استخراج البيانات أو الاختبار عبر Selenium، تظهر عدة مهام لا يمكن حلها بدون البروكسي:

  • تجاوز تحديد معدل الطلبات - العديد من المواقع تحد من عدد الطلبات من عنوان IP واحد. بدون البروكسي، سيحصل السكربت الخاص بك على حظر سريع بعد 50-100 طلب.
  • القيود الجغرافية - إذا كنت بحاجة لاستخراج محتوى متاح فقط من دولة معينة، فإن البروكسي مع عنوان IP من الموقع الجغرافي المطلوب يحل هذه المشكلة.
  • توزيع الحمل - عند استخراج البيانات بكميات كبيرة، يسمح تدوير عناوين IP عبر البروكسي بتوزيع الطلبات وتجنب اكتشاف الروبوتات.
  • اختبار التوطين - للتحقق من كيفية عرض الموقع للمستخدمين من دول مختلفة، تحتاج إلى بروكسي من المناطق المناسبة.
  • تجاوز أنظمة مكافحة الروبوتات - تحلل الحمايات الحديثة (Cloudflare، DataDome) سمعة IP. تساعد البروكسي عالية الجودة في الظهور كمستخدم عادي.

بدون إعداد البروكسي بشكل صحيح، سيكون سكربت Selenium الخاص بك غير مستقر: سيتلقى كابتشا، حظراً مؤقتاً، أو حظراً كاملاً على الوصول. هذا أمر حاسم بشكل خاص عند استخراج بيانات من مواقع التجارة الإلكترونية، أو الشبكات الاجتماعية، أو المواقع ذات الحماية القوية ضد الروبوتات.

ما هي أنواع البروكسي التي يجب استخدامها

يعتمد اختيار نوع البروكسي على المهمة. تُستخدم ثلاثة أنواع رئيسية من البروكسي لأتمتة Selenium، كل منها له مزاياه الخاصة:

نوع البروكسي السرعة الخصوصية أفضل السيناريوهات
بروكسي مراكز البيانات عالية جداً (100+ ميغابت/ثانية) متوسطة استخراج البيانات العامة، اختبار الأداء، الفحوصات الجماعية
بروكسي سكنية متوسطة (10-50 ميغابت/ثانية) عالية جداً تجاوز أنظمة مكافحة الروبوتات، استخراج البيانات من الشبكات الاجتماعية، التجارة الإلكترونية، المواقع ذات الحماية القوية
بروكسي موبايل متوسطة (5-30 ميغابت/ثانية) قصوى العمل مع النسخ المحمولة من المواقع، الشبكات الاجتماعية، التطبيقات التي تتحقق من IP الموبايل

توصيات للاختيار:

  • لإستخراج البيانات من مواقع الأخبار، واجهات برمجة التطبيقات المفتوحة، الكتالوجات البسيطة - ستكون بروكسي مراكز البيانات مناسبة. فهي أرخص وأسرع.
  • للعمل مع Amazon و eBay و Google والشبكات الاجتماعية - استخدم فقط البروكسي السكنية. هذه المنصات تحظر بنشاط IP مراكز البيانات.
  • لإعادة تمثيل المستخدمين من الهواتف المحمولة أو العمل مع Instagram و TikTok - تعتبر بروكسي الموبايل ضرورية.
  • لاختبار الجغرافيا - اختر بروكسي مع إمكانية اختيار دولة ومدينة معينة.

إعداد البروكسي لـ Chrome في Selenium

Chrome WebDriver هو الخيار الأكثر شعبية لأتمتة Selenium. يتم إعداد البروكسي عبر كائن ChromeOptions. دعونا نستعرض بعض الطرق.

الطريقة 1: بروكسي HTTP/HTTPS بدون مصادقة (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# إعداد البروكسي
PROXY = "123.45.67.89:8080"  # استبدلها بخادم البروكسي الخاص بك

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')

# خيارات إضافية للاستقرار
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

# تشغيل السائق
driver = webdriver.Chrome(options=chrome_options)

# التحقق من IP
driver.get('https://httpbin.org/ip')
print(driver.page_source)

driver.quit()

الطريقة 2: بروكسي SOCKS5 (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

PROXY = "123.45.67.89:1080"

chrome_options = Options()
# لبروكسي SOCKS5، حدد البروتوكول بوضوح
chrome_options.add_argument(f'--proxy-server=socks5://{PROXY}')

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

مهم: يدعم Chrome بروكسي HTTP و HTTPS و SOCKS5. لبروكسي SOCKS4، ستحتاج إلى إعدادات إضافية أو استخدام ملحقات.

إعداد البروكسي لـ Chrome في Java

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.Proxy;

public class ChromeProxyExample {
    public static void main(String[] args) {
        // إعداد البروكسي
        Proxy proxy = new Proxy();
        proxy.setHttpProxy("123.45.67.89:8080");
        proxy.setSslProxy("123.45.67.89:8080");
        
        ChromeOptions options = new ChromeOptions();
        options.setProxy(proxy);
        options.addArguments("--no-sandbox");
        
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://httpbin.org/ip");
        
        System.out.println(driver.getPageSource());
        driver.quit();
    }
}

إعداد البروكسي لـ Firefox في Selenium

يستخدم Firefox WebDriver نهجًا مختلفًا لإعداد البروكسي عبر ملف تعريف المتصفح. هذا يوفر مزيدًا من المرونة، ولكنه يتطلب فهم إعدادات التكوين.

بروكسي HTTP/HTTPS لـ Firefox (Python)

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080

firefox_options = Options()

# إعداد البروكسي عبر التفضيلات
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)

# تعطيل البروكسي للعناوين المحلية
firefox_options.set_preference("network.proxy.no_proxies_on", "localhost,127.0.0.1")

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

بروكسي SOCKS5 لـ Firefox (Python)

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 1080

firefox_options = Options()

firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.socks", PROXY_HOST)
firefox_options.set_preference("network.proxy.socks_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.socks_version", 5)

# لبروكسي SOCKS5 مع DNS عبر البروكسي
firefox_options.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

ميزة Firefox: تتيح لك الإعداد network.proxy.socks_remote_dns إجراء استعلامات DNS عبر البروكسي، مما يزيد من الخصوصية ويساعد في تجاوز الحظر على مستوى DNS.

العمل مع البروكسي الذي يتطلب مصادقة

تستخدم معظم خدمات البروكسي عالية الجودة المصادقة باستخدام اسم المستخدم وكلمة المرور. لا يدعم Selenium تمرير بيانات الاعتماد مباشرة في عنوان URL للبروكسي لـ Chrome، لذا هناك حاجة إلى حلول بديلة.

الطريقة 1: ملحق Chrome للمصادقة (موصى به)

نقوم بإنشاء ملحق مؤقت لـ Chrome يقوم تلقائيًا بإدخال اسم المستخدم وكلمة المرور عند الاتصال بالبروكسي:

import os
import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"

# إنشاء بيان الملحق
manifest_json = """
{
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": {
        "scripts": ["background.js"]
    }
}
"""

# سكربت للمصادقة
background_js = """
var config = {
    mode: "fixed_servers",
    rules: {
        singleProxy: {
            scheme: "http",
            host: "%s",
            port: parseInt(%s)
        },
        bypassList: ["localhost"]
    }
};

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {
    return {
        authCredentials: {
            username: "%s",
            password: "%s"
        }
    };
}

chrome.webRequest.onAuthRequired.addListener(
    callbackFn,
    {urls: [""]},
    ['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)

# إنشاء الملحق
plugin_path = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_path, 'w') as zp:
    zp.writestr("manifest.json", manifest_json)
    zp.writestr("background.js", background_js)

# تشغيل Chrome مع الملحق
chrome_options = Options()
chrome_options.add_extension(plugin_path)

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)

driver.quit()
os.remove(plugin_path)  # حذف الملف المؤقت

الطريقة 2: Firefox مع المصادقة (أسهل)

يسمح Firefox بتمرير بيانات الاعتماد عبر إعدادات الملف الشخصي:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"

firefox_options = Options()

firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)

# المصادقة (لا تعمل دائمًا، تعتمد على إصدار Firefox)
firefox_options.set_preference("network.proxy.username", PROXY_USER)
firefox_options.set_preference("network.proxy.password", PROXY_PASS)

# تعطيل طلب المصادقة
firefox_options.set_preference("network.automatic-ntlm-auth.trusted-uris", PROXY_HOST)

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

ملاحظة: إذا كان مزود البروكسي الخاص بك يدعم القائمة البيضاء لعناوين IP، فمن الأسهل إضافة عنوان IP الخاص بالخادم الخاص بك إلى القائمة البيضاء واستخدام البروكسي بدون مصادقة.

تدوير البروكسي في Selenium

عند استخراج كميات كبيرة من البيانات، من الضروري تغيير البروكسي لتجنب الحظر. هناك نهجان: تدوير على مستوى الكود واستخدام بروكسي دوار.

تدوير على مستوى الكود (إنشاء سائق جديد)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random

# قائمة البروكسي
PROXY_LIST = [
    "123.45.67.89:8080",
    "98.76.54.32:8080",
    "11.22.33.44:8080",
]

def create_driver_with_proxy(proxy):
    """إنشاء سائق مع البروكسي المحدد"""
    chrome_options = Options()
    chrome_options.add_argument(f'--proxy-server=http://{proxy}')
    chrome_options.add_argument('--no-sandbox')
    return webdriver.Chrome(options=chrome_options)

# استخراج مع تدوير
urls_to_parse = [
    'https://example.com/page1',
    'https://example.com/page2',
    'https://example.com/page3',
]

for url in urls_to_parse:
    # اختيار بروكسي عشوائي
    current_proxy = random.choice(PROXY_LIST)
    
    # إنشاء سائق جديد مع البروكسي
    driver = create_driver_with_proxy(current_proxy)
    
    try:
        driver.get(url)
        # منطق الاستخراج الخاص بك
        print(f"تم استخراج {url} عبر {current_proxy}")
        print(driver.title)
    except Exception as e:
        print(f"خطأ مع {current_proxy}: {e}")
    finally:
        driver.quit()  # من المهم إغلاق السائق

استخدام بروكسي دوار (أسهل)

يقدم العديد من مزودي البروكسي نقطة نهاية دوارة - عنوان URL واحد، يقوم تلقائيًا بتغيير IP مع كل طلب أو عبر فترات زمنية محددة. هذا يبسط الكود:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# نقطة نهاية بروكسي دوارة (IP يتغير تلقائيًا)
ROTATING_PROXY = "rotating.proxycove.com:8080"

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{ROTATING_PROXY}')

driver = webdriver.Chrome(options=chrome_options)

# سيكون كل طلب من IP جديد
urls = ['https://httpbin.org/ip'] * 5

for url in urls:
    driver.get(url)
    print(driver.find_element("tag name", "body").text)
    # كل إخراج سيظهر IP مختلف

driver.quit()

توصية: للمشاريع الكبيرة، استخدم البروكسي الدوار - هذا يوفر الموارد (لا حاجة لإعادة إنشاء السائق) ويسهل الكود. عادةً ما تدعم البروكسي السكنية التدوير بشكل افتراضي.

الأخطاء الشائعة وحلولها

خطأ: "ERR_PROXY_CONNECTION_FAILED"

السبب: لا يمكن لـ Selenium الاتصال بخادم البروكسي.

الحل:

  • تحقق من صحة IP ورقم منفذ البروكسي
  • تأكد من أن البروكسي نشط (تحقق عبر curl: curl -x http://123.45.67.89:8080 https://httpbin.org/ip)
  • تحقق من جدار الحماية - قد تكون الاتصالات الصادرة إلى البروكسي محظورة
  • إذا كنت تستخدم المصادقة، تحقق من صحة اسم المستخدم/كلمة المرور

خطأ: "ERR_TUNNEL_CONNECTION_FAILED"

السبب: مشكلة في الاتصال HTTPS عبر البروكسي.

الحل:

  • تأكد من أن البروكسي يدعم HTTPS (طريقة CONNECT)
  • للمواقع HTTPS، استخدم بروكسي HTTPS أو SOCKS5
  • أضف خيار تجاهل أخطاء SSL: chrome_options.add_argument('--ignore-certificate-errors')

خطأ: يعمل البروكسي، لكن الموقع يكتشف الروبوت

السبب: يستخدم الموقع طرق متقدمة للكشف (تتبع الهوية، تحليل السلوك).

الحل:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')

# تعطيل علامة webdriver (علامة رئيسية للأتمتة)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Chrome(options=chrome_options)

# إزالة navigator.webdriver
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        })
    '''
})

driver.get('https://bot.sannysoft.com/')  # موقع للتحقق من الكشف

يُوصى أيضًا باستخدام مكتبة undetected-chromedriver، التي تطبق تلقائيًا العديد من تقنيات مكافحة الكشف.

المشكلة: تحميل الصفحات ببطء عبر البروكسي

السبب: البروكسي مزدحم أو بعيد جغرافيًا.

الحل:

  • اختر بروكسي أقرب إلى الخادم المستهدف (على سبيل المثال، لاستخراج بيانات من مواقع أمريكية، استخدم بروكسي أمريكي)
  • استخدم بروكسي مراكز البيانات للمهام التي تكون فيها السرعة أهم من الخصوصية
  • قم بضبط مهلات في Selenium لتجنب التوقفات:
from selenium.webdriver.support.ui import WebDriverWait

driver.set_page_load_timeout(30)  # الحد الأقصى 30 ثانية للتحميل
driver.implicitly_wait(10)  # الانتظار الضمني للعناصر

أفضل الممارسات عند العمل مع البروكسي

1. استخدم مجموعات البروكسي
لا تعتمد على خادم بروكسي واحد. أنشئ مجموعة من 10-50 بروكسي وقم بتدويرها. إذا تم حظر بروكسي واحد، سيستمر الاستخراج من بروكسي آخر.

2. أضف تأخيرات عشوائية
حتى مع البروكسي، تبدو الطلبات السريعة جدًا مشبوهة. أضف تأخيرات عشوائية من 2-5 ثوانٍ بين الطلبات:

import time
import random

for url in urls:
    driver.get(url)
    # استخراج...
    time.sleep(random.uniform(2, 5))  # تأخير عشوائي من 2-5 ثوانٍ

3. راقب جودة البروكسي
تحقق من البروكسي قبل الاستخدام. استبعد من المجموعة تلك التي لا تستجيب أو تعيد أخطاء:

import requests

def check_proxy(proxy):
    """التحقق من عمل البروكسي"""
    try:
        response = requests.get(
            'https://httpbin.org/ip',
            proxies={'http': f'http://{proxy}', 'https': f'http://{proxy}'},
            timeout=10
        )
        return response.status_code == 200
    except:
        return False

# تصفية البروكسي العاملة
working_proxies = [p for p in PROXY_LIST if check_proxy(p)]
print(f"البروكسي العاملة: {len(working_proxies)}/{len(PROXY_LIST)}")

4. استخدم وضع headless بحذر
من السهل اكتشاف المتصفحات بدون رأس. للمواقع المعقدة، قم بتشغيل المتصفح في الوضع العادي أو استخدم --window-size بدلاً من --headless.

5. قم بتسجيل جميع الطلبات
احتفظ بمعلومات حول البروكسي المستخدم لكل طلب. سيساعد ذلك في تحديد البروكسيات المشكلة وتصحيح الأخطاء.

6. احترم robots.txt وحدود المعدل
حتى مع البروكسي، احترم قواعد الموقع. يمكن أن يؤدي الاستخراج العدواني إلى حظر الشبكات الفرعية بالكامل للبروكسي، مما يضر بالمستخدمين الآخرين.

الخاتمة

يعد الإعداد الصحيح للبروكسي في Selenium WebDriver أساسًا لاستخراج البيانات المستقر والأتمتة. لقد استعرضنا جميع الطرق الرئيسية لدمج البروكسي لـ Chrome و Firefox، والعمل مع المصادقة، وتدوير عناوين IP، وحل المشكلات الشائعة. الأهم هو اختيار نوع البروكسي المناسب لمهمتك: للاستخراج البسيط، يكفي استخدام بروكسي مراكز البيانات، بينما للعمل مع المنصات المحمية، تحتاج إلى بروكسي سكنية أو موبايل.

تذكر أفضل الممارسات: استخدم مجموعات البروكسي، أضف تأخيرات عشوائية، راقب جودة الاتصالات، وطبق تقنيات مكافحة الكشف. سيزيد ذلك من استقرار سكربتاتك ويقلل من خطر الحظر بشكل كبير.

إذا كنت تخطط لأتمتة الاستخراج مع متطلبات عالية للخصوصية وتجاوز أنظمة مكافحة الروبوتات، نوصي بتجربة البروكسي السكنية - فهي توفر أقصى استقرار في العمل مع أي موقع، بما في ذلك الشبكات الاجتماعية، ومنصات التجارة الإلكترونية، والخدمات ذات الحماية المتقدمة. بالنسبة للمهام التي تتطلب سرعة معالجة كميات كبيرة من البيانات، ستكون بروكسي مراكز البيانات الخيار الأمثل من حيث السعر والأداء.

```