

وقتی در محیط تولید وب اسکریپینگ انجام میدهیم، معمولاً با سدهایی روبهرو میشویم که شرکتهای ضدربات مانند DataDome، Cloudflare و PerimeterX ایجاد کردهاند. هدف این مقاله این است که بهصورت عملی و تکنیکی نشان دهد چگونه با Playwright و ترکیب روشهایی مثل پروکسیهای رزیدنشال، تقویت مرورگر و تکنیکهای stealth شانس خود را برای عبور از DataDome افزایش دهیم. در پایانِ مطلب شما با سه رویکرد اصلی آشنا میشوید و برای هر کدام مثال کد و نکات تولیدپذیری و امنیتی خواهید داشت.
DataDome و همردههایش از ترکیبی از بررسیهای سمت سرور و سمت کلاینت برای تشخیص ترافیک غیرانسانی استفاده میکنند. مهم است بدانیم چه چیزهایی را چک میکنند تا استراتژی مناسب انتخاب شود.
ایدهٔ کلی: با تنظیم هدرها، چرخش 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())
توضیح کد:
نکات خطبهخط: اجرای launch(headless=True) مرورگر را بدون UI باز میکند؛ new_context محیط جداگانهای فراهم میکند تا کوکیها و sessionها نریزد؛ استفاده از viewport موبایل میتواند در بعضی سایتها رفتار قابل قبولی شبیه موبایل ایجاد کند.
محدودیتها و بهترینروشها: این روش ممکن است برای آنتیباتهای پیشرفته ناکافی باشد؛ همیشه user agent را با بقیه نشانهها همراستا کنید (فونتها، timezone، زبان) و رفتارهای طبیعی مثل اسکرول و کلیک تصادفی را اضافه کنید.
ایدهٔ کلی: تغییر یا پاکسازی نشانههای خاص اتوماسیون در سطح 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())
توضیح و نکات:
// نمونهٔ 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()
})()
ایدهٔ کلی: حتی اگر مرورگر را کاملاً انسانی جلوه دهید، آدرس 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())
توضیح و نکات:
خلاصه تستها روی یک سایت محافظتشده با DataDome نشان داد:
نتیجهٔ عملی: ترکیب پروکسی معتبر با تکنیکهای stealth و شبیهسازی رفتار انسان معمولاً بیشترین احتمال موفقیت را دارد.
هیچ راهحل واحدی وجود ندارد که همیشه از پس DataDome بربیاید؛ اما ترکیب پروکسیهای رزیدنشال یا موبایل با hardening مرورگر و injectionهای هوشمندانهٔ سمت کلاینت (stealth) شانس موفقیت را بهطور چشمگیری افزایش میدهد. ابتدا با یک پروکسی معتبر شروع کنید، سپس لایههای stealth و رفتار انسانی را به مرور اضافه کنید و همواره مراقب مباحث قانونی و امنیتی باشید.


