مقدمه
اگر هدف شما انجام وب اسکریپینگ پایدار و قابل اتکا است، Playwright Extra ابزاری ارزشمند است که مجموعهای از پلاگینها را برای فرار از شناسایی، بهبود حریم خصوصی و تولید رفتارهای انسانیتر فراهم میکند. در این راهنما به زبان ساده و فنی به شما نشان میدهم چگونه آن را نصب کنید، پلاگینهای کلیدی را به کار بگیرید، و نکات عملی برای مقاومسازی اسکریپها را پیادهسازی کنید. پس از خواندن این مقاله، شما قادر خواهید بود یک اسکریپ پایه بسازید، پلاگینهای stealth و anonymize-ua را اضافه کنید، با کپچاها روبهرو شوید و الگوهای پیشرفته مثل چند نمونه Playwright با تنظیمات متفاوت را پیادهسازی کنید.
Playwright Extra چیست؟
Playwright Extra یک لایهٔ افزونهای (wrapper) برای Playwright است که به شما امکان میدهد پلاگینهایی را وارد کنید تا قابلیتهای پایهٔ Playwright مثل navigation، تعامل با صفحه و گرفتن screenshot را با تکنیکهای فرار از شناسایی، تغییر user-agent و حل کپچا ترکیب کنید. این پروژه از ایدهٔ Puppeteer Extra الهام گرفته و بسیاری از پلاگینهای ساختهشده برای Puppeteer قابل استفاده یا تطبیق در این فریمورک هستند.
مزایا و معایب
- مزایا:
- امکان اضافهکردن evasionها و رفتارهای انسانی بدون بازنویسی کامل کد.
- ماژولار بودن: انتخاب پلاگین بر اساس نیاز (کپچا، UA، stealth و ...).
- پشتیبانی جامعه و امکان استفاده از پلاگینهای Puppeteer در بسیاری از موارد.
- معایب:
- پیچیدگی و اورهد: اضافهکردن پلاگینهای متعدد میتواند کد را پیچیده کند.
- ریسک ناسازگاری پلاگینها یا نگهداری نامنظم پلاگینهای جامعه.
- منحنی یادگیری برای کاربرانی که با Playwright یا اکوسیستم Node آشنایی کمی دارند.
نصب و راهاندازی
برای استفاده از Playwright Extra در پروژهٔ Node.js مراحل عمومی بهصورت زیر است. توجه: اگر شما توسعهدهندهٔ پایتون هستید و ترجیح میدهید با Playwright Python کار کنید، بسیاری از مفاهیم (مثل چرخش UA، پراکسی و مدیریت session) قابلانتقالاند اما پلاگینهای ذکرشده معمولاً مخصوص اکوسیستم Node هستند.
- نصب پایهای با npm:
npm install playwright playwright-extra
این دستور Playwright و wrapper پایه را نصب میکند. برای استفاده از chromium بهصورت جداگانه:
npm install playwright-chromium
نکتهٔ امنیتی: بستهها را در محیطهای ایزوله مثل npm audit چک کنید و در پروژههای تولیدی از مدیریت نسخهٔ مشخص (lockfile) استفاده کنید.
مثال ساده: Playwright پایه (بدون Extra)
در این مثال یک مرورگر باز میکنیم، به صفحه میرویم و اسکرینشات میگیریم. این مثال به شما ورودیها و خروجیهای اصلی را نشان میدهد.
// ورودی: هیچ آرگومان خارجی؛ خروجی: فایل screenshot.png
const playwright = require('playwright');
(async () => {
// launch یک مرورگر؛ گزینه headless تعیین میکند که UI نمایش داده شود یا خیر
const browser = await playwright.chromium.launch({ headless: false });
const page = await browser.newPage();
// goto صفحهٔ هدف را بارگذاری میکند
await page.goto('https://quotes.toscrape.com/');
// screenshot تصویر صفحه را ذخیره میکند
await page.screenshot({ path: 'screenshot.png' });
// بستن مرورگر
await browser.close();
})();
آنچه در این کد اتفاق میافتد (بخشبهبخش):
- require('playwright'): بارگذاری کتابخانه Playwright.
- launch: کرومیم را اجرا میکند؛ در حالت توسعه headless=false مفید است.
- page.goto: درخواست GET برای URL مورد نظر و رندر صفحه در context را انجام میدهد.
- page.screenshot: خروجی تصویری برای بازرسی محتوای صفحه تولید میکند.
اضافه کردن Playwright Extra و Stealth
حالا همان سناریو را با Playwright Extra و پلاگین Stealth اجرا میکنیم تا رفتار مرورگر مصنوعی شبیهتر به انسان شود و ریسک بلاکشدن کمتر شود.
npm install puppeteer-extra-plugin-stealth
// ورودی: نصب شده بودن پلاگین؛ خروجی: همان screenshot با evasions
const playwright = require('playwright-extra');
const stealthPlugin = require('puppeteer-extra-plugin-stealth');
// ثبت پلاگین روی chromium که توسط playwright-extra فراهم میشود
playwright.chromium.use(stealthPlugin());
(async () => {
const browser = await playwright.chromium.launch({ headless: false, args: ['--no-sandbox'] });
const page = await browser.newPage();
await page.goto('https://quotes.toscrape.com/');
await page.screenshot({ path: 'screenshot-stealth.png' });
await browser.close();
})();
توضیح عملکرد و نقش هر بخش:
- playwright.chromium.use(stealthPlugin()): ماژولهای evasion را به lifecycle مرورگر اضافه میکند (مانند مخفی کردن ویژگیهای قابل تشخیص WebDriver، اصلاح navigator و غیره).
- این روش به تنهایی تضمین جلوگیری از بلاک نیست؛ ترکیب با پراکسی، چرخش UA و تاخیرهای انسانی ضروری است.
پلاگینهای کلیدی
در ادامه سه پلاگینی که اغلب در اسکریپینگ کاربردیاند را بررسی میکنیم: stealth، anonymize-ua و recaptcha.
puppeteer-extra-plugin-stealth
هدف این پلاگین کاهش شاخصهای قابل تشخیص بودن مرورگر خودکار است. وقتی سایتها fingerprinting یا بررسیهای ساده انجام میدهند، این پلاگین میتواند بسیاری از شاخصها را اصلاح کند.
محدودیت: سایتهای پیشرفتهتر ممکن است هنوز با روشهای رفتارشناسی (behavioral analysis) یا بررسی شبکه شما را شناسایی کنند؛ بنابراین این پلاگین بخشی از استراتژی است نه کل راهکار.
puppeteer-extra-plugin-anonymize-ua
این پلاگین headerهای user-agent را اصلاح میکند تا UA مطابق دستگاه و مرورگر معقول تنظیم شود. مثال UA نمونه در متن اصلی:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/... Safari/..."
npm install puppeteer-extra-plugin-anonymize-ua
const { chromium } = require('playwright-extra');
const anonymizeUaPlugin = require('puppeteer-extra-plugin-anonymize-ua');
chromium.use(anonymizeUaPlugin());
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://quotes.toscrape.com/');
await page.screenshot({ path: 'screenshot-anonua.png' });
await browser.close();
})();
نکات عملی:
- همیشه UA را با سایر اجزای fingerprint همخوان کنید (screen size، timezone، زبان).
- در محیطهای تولیدی از فهرست UAهای واقعی و معقول استفاده کنید و آنها را دورهای بچرخانید.
puppeteer-extra-plugin-recaptcha
کپچاها (reCAPTCHA، hCaptcha و ...) یکی از موانع اصلی اسکریپینگ هستند. این پلاگین به شما اجازه میدهد از سرویسهای حل کپچا (مثلاً 2Captcha) استفاده کنید تا چالشها را حل کنید.
npm install puppeteer-extra-plugin-recaptcha
const { chromium } = require('playwright-extra');
const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha');
chromium.use(RecaptchaPlugin({
provider: { id: '2captcha', token: 'YOUR_2CAPTCHA_API_KEY' }, // توکن را در env نگهدارید
visualFeedback: true
}));
// تابع ورود که کپچاها را حل میکند
const logIn = async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://example-login-page/');
// پر کردن فرم ورودی: ورودیها email و password
await page.waitForSelector('#email');
await page.type('#email', 'you@example.com', { delay: 100 });
await page.waitForSelector('#password');
await page.type('#password', 'your-password');
// حل خودکار reCAPTCHA در صورت وجود
await page.solveRecaptchas();
// ارسال فرم
await Promise.all([
page.waitForNavigation(),
page.click('[type="submit"]')
]);
await browser.close();
};
logIn();
هشدار امنیتی: کلیدهای API را در متغیرهای محیطی یا vault نگهداری کنید؛ هرگز آنها را در کد منبع سِری نکنید.
استراتژیهای عملی برای اسکریپ کردن پایدار
ترکیب چند تکنیک عملی به شما کمک میکند اسکریپ مقاومتری بنویسید:
- پراکسیها: استفاده از پروکسیهای چرخشی یا پراکسی استخر برای تفکیک IP و کاهش نرخ بلاک. در صورت امکان از پراکسیهای با کیفیت (residential یا datacenter مناسب هدف) استفاده کنید.
- چرخش UA و تنظیمات محیطی: UA، timezone، زبان مرورگر و اندازهٔ صفحه را هماهنگ کنید تا fingerprint طبیعیتر شود.
- تاخیر و رفتار انسانی: از تاخیرهای متغیر بین کلیکها و تایپها استفاده کنید و عملیات را با page.waitForSelector و بررسی المانها هماهنگ کنید.
- Retry و مدیریت خطا: شبکه و رندر صفحات ممکن است نامطمئن باشند؛ از استراتژی retry با backoff و ثبت لاگ برای خطاها استفاده کنید.
- Session و کوکیها: reuse کردن contextها یا ذخیره/بارگذاری کوکیها کمک میکند تا نیاز به لاگین مکرر کاهش یابد و رفتار طبیعیتری نمایش داده شود.
- محدودسازی همزمانی: افزایش بیش از حد concurrency ممکن است باعث اعلان آنالیتیکس سایت شود؛ نرخ را کنترل کنید و از صفبندی (جُب Scheduling) استفاده کنید.
ادغامهای پیشرفته
دو مسیر پیشرفته که در منابع آمده است: استفاده از TypeScript و ساختن چندین instance از Playwright با پلاگینهای متفاوت.
TypeScript با Playwright Extra
TypeScript بهخاطر تایپها و قابلیت تکمیل کد، توسعهٔ اسکریپهای پیچیده را سادهتر و قابل نگهداریتر میکند. مراحل اولیه:
npm install typescript
npx tsc --init
// نمونهٔ import در TypeScript
import { chromium } from 'playwright-extra';
import stealthPlugin from 'playwright-extra-plugin-stealth';
chromium.use(stealthPlugin());
(async () => {
const browser = await chromium.launch();
// ...
})();
نکات: پیکربندی tsconfig را برای target و module مناسب تنظیم کنید و از ابزارهای lint و pre-commit برای یکپارچگی کد بهره ببرید.
چند نمونه Playwright با پلاگینهای مختلف
برای اسکریپینگ گسترده، ممکن است بخواهید چند محیط مجزا داشته باشید: یکی برای صفحات حساس که Stealth فعال است و دیگری برای صفحات با کپچا که Recaptcha فعال دارد. با addExtra() میتوانید instanceهای مجزا ایجاد کنید:
const { addExtra } = require('playwright-extra');
const { chromium: vanillaChromium } = require('playwright');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha');
(async () => {
// یک chromium که Stealth دارد
const stealthChromium = addExtra(vanillaChromium);
stealthChromium.use(StealthPlugin());
// یک chromium که Recaptcha دارد
const recaptchaChromium = addExtra(vanillaChromium);
recaptchaChromium.use(RecaptchaPlugin({ /* config */ }));
// اکنون هر کدام را جداگانه launch کنید و برای مقاصد مختلف استفاده کنید
})();
مزیت این الگو تفکیک concerns و تست جداگانه برای هر نوع هدف است.
عملکرد و مانیتورینگ
برای اسکریپهای تولیدی به این موارد توجه کنید:
- لاگگیری ساختیافته و metricها (زمان بارگذاری صفحه، نرخ خطا، تعداد retries).
- مانیتورینگ سلامت پراکسیها و نرخ خطا برای تغییر خودکار استراتژیها.
- تست دورهای پلاگینها پس از آپدیت کتابخانهها برای بررسی ناسازگاریها.
جمعبندی
Playwright Extra یک ابزار قدرتمند برای بهبود موفقیت عملیات وب اسکریپینگ است، مخصوصاً وقتی با پلاگینهایی مانند stealth، anonymize-ua و recaptcha ترکیب شود. با این حال، هیچ کدام از این پلاگینها جایگزین یک استراتژی کامل (پراکسی مناسب، مدیریت session، مدیریت خطا و مانیتورینگ) نیستند. پیشنهاد عملی: با یک اسکریپ ساده شروع کنید، سپس تدریجاً پلاگینها و پراکسیها را اضافه کنید، همهٔ کلیدهای API را به صورت امن ذخیره کنید و تستهای پایداری و نرخ موفقیت را همیشه در چرخهٔ توسعه داشته باشید.





