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

بروكسي لسكربلينغ وبوتاسوروس ونودرايفر: إعداد ضد مضادات الروبوتات في 2024

نستعرض إعداد البروكسي في الأطر الجديدة للتجريف - Scrapling و Botasaurus و nodriver. الكود، أمثلة التدوير، توصيات لاختيار IP لتجاوز حماية البوتات.

📅١٠ جمادى الأولى ١٤٤٨ هـ

ترتطم الروابط الكلاسيكية بين Selenium و Puppeteer بشكل متزايد بأنظمة مكافحة الروبوتات من مستوى Cloudflare و DataDome و PerimeterX. وتحل محلها أطر جديدة — Scrapling و Botasaurus و nodriver، التي تم تصميمها في الأصل مع التركيز على تجاوز الكشف. لكن حتى أكثر إطار عمل متقدم لا قيمة له بدون إعداد بروكسي بشكل صحيح. في هذه المقالة، سنستعرض كيفية توصيل البروكسي في كل من الأدوات الثلاث، وما هي الأخطاء التي تقتل الفعالية وكيفية اختيار نوع IP لمهمة التجريف المحددة.

كيف تختلف Scrapling و Botasaurus و nodriver عن Selenium

ظهرت جميع الأطر الثلاثة كاستجابة لكون Selenium و Puppeteer العاديين أصبحا سهلين الكشف بشكل مفرط. تتحقق أنظمة مكافحة الروبوتات من عشرات المعلمات: بروتوكول CDP، navigator.webdriver، رسم canvas، توقيتات الأحداث — وتترك السائقون الكلاسيكيون آثارًا مميزة تقريبًا في كل منها.

Scrapling — مكتبة Python تجمع بين التجريف التكيفي لـ HTML مع إمكانية محاكاة المتصفح عبر StealthyFetcher المبني على Camoufox (نسخة معدلة من Firefox مع بصمة مصححة). إنها جيدة للمهام، حيث يحتاج التجريف السريع إلى استهلاك موارد منخفض، ولكن في الوقت نفسه تتحقق حماية الموقع بنشاط من TLS-fingerprint.

Botasaurus — إطار عمل مبني على Chromium المعدل (undetected-chromedriver تحت الغطاء)، مصمم للتجريف المتوازي الضخم مع إدارة تلقائية لملفات تعريف المتصفح ودعم مدمج لحل CAPTCHA عبر خدمات خارجية.

nodriver — خليفة undetected-chromedriver من نفس المؤلف، الذي تخلى عن Selenium WebDriver تمامًا ويعمل مباشرة عبر CDP (بروتوكول أدوات تطوير Chrome)، مما يزيل جزءًا كبيرًا من الآثار القابلة للكشف عن الأتمتة.

السمة المشتركة بين الثلاثة هي أنها تقلل من الكشف على مستوى بصمة المتصفح، لكنها لا تحل مشكلة سمعة IP. إذا كانت الطلبات تأتي من IP مركز بيانات تم الكشف عنه بالفعل في القوائم السوداء لـ DataDome أو Cloudflare، فلن تنقذ أي تصحيح للمتصفح من CAPTCHA أو خطأ 403.

إعداد البروكسي في Scrapling

يدعم Scrapling البروكسي في وضع HTTP السريع (Fetcher) وكذلك في وضع المتصفح (StealthyFetcher). للتجريف الثابت بدون تجسيد JS، يتم تمرير البروكسي مباشرة في معلمات الطلب:

from scrapling.fetchers import Fetcher

response = Fetcher.get(
    "https://example.com",
    proxy="http://user:[email protected]:9000"
)
print(response.status)

في وضع المتصفح الكامل (StealthyFetcher على Camoufox)، يتم تمرير البروكسي عبر قاموس مع حقول منفصلة للخادم واسم المستخدم وكلمة المرور — هذا مهم، لأن Camoufox يعالج مصادقة البروكسي بشكل مختلف عن Chromium العادي:

from scrapling.fetchers import StealthyFetcher

response = StealthyFetcher.fetch(
    "https://example.com",
    proxy={
        "server": "gate.proxycove.com:9000",
        "username": "user",
        "password": "pass"
    },
    headless=True
)
print(response.status)

خطأ شائع هو تمرير البروكسي كسلسلة كاملة في وضع المتصفح، كما في طلبات HTTP. في هذه الحالة، إما أن يتجاهل Camoufox المصادقة، أو يتعطل مع مهلة في مرحلة الاتصال بخادم البروكسي. إذا رأيت خطأ ERR_NO_SUPPORTED_PROXIES — تحقق من تنسيق القاموس مع الحقول المنفصلة.

