مقدمه
وقتی در محیط تولید وب اسکریپینگ انجام میدهیم، معمولاً با سدهایی روبهرو میشویم که شرکتهای ضدربات مانند DataDome، Cloudflare و PerimeterX ایجاد کردهاند. هدف این مقاله این است که بهصورت عملی و تکنیکی نشان دهد چگونه با Playwright و ترکیب روشهایی مثل پروکسیهای رزیدنشال، تقویت مرورگر و تکنیکهای stealth شانس خود را برای عبور از DataDome افزایش دهیم. در پایانِ مطلب شما با سه رویکرد اصلی آشنا میشوید و برای هر کدام مثال کد و نکات تولیدپذیری و امنیتی خواهید داشت.
درکِ کلی از روشهای تشخیص DataDome
DataDome و همردههایش از ترکیبی از بررسیهای سمت سرور و سمت کلاینت برای تشخیص ترافیک غیرانسانی استفاده میکنند. مهم است بدانیم چه چیزهایی را چک میکنند تا استراتژی مناسب انتخاب شود.
- سرور-ساید (Server-side):
- تحلیل رفتار: سرعت کلیک/درخواستها، الگوی پیمایش، نرخ درخواستها و توالی حرکتی کاربر.
- کنترل IP: تشخیص IPهای دیتاسنتر، بلکلیستها و آنالیز جغرافیایی.
- آنالیز هدرها: بررسی user agent، ترتیب هدرها و ناسازگاریها بین هدرها و بقیه اطلاعات جلسه.
- DNS و reputation: ارزیابی اینکه IP یا دامنه منبع معتبر است یا خیر.
- کلاینت-ساید (Client-side):
- فینگرپرینتینگ: مقداردهی navigator، لیست پلاگینها، WebGL، اندازهنمایش، فونتها و سایر مواردی که مرورگر واقعی را توصیف میکنند.
- تراکنشهای جاوااسکریپت: اجرای اسکریپتها و تستهای زمانبندی برای بررسی رفتار جاوااسکریپت واقعی.
- CAPTCHA و session tracking: درخواست حل CAPTCHA یا قرار دادن کوکی/توکنهای جلسه برای ردگیری ادامه ارتباط.
طبقهبندی رویکردها برای عبور از DataDome
- استفاده از پروکسیهای رزیدنشال/موبایل برای پوشاندن نشانههای دیتاسنتر.
- تقویت و harden کردن مرورگر (تنظیم هدرها، viewport، تاخیرها).
- تکنیکهای stealth که سعی میکنند نشانههای اتوماسیون را اصلاح یا حذف کنند.
روش عملی 1 — تقویت (Fortify) Playwright با مثال پایتون
ایدهٔ کلی: با تنظیم هدرها، چرخش user agent و شبیهسازی رفتار انسانی پایه، احتمال تشخیص کاهش مییابد. این روش ساده است اما بهتنهایی تضمینی برای عبور از DataDome نیست.
from playwright.async_api import async_playwright
import random
import asyncio
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/93.0.4577.82 Safari/537.36',
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 Version/14.0.3 Mobile/15E148 Safari/604.1',
'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)'
]
async def main():
ua = random.choice(USER_AGENTS)
async with async_playwright() as pw:
browser = await pw.chromium.launch(headless=True)
context = await browser.new_context(user_agent=ua, viewport={"width":1080, "height":1920})
page = await context.new_page()
# زمانهای انتظارِ طبیعی برای شبیهسازی کاربر
await page.goto('https://example.com', timeout=30000)
await page.wait_for_timeout(4000)
await page.screenshot(path='fortified.png')
await browser.close()
asyncio.run(main())
توضیح کد:
- ورودیها: لیست USER_AGENTS که هر بار یکی انتخاب میشود.
- خروجیها: فایل تصویر fortified.png و یک نشست مرورگر بستهشده.
- نقش توابع: new_context برای جداسازی وضعیت مرورگر و تنظیم user agent و viewport، goto برای ناوبری و wait_for_timeout برای ایجاد تاخیر انسانی.
نکات خطبهخط: اجرای launch(headless=True) مرورگر را بدون UI باز میکند؛ new_context محیط جداگانهای فراهم میکند تا کوکیها و sessionها نریزد؛ استفاده از viewport موبایل میتواند در بعضی سایتها رفتار قابل قبولی شبیه موبایل ایجاد کند.
محدودیتها و بهترینروشها: این روش ممکن است برای آنتیباتهای پیشرفته ناکافی باشد؛ همیشه user agent را با بقیه نشانهها همراستا کنید (فونتها، timezone، زبان) و رفتارهای طبیعی مثل اسکرول و کلیک تصادفی را اضافه کنید.
روش عملی 2 — تکنیکهای Stealth (پایتون و اشاره به Node)
ایدهٔ کلی: تغییر یا پاکسازی نشانههای خاص اتوماسیون در سطح JavaScript (مانند navigator.webdriver، پلاگینها، و WebGL). در اکوسیستم Node ابزارهای آمادهای مثل puppeteer-extra-plugin-stealth وجود دارند؛ در پایتون باید همین اصلاحات را دستی انجام دهیم یا از بستههای شخص ثالث بهره ببریم.
مثال پایتون که هنگام باز شدن صفحه اسکریپتهایی را تزریق میکند:
from playwright.async_api import async_playwright
import asyncio
STEALTH_JS = """
Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
window.navigator.permissions.query = (orig =>
(params) =>
params.name === 'notifications' ? Promise.resolve({ state: Notification.permission }) : orig(params)
)(window.navigator.permissions.query);
// اضافه کردن پلاگین و زبانهای معمول
Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
"""
async def main():
async with async_playwright() as pw:
browser = await pw.chromium.launch(headless=True)
context = await browser.new_context()
# این اسکریپت قبل از اجرای هر صفحه تزریق میشود
await context.add_init_script(STEALTH_JS)
page = await context.new_page()
await page.goto('https://example.com', timeout=30000)
await page.wait_for_timeout(4000)
await page.screenshot(path='stealth.png')
await browser.close()
asyncio.run(main())
توضیح و نکات:
- add_init_script اسکریپت را قبل از اجرای اسکریپتهای صفحه inject میکند و برای پاکسازی یا مقداردهی مجدد ویژگیها مناسب است.
- این تکنیکها تنها تلاش میکنند چند علامت رایج اتوماسیون را پنهان کنند؛ آنتیباتها مجموعهای از سیگنالها را بررسی میکنند و همیشه یک بازنگری جدید ممکن است تشخیص را تغییر دهد.
- در Node میتوانید از puppeteer-extra-plugin-stealth استفاده کنید؛ معادل کامل و همیشه پایدار برای پایتون کمتر رایج است، پس نگهداری و تست مداوم لازم است.
// نمونهٔ Node.js با puppeteer-extra-plugin-stealth (برای مقایسه)
const { chromium } = require('playwright-extra')
const stealth = require('puppeteer-extra-plugin-stealth')()
chromium.use(stealth)
;(async () => {
const browser = await chromium.launch({ headless: true })
const page = await browser.newPage()
await page.goto('https://example.com')
await page.waitForTimeout(4000)
await page.screenshot({ path: 'node-stealth.png' })
await browser.close()
})()
روش عملی 3 — استفاده از پروکسیهای رزیدنشال/موبایل و Proxy Aggregator
ایدهٔ کلی: حتی اگر مرورگر را کاملاً انسانی جلوه دهید، آدرس IP دیتاسنتر میتواند شما را لو دهد. پروکسیهای رزیدنشال یا موبایل ترافیک را از IPهایی نمایش میدهند که ظاهراً کاربران واقعی از آنها استفاده میکنند؛ یک Proxy Aggregator میتواند این پروکسیها را بچرخاند و مدیریت کند.
from playwright.async_api import async_playwright
import asyncio
PROXY = {
'server': 'http://residential-proxy.example:8181',
'username': 'proxy_user',
'password': 'YOUR_PROXY_API_KEY'
}
async def main():
async with async_playwright() as pw:
browser = await pw.chromium.launch(headless=True, proxy=PROXY)
page = await browser.new_page()
# زمانهای بیشتر برای منتظر ماندن به خاطر مسیر اضافی شبکه
page.set_default_timeout(20000)
await page.goto('https://example.com')
await page.wait_for_timeout(4000)
await page.screenshot(path='proxied.png')
await browser.close()
asyncio.run(main())
توضیح و نکات:
- پارامتر proxy هنگام launch باعث میشود تمام ترافیک از آن سرور پروکسی عبور کند.
- باید زمانتایماوتها را افزایش دهید چون پروکسی یک «میانجی» اضافی است و ممکن است Latency بالا رود.
- پروکسی خوب (رزیدنشال/موبایل) معمولاً بیشترین تاثیر را روی جلوگیری از مسدودسازیهای مبتنی بر IP دارد.
مطالعهٔ موردی: leboncoin.fr
خلاصه تستها روی یک سایت محافظتشده با DataDome نشان داد:
- تقویت ساده (تنظیم UA، viewport) معمولاً در بلندمدت شکست میخورد — Fail.
- استفاده از پلاگین stealth در Node گاهی موفق بود اما قابل اتکا نیست چون ضدرباتها بهسرعت سازگاری پیدا میکنند — Success (موقت).
- پروکسی رزیدنشال با چرخش IP اغلب بهترین نتیجه را داد و دسترسی صفحهٔ اصلی را ممکن ساخت — Success.
نتیجهٔ عملی: ترکیب پروکسی معتبر با تکنیکهای stealth و شبیهسازی رفتار انسان معمولاً بیشترین احتمال موفقیت را دارد.
نکات عملی، امنیت و بهترینروشها
- رعایت قوانین و اخلاق: همیشه قبل از اسکریپ کردن، قوانین سایت (مثل Terms of Service و robots.txt) را بررسی کنید و از جمعآوری دادههای حساس خودداری کنید.
- مدیریت خطا و Retry: برای صفآرایی درخواستها و استراتژیهای retry منطقی (با backoff) برنامهریزی کنید.
- ذخیره و بازیابی session: استفاده از contextهای مجزا، persist کردن کوکیها و ذخیره fingerprint میتواند به پایداری کمک کند.
- نظارت و لاگینگ: رفتار ربات را مونیتور کنید ( نرخ خطا، زمان پاسخ، match شدن CAPTCHA ) تا سریعاً استراتژی را تنظیم کنید.
- امنیت API Keys: کلیدهای پروکسی را در متغیر محیطی نگهداری کنید، در لاگها چاپ نکنید و بهصورت محدود استفاده کنید.
- آزمون و نگهداری: آنتیباتها پیوسته بهروز میشوند؛ هر راهحل نیاز به آزمون و تصحیح مداوم دارد.
جمعبندی
هیچ راهحل واحدی وجود ندارد که همیشه از پس DataDome بربیاید؛ اما ترکیب پروکسیهای رزیدنشال یا موبایل با hardening مرورگر و injectionهای هوشمندانهٔ سمت کلاینت (stealth) شانس موفقیت را بهطور چشمگیری افزایش میدهد. ابتدا با یک پروکسی معتبر شروع کنید، سپس لایههای stealth و رفتار انسانی را به مرور اضافه کنید و همواره مراقب مباحث قانونی و امنیتی باشید.





