خانه/مقالات/اسکریپینگ با Undetected Chromedriver در پایتون
سلنیوم
پروکسی و چرخش IP
ضد بلاک (Anti-bot)
برگشت به مقاله‌ها

اسکریپینگ با Undetected Chromedriver در پایتون

اسکریپینگ با Undetected Chromedriver در پایتون
این راهنما به‌صورت عملی نشان می‌دهد چطور با <strong>Undetected Chromedriver</strong> در پایتون بوت‌های Selenium را تقویت کنید، پراکسی‌های ساده و احراز هویتی را پیکربندی کنید، و نکات پایداری، خطا و جایگزین‌های عملی برای اجرا در مقیاس را بیاموزید.
آسان اسکریپ آسان اسکریپ
1405-06-15

آسان اسکریپ را در گوگل منبع ترجیحی کن تا مطالب ما زودتر و پررنگ‌تر برایت نمایش داده شود. افزودن از تنظیمات گوگل

مقدمه

در این مقاله قدم‌به‌قدم یاد می‌گیریم چگونه با استفاده از Undetected Chromedriver در پایتون، رصدگرهای پیشرفتهٔ ضدبات را دشوارتر کنیم. هدف عملی این راهنما پوشش نصب، نمونه‌های کد، تنظیمات پراکسی (شامل پراکسی با نام‌کاربری/رمز)، نکات پایداری و جایگزین‌های عملی برای زمانی است که اجرای headless به‌تنهایی کافی نیست. پس از خواندن این مطلب باید بتوانید بوت‌های Selenium را با احتیاط و اصول مهندسی تولید کنید تا احتمال بلاک شدن کمتر شود.

Undetected Chromedriver چیست و چرا به کار می‌آید

Undetected Chromedriver نسخه‌ای از ChromeDriver است که تغییراتی برای پنهان‌سازی مؤلفه‌های شناسهٔ مرورگر (fingerprint) اعمال می‌کند. مرورگرهای اتوماتیکِ بدون محافظت، اطلاعاتی مانند پرچم navigator.webdriver، شناسه‌های ویژگی‌های جاوااسکریپت و رفتارهای خاص را لو می‌دهند که موتورهای ضدبات (مثل Cloudflare، DataDome و PerimeterX) از آن‌ها برای تشخیص استفاده می‌کنند. این پروژه سعی می‌کند این نشت‌ها را بپوشاند و باعث شود ردگیریِ مبتنی بر کروم‌درایور کمتر موفق باشد—اما توجه کنید که هیچ روشی 100% مقاوم نیست.

نصب

برای نصب کافی است بسته را با pip نصب کنید. این دستور بستهٔ undetected-chromedriver را در محیط پایتون شما می‌آورد.

pip install undetected-chromedriver

ورودی: دستور نصب pip. خروجی: بستهٔ نصب‌شده که بعداً در کد قابل واردسازی است. اگر از ویرچوال‌انوا محیط (virtualenv / venv) استفاده می‌کنید، نصب را داخل همان محیط انجام دهید تا تداخل نسخه رخ ندهد.

نمونهٔ استفادهٔ پایه

نمونهٔ سادهٔ راه‌اندازی و باز کردن صفحه با undetected_chromedriver:

import undetected_chromedriver as uc

# ایجاد درایور با تنظیمات پیش‌فرض
driver = uc.Chrome()

# از متغیر PLACEHOLDER برای آدرس هدف استفاده کنید
url = "TARGET_URL"
driver.get(url)

توضیح خط‌به‌خط: import undetected_chromedriver as uc بسته را وارد می‌کند. uc.Chrome() درایور را دانلود (اگر لازم باشد) و patchهای مربوط به پنهان‌سازی را اعمال می‌کند. ورودی: مقدار url که شما باید با آدرس هدف جایگزین کنید؛ خروجی: مرورگر باز شده و صفحهٔ هدف بارگذاری می‌شود.

انتخاب نسخهٔ خاص Chrome

اگر به نسخهٔ خاصی از Chrome نیاز دارید (مثلاً سازگاری با یک سایت یا افزونه)، می‌توانید قبل از ساخت درایور مقدار هدف را تعیین کنید:

