Socks5Proxy

إعداد بروكسي Selenium، ربط SOCKS5·HTTP بروكسي بـ Chrome وFirefox

يشرح هذا الدليل كيفية توصيل بروكسي HTTP وSOCKS5 من Socks5Proxy في Selenium 4 لتشغيل Chrome وFirefox، وإعداد استخدام مصادقة IP لأن وسائط تشغيل Chrome لا تقبل كلمات مرور البروكسي.

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

Chrome يقبل عنوان البروكسي كمعامل تشغيل عبر --proxy-server، ولكنه لا يقبل اسم المستخدم وكلمة المرور داخل العنوان. إذا قمت بتوصيل بروكسي يتطلب اسم مستخدم وكلمة مرور، ستظهر نافذة مصادقة في المتصفح، ومن الصعب إدخال القيم في هذه النافذة باستخدام Selenium.

الحل الأكثر أناقة هو تفويض IP. قم بتسجيل عنوان IPv4 للخادم أو الكمبيوتر الذي يعمل عليه Selenium في لوحة التحكم، وسيقبل البروكسي الاتصالات من هذا العنوان دون اسم مستخدم أو كلمة مرور. ثم تحتاج فقط إلى إضافة ip:port في Chrome. يمكنك تسجيل ما يصل إلى 10 عناوين IP لاستخدامها عبر خوادم متعددة.

يستخدم المثال عنوان IP 198.51.100.23 ومنفذ HTTP 8000 ومنفذ SOCKS5 1080.

pip install selenium

كيف أقوم بتوصيل HTTP بروكسي بـ Chrome؟

بعد تسجيل تفويض IP، قم بإضافة العنوان كمعلمة --proxy-server في ChromeOptions. بدءًا من Selenium 4.6، يقوم Selenium Manager بتنزيل chromedriver المناسب تلقائيًا، لذا لا تحتاج إلى تثبيته يدويًا.

تظل نفس المعلمات سارية حتى في الوضع headless. للتحقق من الاتصال، افتح عنوان IP للتحقق وتأكد من أن IP المعروض هو IP الوكيل.

from selenium import webdriver
from selenium.webdriver.common.by import By

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")

driver = webdriver.Chrome(options=opts)
try:
    driver.get("https://api.ipify.org")
    print(driver.find_element(By.TAG_NAME, "body").text)  # should print the proxy IP
finally:
    driver.quit()

كيفية استخدام SOCKS5 بروكسي في Chrome؟

ضع عنوان socks5:// في --proxy-server. يستخدم Chrome SOCKS5 للتحقق من اسم النطاق من خلال البروكسي، ولكن في بعض البيئات قد يبقى التحقق الداخلي من DNS، لذا يُستخدم غالبًا الوسيطة --host-resolver-rules لمنع التحقق المحلي من الأسماء.

SOCKS5 يعمل أيضًا مع تفويض IP لأن Chrome لا يدعم المصادقة باسم المستخدم وكلمة المرور لبروكسي SOCKS.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')

driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

كيفية الاتصال بـ Firefox؟

Firefox يحدد البروكسي عبر قيم التفضيلات. قم بتعيين network.proxy.type إلى 1 (يدوي) وإدخال عنوان HTTP أو SOCKS والمنفذ. لـ SOCKS5، قم بتعيين network.proxy.socks_version إلى 5 و network.proxy.socks_remote_dns إلى True ليتم التحقق من الاسم عبر البروكسي.

Firefox أيضًا لا يسمح بإدخال كلمة مرور البروكسي عبر إعدادات التشغيل، لذا فإن استخدام IP التفويض هو الأبسط.

from selenium import webdriver

opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

كيفية تشغيل متصفحات متعددة باستخدام IPs مختلفة في نفس الوقت؟

يمكنك تشغيل كل متصفح بعنوان بروكسي مختلف. الكود التالي مثال لاستقبال قائمة ip:port عبر API وفتح 3 متصفحات بعناوين IP مختلفة. بما أن كل متصفح يستهلك ذاكرة كبيرة، حدد عدد المتصفحات التي تعمل في نفس الوقت وفقًا لحجم الخادم.

