تُعد عملية استخراج البيانات من الويب سباق تسلح مستمر بين مستخرجي البيانات ومالكي المواقع. ومع تطور دفاعات مكافحة البوتات مثل Cloudflare وDataDome وPerimeterX، غالباً ما تفشل مكتبات الطلبات القياسية في تجاوز آليات الكشف الحديثة. للمطورين ذوي المستوى المتوسط والمتقدم بلغة Python، تكمن الحل ليس في الأدوات الأبسط، بل في أتمتة المتصفح الأكثر تعقيداً. يستكشف هذا الدليل كيفية بناء مخزّنات بيانات قوية ومقاومة لأنظمة كشف البوتات باستخدام Selenium وChrome في وضع غير مرئي (Headless Chrome)، مع التركيز على محاكاة سلوك الإنسان وتجنب الكشف.
لماذا نستخدم Chrome في وضع غير مرئي وSelenium؟
ترسل عملاء HTTP التقليديين طلبات تفتقر إلى سياق بيئة المتصفح الحقيقي. فهي لا تنفذ أكواد JavaScript، ولا تعرض تنسيقات CSS، ولا تحافظ على ملفات تعريف الارتباط (Cookies) عبر الجلسات بنفس الطريقة التي يفعلها المستخدم البشري. تعتمد المواقع الحديثة بشكل كبير على JavaScript من جانب العميل لتحميل المحتوى الديناميكي وتنفيذ تقنيات بصمات الأصابع (Fingerprinting) لتحديد الأتمتة.
يعمل Selenium كجسر للتحكم في نسخة حقيقية من المتصفح—تحديداً Chrome في هذا السياق. ومن خلال استخدام Chrome في وضع غير مرئي، يمكننا الاستفادة من محرك العرض الكامل للمتصفح دون عبء واجهة المستخدم الرسومية. يوفر هذا الوصول إلى DOM وملفات تعريف الارتباط والتخزين المحلي، مما يجعل من الصعب جداً على المواقع التمييز بين البوت والمستخدم البشري.
تهيئة المشغل مع خيارات التخفي
الخطوة الأولى في بناء مخزّن بيانات مقاوم للبوتات هي تكوين خيارات Chrome بشكل صحيح. بشكل افتراضي، تكشف متصفحات الوضع غير المرئي عن نفسها من خلال علامات وخصائص محددة تكتشفها أنظمة الأمان. نحتاج إلى إزالة هذه الآثار الرقمية.
يُظهر أدناه إعداداً أساسياً يقوم بإيقاف إشارات الأتمتة المحددة وتمكين وضع العرض غير المرئي:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
def setup_driver():
chrome_options = Options()
# التشغيل في وضع غير مرئي
chrome_options.add_argument("--headless=new")
# إزالة أدلة الأتمتة
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# ضروري للاستقرار والتخفي
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
driver = webdriver.Chrome(service=Service(), options=chrome_options)
# تنفيذ أمر CDP لتجاوز navigator.webdriver
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
return driver
driver = setup_driver()
السطر الأكثر أهمية في الكود أعلاه هو أمر CDP (بروتوكول أدوات مطوري Chrome). يقوم بتعديل خاصية navigator.webdriver، وهي المؤشر الأساسي الذي تستخدمه العديد من خدمات مكافحة البوتات للكشف عن الأتمتة. من خلال تعيينها إلى undefined، نخفي وجود البوت.
محاكاة سلوك الإنسان
حتى لو نجحت في إخفاء حقيقة أنك تستخدم متصفحاً، فقد يتم اكتشاف أنماط تفاعلك بعد ذلك. غالباً ما تتحرك البوتات فوراً، أو تنقر دون تردد، أو تتصفح بسرعة ثابتة. لمحاكاة السلوك البشري، يجب إدخال العشوائية والتأخير الزمني.
يمكن استخدام ActionChains في Selenium أو فترات الانتظار الصريحة البسيطة للمساعدة. على سبيل المثال، لا تنتقل مباشرة إلى صفحة ما فور بدء تشغيل المشغل. أضف تأخيراً عشوائياً لمحاكاة وقت تفكير المستخدم:
import time
import random
def human_delay(min_seconds=2, max_seconds=5):
time.sleep(random.uniform(min_seconds, max_seconds))
# مثال على الاستخدام
human_delay()
driver.get("https://example.com")
human_delay()
علاوة على ذلك، فكر في استخدام تدوير وكلاء المستخدم (User Agents) وعناوين IP الوكيل. بينما يتطلب ذلك بنية تحتية قوية، إلا أنه أمر أساسي لعمليات استخراج البيانات واسعة النطاق. تأكد دائماً من أن عناوين IP الخاصة بك هي عناوين IP سكنية أو خلوية بدلاً من عناوين IP مراكز البيانات، حيث يتم حظر الأخيرة بسهولة.
التعامل مع المحتوى الديناميكي وفحوصات مكافحة البوتات
تقدم العديد من أنظمة مكافحة البوتات صور التحقق من صحة CAPTCHA أو صفحات تحدي قبل السماح بالوصول إلى المحتوى. يسمح لك Selenium بالتفاعل مع هذه العناصر كما يفعل الإنسان. ومع ذلك، فإن أتمتة حل CAPTCHA معقدة وغالباً ما تنتهك شروط الخدمة. نهج أفضل هو تنفيذ منطق إعادة المحاولة القوي والتراجع الأسي.
إذا فشلت الصفحة في التحميل أو ظهرت تحدي، انتظر لفترة عشوائية وأعد المحاولة. هذا يحاكي مستخدمًا قد يكون لديه اتصال بطيء أو واجه عطلاً مؤقتاً، بدلاً من نص برمجي يضرب الخادم مراراً وتكراراً.
from selenium.common.exceptions import TimeoutException
try:
driver.find_element_by_css_selector(".content")
except TimeoutException:
print("لم يتم تحميل المحتوى، جاري إعادة المحاولة...")
human_delay(5, 15)
driver.refresh()
الخاتمة
لم يعد بناء مخزّنات بيانات مقاومة للبوتات يتعلق بكتابة نص برمجي سريع باستخدام مكتبة requests. إنه يتطلب فهماً شاملاً لبيئات المتصفح وتقنيات بصمات الأصابع وأنماط التفاعل الشبيهة بالبشر. من خلال استخدام Selenium مع Chrome في وضع غير مرئي مُهيأ بعناية، وإخفاء إشارات الأتمتة، وإدخال العشوائية السلوكية، يمكنك زيادة معدل نجاح مشاريع استخراج البيانات بشكل كبير. تذكر احترام ملفات robots.txt وشروط الخدمة للمواقع، مما يضمن بقاء أنشطة استخراج البيانات الخاصة بك أخلاقية ومستدامة.