إعداد البروكسي في Botasaurus

يستخدم Botasaurus الزخرفة @browser لتكوين السائق، ويتم تمرير البروكسي كمعلمة لهذه الزخرفة أو مباشرة في وظيفة التشغيل:

from botasaurus.browser import browser, Driver

@browser(
    proxy="http://user:[email protected]:9000"
)
def scrape_data(driver: Driver, data):
    driver.get("https://example.com")
    return driver.page_html

scrape_data()

إذا كنت بحاجة إلى توصيل بروكسيات مختلفة لكل مهمة متوازية (وهو أمر حاسم عند التجريف الضخم عبر Botasaurus)، فمن الأفضل تمرير البروكسي ديناميكيًا عبر قائمة البيانات، بدلاً من ترميزها في الزخرفة:

from botasaurus.browser import browser, Driver

@browser
def scrape_with_proxy(driver: Driver, data):
    driver.config.proxy = data["proxy"]
    driver.get(data["url"])
    return driver.page_html

tasks = [
    {"url": "https://example.com/page1", "proxy": "http://user:pass@ip1:port"},
    {"url": "https://example.com/page2", "proxy": "http://user:pass@ip2:port"},
]
scrape_with_proxy(tasks)

يقوم Botasaurus بتوزيع المهام بشكل ممتاز عبر multiprocessing، لذلك عند التجريف الضخم من المهم استخدام بروكسي مع مجموعة كافية من IP — وإلا ستتنافس عدة خيوط على نفس العنوان، مما يكشف الأتمتة على الفور للروبوت بناءً على نمط تكرار الطلبات.

إعداد البروكسي في nodriver

يعمل nodriver من خلال اتصال مباشر بـ CDP بدون طبقة Selenium، لذلك يتم إعداد البروكسي هنا عبر معلمات تشغيل المتصفح، وليس عبر API منفصل. بالنسبة للبروكسي بدون مصادقة، الأمر بسيط:

import nodriver as uc
import asyncio

async def main():
    browser = await uc.start(
        browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
    )
    page = await browser.get("https://example.com")
    await asyncio.sleep(3)
    browser.stop()

asyncio.run(main())

المشكلة هي أن Chromium لا يدعم تسجيل الدخول/كلمة المرور في البروكسي عبر --proxy-server مباشرة. بالنسبة للبروكسيات المصرح بها في nodriver، يجب إما إنشاء نفق بروكسي محلي بدون مصادقة (على سبيل المثال، عبر px أو 3proxy)، أو معالجة حدث CDP Fetch.authRequired:

import nodriver as uc
import asyncio

async def main():
    browser = await uc.start(
        browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
    )
    page = await browser.get("https://example.com")

    async def auth_handler(event):
        await page.send(uc.cdp.fetch.continue_with_auth(
            request_id=event.request_id,
            auth_challenge_response=uc.cdp.fetch.AuthChallengeResponse(
                response="ProvideCredentials",
                username="user",
                password="pass"
            )
        ))

    page.add_handler(uc.cdp.fetch.AuthRequired, auth_handler)
    await asyncio.sleep(5)
    browser.stop()

asyncio.run(main())

هذه هي النقطة الأقل وضوحًا بين جميع الأطر الثلاثة — يقضي العديد من المطورين ساعات في محاولة فهم لماذا لا تعمل المصادقة ببساطة، دون معرفة عن مجال Fetch في CDP.

تدوير البروكسي ومكافحة الروبوتات

حتى بصمة المتصفح المثالية الإعداد لن تنقذ إذا كان هناك أكثر من 50-100 طلب في الدقيقة إلى نطاق محمي من IP واحد. تقوم DataDome و Cloudflare بتحليل تكرار الطلبات من عنوان معين وأنماط زمنية بين الإجراءات — الفترات الزمنية المتساوية جدًا أيضًا مشبوهة.

يتم بناء مخطط التدوير لجميع الأطر الثلاثة بنفس الطريقة:

  1. استخدم بوابة مع تدوير تلقائي لـ IP على مستوى المزود — لا تحتاج إلى كتابة منطق خاص لتغيير العناوين لكل طلب.
  2. للمهام الجلسة (تسجيل الدخول، التنقل عبر صفحات متعددة) قم بتثبيت IP على الجلسة عبر معلمة sticky في سلسلة الاتصال.
  3. للتجريف البسيط للصفحات الثابتة، قم بتدوير IP مع كل طلب أو كل 5-10 طلبات.
  4. أضف تأخيرات عشوائية بين الطلبات (1-4 ثوانٍ) — هذا يقلل من الكشف بناءً على الأنماط الزمنية.