للعمليات الطويلة مثل جلسات المتصفح، يُفضل استخدام IP ثابت لكل متصفح وعدم تغييره حتى انتهاء المهمة.

import requests
from selenium import webdriver

KEY = "YOUR_API_KEY"
lines = requests.get(
    "https://socks5proxy.io/api/v1/proxies/download",
    params={"format": "ip:port", "protocol": "http"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()

drivers = []
for line in lines[:3]:
    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless=new")
    opts.add_argument("--proxy-server=http://" + line)
    drivers.append(webdriver.Chrome(options=opts))

for d in drivers:
    d.get("https://api.ipify.org")
    print(d.page_source)
    d.quit()

ماذا تفعل إذا كنت بحاجة إلى استخدام المصادقة باسم المستخدم وكلمة المرور؟

إذا كنت في بيئة لا يمكن فيها استخدام تفويض IP، مثل البيئات التي يتغير فيها IP باستمرار، هناك طريقتان. الأولى هي استخدام مكتبات بروكسي وسيطة مثل selenium-wire لإدخال معلومات التفويض نيابةً عنك، والثانية هي تشغيل بروكسي وسيط محلي بدون تفويض على نفس الخادم، بحيث يتصل Chrome بالعنوان المحلي ويتصل البروكسي الوسيط بـ Socks5Proxy باستخدام اسم المستخدم وكلمة المرور.

كلتا الطريقتين تضيف عنصرًا إضافيًا للإدارة. إذا أمكن، استخدام المصادقة عبر IP من خادم ذي IP ثابت هو الأبسط والأسرع.

ما الذي يجب ضبطه لتكييف بيئة المتصفح مع الدولة المستهدفة؟

قم بتغيير معلمة --lang في Chrome وإعداد Accept-Language لتتناسب مع دولة IP، حتى تفتح الصفحة بلغة تلك الدولة. إذا كان الموقع يعتمد على المنطقة الزمنية، يمكنك استخدام أمر CDP Emulation.setTimezoneOverride لتعديل المنطقة الزمنية أيضًا.

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

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")

driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()

هل يمكن استخدام نفس الإعدادات في Selenium Grid أو المتصفح البعيد؟

نعم. يتم تمرير ChromeOptions وFirefoxOptions كما هي حتى في التنفيذ عن بعد. عند إضافة نفس الخيارات إلى webdriver.Remote، يتصل متصفح Grid بالبروكسي المحدد. في هذه الحالة، يجب تسجيل عنوان IP للخادم الذي يعمل عليه المتصفح وليس الكمبيوتر الذي ينفذ الكود.

إذا كان لديك عدة عقد، يرجى تسجيل جميع عناوين IP الخاصة بها. يمكنك تسجيل ما يصل إلى 10 عناوين IP. إذا كانت العقد السحابية تتغير بشكل متكرر، فإن إرفاق عنوان IP ثابت للعقدة يجعل إدارتها أسهل.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

ما الذي يجب التحقق منه عند فشل الاتصال؟

ERR_PROXY_CONNECTION_FAILED غالبًا ما يكون بسبب عنوان أو منفذ خاطئ. تأكد من عدم إدخال منفذ SOCKS5 في عنوان HTTP. إذا ظهر ERR_TUNNEL_CONNECTION_FAILED أو نافذة مصادقة، فمن المحتمل أن يكون IP المسجل في IP التفويض مختلف عن IP الفعلي. قم بفتح api.ipify.org بدون بروكسي عبر cURL في الخادم للتحقق من IP الخارج وقم بتسجيل هذه القيمة.

قد تتغير عناوين IP الصادرة عند إعادة تشغيل خادم السحابة. استخدم عنوان IP ثابتًا، أو قم بتحديث قائمة التسجيل في لوحة التحكم عند تغيير عنوان IP.

إعداد بروكسي Selenium، طريقة الاتصال بـ Chrome·Firefox | Socks5Proxy