import undetected_chromedriver as uc

# انتخاب نسخهٔ کروم قبل از ساخت درایور
uc.TARGET_VERSION = 85
driver = uc.Chrome()

اینجا uc.TARGET_VERSION ورودی است که نسخهٔ عددی کروم را مشخص می‌کند. خروجی این دستور، درایوری است که سعی می‌کند همان نسخهٔ کروم را دانلود و پچ کند.

تنظیمات ChromeOptions

می‌توانید گزینه‌های کروم را مثل مرورگر عادی تنظیم کنید؛ اما مراقب باشید که تغییر برخی تنظیماتِ داخلیِ پچ‌شده می‌تواند اثرات منفی روی قابلیت مخفی‌سازی بگذارد.

import undetected_chromedriver as uc

options = uc.ChromeOptions()
# مثال: غیرفعال کردن بارگذاری تصاویر برای صرفه‌جویی در پهنای‌باند
options.add_argument('--blink-settings=imagesEnabled=false')

driver = uc.Chrome(options=options)
url = "TARGET_URL"
driver.get(url)

نکتهٔ مهم: برخی از آرگومان‌ها یا فلگ‌ها ممکن است رفتارهای patched را باز کنند و باعث شوند مرورگر دوباره قابل‌شناسایی شود. قبل از تغییر تنظیمات، مستندات و نسخهٔ پچ‌شده را بررسی کنید و هر تغییر را در محیط آزمایشی بررسی کنید.

استفاده از پراکسی ساده

برای تغییر IP هر درخواست معمولاً از آرگومان --proxy-server استفاده می‌کنیم:

import undetected_chromedriver as uc

PROXY = "IP:PORT"  # مثال: "1.2.3.4:8080"
options = uc.ChromeOptions()
options.add_argument(f'--proxy-server={PROXY}')

driver = uc.Chrome(options=options)
url = "TARGET_URL"
driver.get(url)

ورودی: متغیر PROXY که آدرس و پورت پراکسی را دارد. خروجی: درخواست‌ها از طریق پراکسی هدایت می‌شوند. این روش برای پراکسی‌های بدون احراز هویت مناسب است.

پراکسی‌های نیازمند احراز هویت (username/password)

برای پراکسی‌های دارای نام‌کاربری و رمز معمولاً روش سادهٔ بالا کافی نیست. یک راهکار عملی، استفاده از بستهٔ seleniumwire است که امکان ارسال credentials را می‌دهد و می‌تواند همراه با undetected chromedriver استفاده شود:

import seleniumwire.undetected_chromedriver as uc

