

در وب اسکریپینگ مدرن، بسیاری از صفحات دادهها را با جاوااسکریپت و فراخوانیهای AJAX بارگذاری میکنند؛ در نتیجه فقط درخواست HTTP ساده اغلب کافی نیست. برای گرفتن نسخهٔ نهاییِ رندرشدهٔ صفحه و اجرای اسکریپتهای سمت کلاینت باید از headless browser استفاده کنیم. در این مقالهٔ آموزشی که برای توسعهدهندههای پایتون سطح متوسط نوشته شده، انواع رایج headless browserهای Node.js (مثل Puppeteer و Playwright) معرفی میشوند، نمونههای کد عملی ارائه میشود و نکات عملکردی، امنیتی و بهترینروشها برای اجرای پایدار اسکریپها بررسی میشود.
هدف اصلی استفاده از headless browser این است که صفحه را مثل یک مرورگر واقعی بارگذاری کنیم تا:
موارد عملی که نیاز به headless دارند شامل بارگذاری محتوا پس از AJAX، کلیک برای «Load more»، ورود به حساب کاربری برای دسترسی به محتوای محدودشده، و عبور از برخی مکانیزمهای ضدربات است.
در انتخاب ابزار باید بین سازگاری مرورگر، استفادهٔ منابع، میزان نگهداری پروژه و سادگی API توازن برقرار کنید. به صورت خلاصه:
Puppeteer یک کتابخانهٔ Node.js از تیم Chromium است که کنترل کامل Chrome/Chromium را فراهم میکند. برای اسکریپ کردن صفحاتی که شدیداً به جاوااسکریپت وابستهاند اغلب اولین انتخاب است.
نصب (دستورات نصب باید در ترمینال اجرا شوند):
npm install puppeteerنمونهٔ عملی: باز کردن صفحه، انتظار تا بارگذاری کامل و استخراجِ متنِ همهٔ نقلقولها.
const puppeteer = require('puppeteer');
(async () => {
// ورودی: URL صفحه
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
// تنظیم هدرها و user-agent برای بهبود شبیهسازی کاربر
await page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/90.0.0.0 Safari/537.36');
// رفتن به صفحه و منتظر ماندن تا شبکه تقریباً پایدار شود
await page.goto('https://quotes.toscrape.com/', { waitUntil: 'networkidle2', timeout: 30000 });
// خروجی: آرایهای از متن نقلقولها
const quotes = await page.evaluate(() => {
return Array.from(document.querySelectorAll('.quote > .text')).map(el => el.innerText.trim());
});
console.log(quotes);
await browser.close();
})();توضیح خطبهخط (خلاصه):
نکات عملی و best practices برای Puppeteer:
Playwright یک API یکپارچه فراهم میکند تا با Chromium، Firefox و WebKit کار کنید. اگر نیاز به اطمینان از کارکرد اسکریپ روی چند مرورگر دارید، Playwright انتخاب مناسبی است.
نصب (فرآیند نصب تعاملی ممکن است):
npm init playwright@latest
# یا: npm install playwright
# سپس برای نصب مرورگرها: npx playwright installنمونهٔ ساده: گرفتن عنوان صفحه با Playwright:
const { chromium } = require('playwright');
(async () => {
// ورودی: URL
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://quotes.toscrape.com/');
// خروجی: عنوان صفحه
const title = await page.title();
console.log('Title:', title);
await browser.close();
})();چرا Playwright؟
نکات عملی: در پروژههای بزرگ نصب و مدیریت مرورگرها و نگهداری نسخهها مهم است؛ Playwright این مسئله را با ابزارهای جانبی تا حدی حل میکند اما حجم نصبها بالاتر خواهد بود.
ZombieJS یک محیط شبیهسازی DOM داخل Node است که بدون اجرای مرورگر واقعی صفحات را پردازش میکند. مناسب تستهای سریع و scenarioهای ساده است اما برای سایتهای پیچیدهٔ مدرن که به APIهای پیشرفتهٔ مرورگر نیاز دارند مناسب نیست.
نصب:
npm install zombieنمونهٔ استفادهٔ ساده:
const Browser = require('zombie');
Browser.visit('https://quotes.toscrape.com/', {}, function(error, browser) {
if (error) { console.error(error); return; }
const quotesEl = browser.document.querySelectorAll('.quote > .text');
const quotes = [];
quotesEl.forEach(el => quotes.push(el.textContent.trim()));
console.log(quotes);
});ملاحظات:
CasperJS روی PhantomJS یا SlimerJS سوار میشد و برای اسکریپت کردن سناریوهای ناوبری و گرفتن اسکرینشات مناسب بود. امروزه PhantomJS عملاً منسوخ شده و CasperJS دیگر گزینهٔ بهروز و توصیهشدهای برای پروژههای جدید نیست، مگر برای نگهداریِ کد قدیمی.
نمونهٔ نوشتن سادهٔ سناریو:
// مثال شبهکد (CasperJS)
casper.start('https://quotes.toscrape.com/');
casper.then(function() {
// عملیات بعد از لود صفحه
});
casper.thenClick('#submit', function() {
// بعد از کلیک
});
casper.then(function() {
this.capture('screen.png');
});
casper.run();هشدار: اگر با نیازهای مدرن مثل WebKit جدید یا ویژگیهای ES6 سر و کار دارید، بهتر است از Playwright یا Puppeteer استفاده کنید.
Nightmare.js برای گردشهای سادهٔ اتوماسیون مناسب است و از Electron استفاده میکند. API زنجیرهای آن برای خوانایی خوب است اما وابستگی به Electron باعث افزایش حجم و گاهی پیچیدگی محیط نصب میشود.
نصب و نمونه:
npm i nightmareconst Nightmare = require('nightmare');
const nightmare = Nightmare({ show: false });
nightmare
.goto('https://quotes.toscrape.com/')
.evaluate(() => Array.from(document.querySelectorAll('.quote > .text')).map(e => e.innerText))
.end()
.then(console.log)
.catch(error => console.error('Scraping failed:', error));نکات: مناسب اسکریپهای قابلفهم و سریع برای گردشهای ساده است؛ برای پروژههای بزرگ با نیاز به همزمانی و مقیاسپذیری، ممکن است گزینهٔ ضعیفتری باشد.
برای ساختن اسکریپرهای قابلاعتماد، به چند بخش توجه کنید:
یک pipeline ساده و مؤثر برای اسکریپ کردن چند صفحه:
خلاصهٔ عملی: اگر هدف شما اسکریپ کردن صفحات پیچیدهٔ مبتنی بر JavaScript و داشتن کنترل دقیق روی مرورگر است، Puppeteer گزینهٔ اول است؛ اگر بخواهید روی چند موتور مرورگر تست و اجرا کنید، Playwright ارزش سرمایهگذاری دارد. ابزارهای سبکتر مثل ZombieJS یا قدیمیتر مثل CasperJS و Nightmare.js در سناریوهای خاص کاربرد دارند اما برای پروژههای جدید با نیاز به پایداری و پشتیبانی بلندمدت بهتر است به Puppeteer یا Playwright فکر کنید.
در نهایت روی سازوکارهای مقیاسپذیری (pooling/queue)، مدیریت پروکسی، retry منطقی و لاگینگ تمرکز کنید تا اسکریپهای شما هم سریع و هم قابلاطمینان باشند.

