مقدمه
این مقاله یک راهنمای آموزنده و عملی برای توسعهدهندههای پایتون سطح متوسط است که میخواهند از Selenium Stealth برای اسکریپینگ وب استفاده کنند. در پایان این راهنما شما با نصب و پیکربندی اولیه، نمونههای کد کاربردی، مدیریت User‑Agent و پراکسی، و نکات مربوط به عملکرد و پایداری آشنا خواهید شد.
خلاصه سریع (TLDR)
یک نمونهٔ مینیمال برای شروع سریع: ایجاد WebDriver، اعمال Stealth و بازدید یک صفحه.
from selenium import webdriver
from selenium_stealth import stealth
chrome_options = webdriver.ChromeOptions()
# مثال: headless یا user-agent را در chrome_options اضافه کنید
driver = webdriver.Chrome(options=chrome_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")
# ... تعامل با صفحه ...
driver.quit()ورودی: شیٔ webdriver.Chrome. خروجی: یک نشست مرورگر که خصوصیات navigator و WebGL را تا حدی تغییر میدهد تا شبیه مرورگر واقعیتر باشد.
درک اصولی Selenium Stealth
چالشهای رایج در اسکریپینگ عبارتاند از: بلاک شدن IP، کپچاها و تشخیص خودکار مرورگرهای اتومات. Selenium Stealth مجموعهای از عملیات برای جعل (spoof) خصوصیات مرورگر مثل navigator.vendor، platform، WebGL و لیست زبانها فراهم میکند تا احتمال تشخیص کاهش یابد.
نکتهٔ کلیدی: این ابزار رفتار مرورگر را بهتنهایی «انسانی» نمیکند؛ بلکه مجموعهای از پرچمها و اصلاحات را اعمال میکند که در کنار دیگر تکنیکها (پراکسی، چرخش UA، تاخیرهای هوشمند) موثر خواهند بود.
شروع سریع: نصب و مثال پایه
نصب ساده با pip:
pip install selenium-stealth selenium webdriver-managerنمونه پایهٔ پایتون (شرح وظایف خطبهخط پس از بلوک):
from selenium import webdriver
from selenium_stealth import stealth
from webdriver_manager.chrome import ChromeDriverManager
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# chrome_options.add_argument('--headless') # در صورت نیاز
driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)
stealth(driver, languages=["en-US","en"], vendor="Google Inc.", platform="Win32", fix_hairline=True)
driver.get('https://example.com')
print(driver.title)
driver.quit()توضیح:
- خطهای اول: وارد کردن ماژولها و نصب خودکار درایور با ChromeDriverManager.
- chrome_options: پارامترهایی مثل sandbox و shared memory برای اجرای پایدار در سرور لازم است.
- پس از ایجاد driver، تابع stealth اجرا میشود تا خصوصیات مرورگر تنظیم گردد.
- در نهایت صفحه بارگذاری و عنوان چاپ میشود؛ سپس راننده بسته خواهد شد.
پیکربندی WebDriver و نکات عملی
حتی وقتی از Selenium Stealth استفاده میکنید، تنظیم گزینههای WebDriver ضروری است. فهرست مهمترین گزینهها و دلیل استفاده:
- Headless Mode: مصرف منابع را کم میکند اما علامت آشکاری برای تشخیص است؛ در صورت استفاده، سایر جلوههای شناسایی باید تقویت شوند.
- User-Agent: بهتر است صریحاً مقداردهی شود یا چرخانده شود تا با Traffic طبیعی مطابقت داشته باشد.
- Window Size: اندازهٔ معمولی (مثلاً 1366x768) انتخاب کنید تا الگوهای غیرمعمول به وجود نیاید.
- Proxy Settings: برای جلوگیری از بلوک شدن IP ضروری است؛ میتواند از طریق گزینهها یا ابزارهایی مانند seleniumwire مدیریت شود.
- Preferences / Capabilities: دانلود خودکار، handling popup و مسیر ذخیرهسازی را تنظیم کنید تا رفتار مرورگر به حالت کاربر نزدیکتر شود.
سفارشیسازی آرگومانهای Stealth
آرگومانهایی که معمولاً به تابع stealth پاس داده میشوند و نقش هر کدام:
- languages: لیست زبانهای navigator.languages؛ برای تطابق با محتوای منطقهای.
- vendor و platform: مقادیر navigator.vendor و navigator.platform را شبیهسازی میکنند.
- webgl_vendor و renderer: اطلاعات WebGL را جعل میکنند تا fingerprint کمتر مشکوک شود.
- fix_hairline: اصلاح یک اثر ظریف که گاهی در حالت headless دیده میشود.
- user_agent و accept_languages: کنترل headerها برای سازگاری بیشتر.
- navigator_plugins و plugins: تنظیم لیست پلاگینها برای جعل فایلپروفایل مرورگر.
- hardware_concurrency: تعداد هستههای گزارششده توسط مرورگر را شبیهسازی میکند.
بهترینعمل: مقادیر را براساس target واقعی (نوع دستگاه و منطقه) تنظیم کنید و از تناقض بین headerها و properties جلوگیری نمایید.
چرخش User‑Agent و نمونهٔ عملی
چرخش User‑Agent یکی از سادهترین و موثرترین تکنیکها برای تنوع درخواستها است. نمونهٔ عملی:
import random
from selenium import webdriver
from selenium_stealth import stealth
user_agents = [
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
]
ua = random.choice(user_agents)
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f'user-agent={ua}')
driver = webdriver.Chrome(options=chrome_options)
stealth(driver, languages=["en-US","en"], vendor="Google Inc.", platform="Win32")
# ادامهٔ اسکریپت
driver.quit()نکات عملی:
- فهرست UA را از منابع معتبر جمعآوری و مرتباً بهروزرسانی کنید.
- UA انتخابشده باید با accept-language و دیگر مشخصات مرورگر سازگار باشد تا اختلافهای واضح ایجاد نکند.
- چرخش را همراه با تاخیرهای تصادفی و الگوی رفتاری انسانی ترکیب کنید.
استفاده از پراکسیها در کنار Selenium Stealth
پراکسیها لایهٔ دیگری از ناشناسی فراهم میکنند و برای اجتناب از بلاک IP ضروریاند. چند نکته و مثال:
from selenium import webdriver
from selenium_stealth import stealth
proxy = "187.95.229.112:8080" # مثال: برای پراکسیهای بیاحراز یا از پروتکل مناسب استفاده کنید
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f"--proxy-server={proxy}")
driver = webdriver.Chrome(options=chrome_options)
stealth(driver, languages=["en-US","en"], vendor="Google Inc.")
# تعامل با سایت
driver.quit()نکات امنیتی و عملی:
- برای پراکسیهای احرازشده، اعتبارنامه را از طریق URL یا ابزارهایی مثل seleniumwire مدیریت کنید؛ رمزها را در متغیر محیطی نگهداری کنید، نه در کد.
- پراکسیهای رایگان معمولاً ناپایدار و کند هستند؛ از سرویسهای قابل اتکاء برای عملیات در مقیاس استفاده کنید.
- چک کنید که پراکسی انتخابی ترافیک HTTPS را پشتیبانی کند و latency آن مناسب باشد.
عملکرد، خطاها و پایداری
مواردی که در عملیات بلندمدت باید مدنظر قرار دهید:
- مانیتورینگ و لاگینگ: خطاها، زمان پاسخ و نرخ بلوک شدن را لاگ کنید تا الگوهای مشکلزا را بیابید.
- Retry و Backoff: هنگام مواجهه با خطاهای موقت یا 429، از الگوریتمهای backoff تدریجی استفاده کنید.
- همزمانی: برای افزایش throughput از صفبندی و worker pool استفاده کنید اما همزمانی زیاد میتواند منجر به تشدید شناسایی شود.
- مصرف منابع: WebDriver حافظه و CPU بالایی مصرف میکند؛ در مقیاس از headless با pool کردن جلسات یا از روشهای بدون مرورگر (API/requests) در جاهایی که ممکن است استفاده کنید.
- تست عملکرد: قبل از تولید، با نمونههای کوچک تست کنید تا میزان تشخیص و مصرف منابع را ارزیابی کنید.
جایگزینها و ترکیب ابزارها
گزینههای دیگری که معمولا در ترکیب یا بهعنوان جایگزین استفاده میشوند:
- Selenium Undetected Chrome Driver: نسخهٔ تغییر یافتهٔ ChromeDriver که تلاش میکند خودِ درایور را کمتر قابل تشخیص کند. در برخی سناریوها سادهتر از ترکیب چند ابزار عمل میکند.
- پراکسیهای مدیریتشده (مثلاً سرویسهای پروکسی): برای دسترسی پایدار و pool پراکسیهای چرخشی مفیدند؛ این سرویسها را میتوان در کنار Selenium Stealth به کار برد.
- سرویسهایی مثل seleniumwire یا selenium-requests برای مواردی که نیاز دارید ترافیک HTTP را دستکاری یا لاگ کنید.
نکات حقوقی و اخلاقی
قبل از اسکریپ کردن هر وبسایتی قوانین استفاده، فایل robots.txt و حقوق مالکیت محتوایی را بررسی کنید. مسئولیت قانونی و اخلاقی استفاده از این تکنیکها به عهدهٔ شماست.
جمعبندی
ترکیب Selenium Stealth با پراکسیهای مناسب، چرخش User‑Agent و پیکربندی معقول WebDriver میتواند احتمال شناسایی را بهطور چشمگیری کاهش دهد. اما هیچ راهحلی کامل و تضمینی برای جلوگیری از تشخیص وجود ندارد؛ بهترین نتیجه با آزمایش، پایش و ترکیب تکنیکها حاصل میشود. همیشه از مدیریت اعتبارنامهها، لاگینگ و رعایت قوانین هدف غافل نشوید.
آسان اسکریپ را در گوگل بهعنوان منبع ترجیحی انتخاب کن
مقالههای جدید ما زودتر و پررنگتر در نتایج گوگل و Discover برایت نمایش داده میشود. افزودن از تنظیمات گوگل