chrome_options = uc.ChromeOptions()
proxy_options = {
    'proxy': {
        'http': 'http://USER:PASS@IP:PORT',
        'https': 'https://USER:PASS@IP:PORT',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

# درایور با تنظیمات seleniumwire برای پراکسی احراز هویت شده
driver = uc.Chrome(options=chrome_options, seleniumwire_options=proxy_options)
url = "TARGET_URL"
driver.get(url)

شرح: این الگو ورودی‌های USER، PASS، IP و PORT را می‌پذیرد و خروجی، درایوری است که ترافیک را از طریق پراکسی احراز هویت‌شده هدایت می‌کند. در محیط‌های تولیدی اطمینان حاصل کنید اطلاعات محرمانه را در متغیرهای محیطی ذخیره کنید و در کد هاردکد نکنید.

مدیریت خطا، retry و زمان‌بندی

مرورگرها گاهی به‌خاطر صف‌ها، قطع اتصال پراکسی یا خطاهای داخلی کرش می‌کنند. یک استراتژی پایه‌ای retry را همیشه داشته باشید:

from selenium.common.exceptions import WebDriverException
import time

def get_with_retry(driver, url, retries=3, backoff=2):
    """تلاش برای بارگذاری صفحه با مکانیزم backoff نمایی."""
    for attempt in range(retries):
        try:
            driver.get(url)
            return True
        except WebDriverException as e:
            # لاگ کردن خطا و صبر قبل از تلاش مجدد
            time.sleep(backoff * (2 ** attempt))
    # اگر همهٔ تلاش‌ها شکست خورد، استثنا پرتاب کن
    raise

ورودی: شیٔ driver و url، خروجی: True در صورت موفقیت یا پرتاب استثنا پس از شکست. برای تولید مقیاس‌پذیرتر، از افزونه‌های نظارتی، لاگینگ ساختاری و صف‌های کاری استفاده کنید.

محدودیت‌ها، خطرات و بهترین روش‌ها

  • قابلیت تشخیص: کدهای متن‌باز می‌توانند توسط شرکت‌های ضدبات تحلیل و رفع شوند؛ بنابراین اثربخشی پچ‌ها ممکن است کوتاه‌مدت باشد.
  • تعامل دستی باعث کشف می‌شود: استفاده از موس/کیبورد برای تعامل با درایور می‌تواند وضعیت navigator.webdriver را تغییر دهد و باعث شود قابل‌شناسایی شود؛ بهتر است تعامل‌ها را برنامه‌محور نگه دارید.
  • تب‌ جدید: باز کردن تب‌های جدید ممکن است رفتار متفاوتی داشته باشد؛ اگر نیاز به چندتب دارید، تب را با صفحهٔ خالی باز و سپس کنترل کنید.
  • پایداری و مقیاس: اجرای headful/ headless کروم در مقیاس منابع زیادی مصرف می‌کند—نظارت بر حافظه، ریستارت دوره‌ای و مدیریت فرایندها ضروری است.
  • هزینهٔ پهنای‌باند: رندر کامل صفحات هزینه‌بر است؛ اگر فقط HTML نیاز دارید، ترکیب راهکارهای HTTP requests + پراکسی‌های هوشمند را بررسی کنید.
  • امنیت: اطلاعات محرمانه (API keys، پراکسی credentials) را در محیط امن نگه دارید و از لاگ شدن تصادفی آن‌ها جلوگیری کنید.

جایگزین‌ها و مقایسهٔ عملی

در بسیاری از موارد استفاده از پراکسی‌های هوشمند یا سرویس‌های تجمیع‌کنندهٔ پراکسی که پشتیبانی از bypassهای اختصاصی دارند، عملی‌تر است؛ مزایا و معایب به طور خلاصه:

  • مزایا: کمتر نیاز به نگهداری پچ‌ها، هزینهٔ کمتر در پهنای‌باند و پایداری بالاتر در مقیاس.
  • معایب: هزینهٔ سرویس، نیاز به اعتماد به شخص ثالث و گاهی محدودیت در انعطاف‌پذیری درخواست‌ها.

در عمل توصیه می‌شود ترکیبی از راهکارها استفاده کنید: وقتی سایت بسیار محافظت‌شده است، ابتدا از سرویس‌های پراکسی هوشمند استفاده کنید و فقط در صورت نیاز از headful undetected chromedriver بهره ببرید.

نکات تکمیلی و چک‌لیست قبل از اجرا در تولید

  • آزمایش کامل در محیط staging با ورودی‌های واقعی.
  • استفاده از rotate کردن پراکسی‌ها و user-agentها.
  • اضافه کردن تأخیرهای تصادفی و رفتاری برای تقلید انسان (نه تقلید کامل از موس/کیبورد که ممکن است قابل‌شناسایی باشد).
  • نظارت و alert برای کرش‌ها و کاهش نرخ موفقیت.
  • ذخیرهٔ لاگ و اسکرین‌شات موقع خطا برای دیباگ.

جمع‌بندی

Undetected Chromedriver ابزار قدرتمندی برای کاهش احتمال شناسایی بوت‌های Selenium است، اما تنها مؤلفهٔ لازم نیست. ترکیب آن با پراکسی‌های مناسب، مدیریت خطا، لاگینگ و معماری مقیاس‌پذیر بهترین نتیجه را می‌دهد. همیشه با احتیاط، رعایت قوانین و سیاست‌های سایت هدف و تست گسترده وارد محیط تولید شوید.

آسان اسکریپ را در گوگل به‌عنوان منبع ترجیحی انتخاب کن

مقاله‌های جدید ما زودتر و پررنگ‌تر در نتایج گوگل و Discover برایت نمایش داده می‌شود. افزودن از تنظیمات گوگل

مطالب مرتبط

مقاله‌های مرتبط