مقدمه
در این مقاله عملی و فنی یاد میگیرید چطور یک مرورگر کنترلشده با Selenium را طوری آماده کنید که کمتر بهعنوان ربات شناسایی شود. هدف این راهنما برای توسعهدهندههای پایتون سطح متوسط است: اصول تشخیص بات، تکنیکهای پوشش هویت (fingerprint hardening)، استفاده از پراکسی و مثالهای کد گامبهگام تا بتوانید اسکریپینگ قابلاعتماد و پایدار بسازید.
پس از خواندن این مطلب، شما میتوانید: تشخیصهای معمول سایتها را بشناسید، یک WebDriver «استیلث» بسازید، از پراکسیها استفاده کنید، رفتار انسانی را شبیهسازی کنید و نحوهٔ تست و مدیریت CAPTCHA و خطاها را پیادهسازی کنید.
مکانیسمهای معمول تشخیص بات
سایتها معمولاً از ترکیبی از روشها برای تشخیص ترافیک خودکار استفاده میکنند. مهمترین موارد:
- تحلیل آیپی و نرخ درخواست: نرخ بالای درخواست از یک IP یا آیپیهای متعلق به دیتاسنترها مشکوک تلقی میشوند.
- فینگرپرینت مرورگر: مجموعهای از ویژگیها مانند رزولوشن، فونتها، WebGL، canvas و پلاگینها که یک شناسهٔ نسبتاً یکتا میسازند.
- سرچ برای نشانههای headless یا WebDriver: وجود navigator.webdriver یا نقص در خصوصیات جاوااسکریپت قابل تشخیص است.
- الگوهای رفتاری: حرکتهای ماوس، الگوی اسکرول و زمانبندیها که رفتار خطی و منظم را نشان میدهند.
عواقب شناسایی عبارتاند از: CAPTCHA، مسدودسازی آیپی، خدمتدهی محتوای تغییر یافته و گاهی اقدامات حقوقی. پس طراحی ضدتشخیص باید هم فنی و هم اخلاقی (مطابق قوانین و شرایط سایت) انجام شود.
تکنیکهای عملی برای کاهش تشخیص
ترکیب چند لایه از تکنیکها معمولاً نتیجهٔ بهتری میدهد. مهمترین روشها:
- تنظیم User-Agent و هدرها: استفاده از رشتهٔ User-Agent مناسب برای نسخه مرورگر و سیستم عامل هدف و هماهنگسازی با سایر ویژگیها.
- پیکربندی WebGL و Canvas: فعال کردن/شبیهسازی WebGL و تعیین vendor/renderer مناسب تا fingerprint واقعیتر بهنظر برسد.
- اندازه و موقعیت پنجره: تعیین اندازههای معمول مانند 1366x768 یا 1920x1080 بهجای سایزهای غیرمعمول.
- نوبتدهی و شبیهسازی رفتار انسانی: تأخیر تصادفی بین عملها، حرکات ماوس غیرخطی و اسکرولهای طبیعی.
- استفاده از پراکسیهای مسکونی و چرخش آیپی: کاهش احتمال بلاک از طریق پراکسیهای residential و چرخش دورهای آیپی.
- ابزارهای استیلث: مثل selenium-stealth یا undetected-chromedriver برای حذف یا تغییر پرچمهای قابل تشخیص.
نمونه: راهاندازی پایهای با selenium-stealth
این قطعه کد نشان میدهد چگونه یک Chrome WebDriver را با selenium-stealth آماده کنید. ورودی: نیازی به پارامتر اختصاصی جز مسیر درایور یا شناسه پراکسی ندارد. خروجی: یک شی WebDriver آماده برای بازدید صفحات است.
from selenium import webdriver
from selenium_stealth import stealth
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
options.add_argument('user-agent=YOUR_CUSTOM_USER_AGENT')
driver = webdriver.Chrome(options=options)
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True)
driver.get('https://example.com')
توضیح خطبهخط:
- ایمپورتها: webdriver برای کنترل مرورگر و stealth برای اعمال تغییرات JS و fingerprint.
- ChromeOptions: برای ارسال آرگومانها به کروم (مثلاً اندازهٔ پنجره، user-agent).
- ساخت درایور: ایجاد نمونهٔ Chrome با Options مشخص.
- stealth(...): پارامترها مشخص میکنند چه مشخصههایی در navigator/WebGL شبیهسازی شوند.
- دستور get: باز کردن URL و شروع کار اسکریپت.
نکتهٔ امنیتی: مقدار YOUR_CUSTOM_USER_AGENT را با یک user-agent واقعی جایگزین کنید و از user-agentهایی که با مشخصات WebGL و platform همخوانی ندارند پرهیز کنید.
نمونه: استفاده از undetected-chromedriver و پراکسی مسکونی
در مواردی که سایت پیچیدهتر است، استفاده از نسخههای تقویتشدهٔ کرومدرایور مفید است. مثال زیر نشان میدهد چگونه از undetected_chromedriver بههمراه پراکسی استفاده کنید:
import undetected_chromedriver.v2 as uc
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# تنظیم پراکسی مسکونی
proxy = 'your-proxy-address:port' # مثال: 1.2.3.4:8000
options.add_argument(f'--proxy-server={proxy}')
driver = uc.Chrome(options=options)
driver.get('https://example.com')
print(driver.title)
driver.quit()
ورودیها: آدرس پراکسی و تنظیمات گزینه. خروجی: یک جلسهٔ کروم که ترافیک از طریق پراکسی عبور میکند. اگر پراکسی نیاز به احراز هویت دارد، باید مکانیزم احراز (مثلاً پروفایل کروم یا پلاگین) را اضافه کنید.
چگونه رفتار انسانی را شبیهسازی کنیم — مثال عملی
شبیهسازی رفتار شامل تاخیرهای تصادفی، حرکات ماوس و اسکرول طبیعی است. کد زیر یک نمونهٔ ساده است که هم حرکت ماوس و هم اسکرول تدریجی را نشان میدهد:
import time, random
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# فرض: driver از قبل ساخته شده
def random_delay(a=0.5, b=1.5):
time.sleep(random.uniform(a, b))
def human_scroll(driver):
total_height = driver.execute_script('return document.body.scrollHeight')
step = 100
for y in range(0, total_height, step):
driver.execute_script(f'window.scrollTo(0, {y});')
random_delay(0.2, 0.7)
def move_mouse_to_element(driver, element):
action = ActionChains(driver)
action.move_to_element(element).perform()
random_delay(0.3, 1.0)
توضیح: هر تابع ورودی مشخص (مثلاً driver یا element) را میگیرد و کاری شبیه حرکت انسان انجام میدهد. خروجی قابلمشاهده کاهش الگوریتمیک بودن رفتار هنگام تعامل با صفحه است.
پراکسیها، چرخش آیپی و مدیریت جلسات
نکات کلیدی:
- پراکسیهای مسکونی نسبت به دیتاسنترها قابلاعتمادترند اما هزینهبرند.
- چرخش جلسات: برای فولاسکرپینگ باید IP و session را دورهای تغییر دهید تا الگوهای ترافیکی از یک منبع دیده نشود.
- همسانسازی منطقه زمانی و زبان: پراکسی از کشوری دیگر انتخاب شده؟ مطمئن شوید language و timezone هم با آن تطابق داشته باشد.
استفاده از سرویسهای میزبان (Hosted) و معایب/مزایا
خدمات میزبانیشدهٔ Scraping Browser یا پروکسیAggregator مزایا و معایب خود را دارند:
- مزایا — پیکربندی آسان، مدیریت پراکسی و bypassهای از پیش ساخته شده، بهروزرسانی مداوم.
- معایب — هزینه بالا، وابستگی به سرویسدهنده و گاهی فقدان کنترل دقیق روی fingerprint.
برای پروژههای بزرگ یا کوتاهمدت با بودجه مناسب، سرویسهای Hosted میتوانند در وقت و نگهداری صرفهجویی کنند؛ برای پروژههای حساستر، تقویت دستی Selenium کنترل بیشتری فراهم میکند.
تست استیلث: مقایسه قبل و بعد
تست کردن با ابزارهای fingerprint/bot-detector الزامی است. روش معمول:
- اجرای اسکریپت پایه (بدون ضدتشخیص) و گرفتن اسکرینشات / HTML.
- اجرای اسکریپت با تغییرات (user-agent، stealth، پراکسی و رفتار انسانی) و مقایسهٔ نتایج.
- تحلیل گزارشها برای فیلدهای پرچمشده مانند navigator.webdriver، WebGL، plugins و زمانبندی تعاملات.
در مثالهای آزمایشی، یک اسکریپت ساده ممکن است نمرهٔ رفتار انسانی ~0.3 بگیرد در حالی که پس از اعمال تکنیکها نمره میتواند به ~0.85 افزایش یابد که نشاندهندهٔ کاهش احتمال شناسایی است.
مدیریت خطاها و CAPTCHA
CAPTCHA و صفحات خطا رایجاند؛ راهکارها:
- تشخیص صفحهٔ CAPTCHA: دنبال عناصر مشخص (input های مخصوص، تصاویر یا متن تایید) باشید و در مواجهه با آنها جریان را تغییر دهید.
- خدمات حل CAPTCHA: سرویسهایی مانند سرویسهای حل CAPTCHA میتوانند تصویر/چالش را حل کنند و پاسخ را بازگردانند و سپس با send_keys وارد کنید.
- دخالت دستی: برای کارهای کمحجم میتوانید اجرای اسکریپت را معلق کرده و انسان را وارد فرایند کنید.
- کنترل خطا: از try-except برای مدیریت TimeoutException، NoSuchElementException و ثبت لاگ استفاده کنید و در صورت تکرار، پراکسی یا استراتژی را تغییر دهید.
قضیهٔ عملی: اسکریپینگ تیترهای یک سایت (BBC) — قبل و بعد
نمونهٔ ساده (قابل شناسایی): این اسکریپت بدون تنظیمات استیلث اجرا میشود و مستعد تشخیص است.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.bbc.com')
headlines = driver.find_elements(By.CSS_SELECTOR, 'h2')
for h in headlines:
print(h.text)
driver.quit()
مشکلات: default fingerprint، رفتار مکانیکی و عدم استفاده از پراکسی.
نسخهٔ بهبود یافته (استفاده از stealth و رفتار انسانی):
from selenium import webdriver
from selenium_stealth import stealth
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time, random
options = Options()
options.add_argument('--window-size=1920,1080')
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)')
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options)
stealth(driver, languages=['en-US','en'], vendor='Google Inc.', platform='Win32', webgl_vendor='Intel Inc.', renderer='Intel Iris OpenGL Engine')
def human_scroll():
total = driver.execute_script('return document.body.scrollHeight')
for y in range(0, total, 200):
driver.execute_script(f'window.scrollTo(0, {y});')
time.sleep(random.uniform(0.3, 0.9))
driver.get('https://www.bbc.com')
human_scroll()
headlines = driver.find_elements(By.CSS_SELECTOR, 'h2')
for h in headlines:
print(h.text)
driver.quit()
نتایج: ترکیب تغییرات fingerprint، user-agent، اندازهٔ پنجره و اسکرول تصادفی باعث میشود رفتار مرورگر به انسان نزدیکتر و احتمالِ شناسایی کاهش یابد.
بهترین روشها و ملاحظات اخلاقی
- قوانین را بررسی کنید: قبل از اسکریپینگ شرایط استفادهٔ سایت را بررسی کرده و در صورت نیاز از مالک سایت اجازه بگیرید.
- حداقلسازی تأثیر: با نرخهای معقول و زمانبندی مناسب به سرور هدف فشار نیاورید.
- ثبت و مانیتورینگ: لاگ رفتار، خطاها و نرخ موفقیت را نگه دارید تا بتوانید استراتژی را اصلاح کنید.
- ترکیب روشها: فقط یک تکنیک کافی نیست؛ ترکیب fingerprint hardening، پراکسی، رفتار انسانی و سرویسهای میزبانی بهترین نتیجه را میدهد.
جمعبندی
برای ساختن یک اسکریپر قابلاعتماد با Selenium باید چند لایهٔ دفاعی پیاده کنید: هم فنی (user-agent، WebGL، selenium-stealth/undetected driver)، هم شبکهای (پراکسی و چرخش آیپی)، و هم رفتاری (تاخیرها و حرکتهای انسانی). همیشه تست کنید، لاگ بگیرید و ملاحظات قانونی و اخلاقی را رعایت کنید. با این روشها میتوانید احتمال شناسایی را کاهش دهید و عملیات اسکریپینگ پایدارتری داشته باشید.