مثال على جلسة sticky في سلسلة الاتصال، حيث يحتفظ session-id بنفس IP الصادر لمدة 10 دقائق:

proxy = "http://user-session-abc123:[email protected]:9000"

بالنسبة لـ Botasaurus، تعتبر هذه الخطة مفيدة بشكل خاص، لأنه عند التجريف المتوازي يمكن لكل عملية الحصول على session-id فريد خاص بها، مما يمنحك مجموعة مستقرة من IPs مختلفة دون إدارة يدوية لقائمة العناوين.

ما هو نوع البروكسي الذي يجب اختياره لكل إطار عمل

يؤثر نوع البروكسي على نجاح التجريف بنفس القدر الذي يؤثر به اختيار الإطار. فيما يلي مقارنة حسب المهام:

المهمة نوع البروكسي الموصى به لماذا
تجريف المواقع مع Cloudflare/DataDome بروكسي سكنية IP الحقيقي لمستخدمي المنازل نادرًا ما يدخل قوائم الحظر الخاصة بأنظمة مكافحة الروبوتات
تجريف ضخم بدون حماية صارمة بروكسي مراكز البيانات سرعة أعلى، تكلفة أقل عند كميات كبيرة من الطلبات
محاكاة مستخدم حقيقي على المواقع المحمولة بروكسي محمولة عناوين CGNAT لمشغلي الشبكات لديها أعلى مستوى من الثقة لدى أنظمة مكافحة الروبوتات

بالنسبة لـ Scrapling في وضع StealthyFetcher، فإن البروكسيات السكنية تعطي أفضل تأثير، لأن Camoufox يحل بالفعل مشكلة بصمة المتصفح — يبقى فقط عدم الكشف عن الهوية عبر IP. بالنسبة لـ Botasaurus عند التجريف الضخم المتوازي، غالبًا ما تكون بروكسيات مراكز البيانات مثالية من حيث سرعة/سعر، إذا لم يستخدم الموقع المستهدف حماية متقدمة من مستوى DataDome.

الأخطاء الشائعة عند ربط البروكسي وأتمتة المتصفح

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

  • نفس IP لجميع خيوط Botasaurus المتوازية. ترى أنظمة مكافحة الروبوتات 20 جلسة متزامنة من عنوان واحد وتقوم بحظره في دقائق.
  • تمرير البروكسي كسلسلة في وضع المتصفح لـ Scrapling. يتطلب Camoufox قاموسًا مع حقول مفصولة — وإلا فلن تمر المصادقة.
  • تجاهل مجال CDP Fetch في nodriver. بدون معالج authRequired، لن يتصل البروكسي المصرح به ببساطة، سيتجمد المتصفح عند التحميل.
  • عدم وجود تدوير أثناء الإجراءات الجلسة. تغيير IP في منتصف جلسة مصرح بها يكشف الأتمتة على الفور — استخدم الجلسات الثابتة.
  • عدم تطابق الموقع الجغرافي للبروكسي مع لغة المتصفح. IP من ألمانيا مع رؤوس Accept-Language: ru — علامة كلاسيكية على الروبوت لأنظمة تقييم الاحتيال.
  • تكرار الطلبات بشكل عدواني حتى مع التدوير. لا تلغي تدوير IP الحاجة إلى أخذ فترات راحة بين الطلبات — يتم تحليل نمط السلوك أيضًا.

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

الخاتمة

تحل Scrapling و Botasaurus و nodriver مشكلة الكشف على مستوى بصمة المتصفح بشكل أفضل بكثير من Selenium الكلاسيكي، لكن لا يلغي أي منها أهمية البروكسي الجيد. الإعداد الصحيح للمصادقة (خاصة في nodriver عبر CDP)، تدوير IP بشكل مناسب واختيار النوع المناسب من البروكسي لنظام مكافحة الروبوتات المحدد — ثلاثة عوامل تحدد استقرار التجريف على المدى الطويل.

إذا كنت تقوم بتجريف مواقع مع حماية متقدمة مثل Cloudflare أو DataDome، ابدأ بـ بروكسي سكنية — فهي تعطي أعلى نسبة من الطلبات الناجحة بفضل سمعة IP. بالنسبة للمهام الضخمة بدون حماية صارمة، تظل بروكسيات مراكز البيانات الخيار الأمثل من حيث السرعة والتكلفة عند كميات كبيرة.