

این راهنما نشان میدهد چگونه از Playwright داخل یک محیط تعاملی Jupyter Notebook برای وب اسکریپینگ استفاده کنید. هدف این مقاله ارائهٔ روشهای کاربردی، مثالهای کدنویسی و نکات عملی برای توسعهدهندگان پایتون/Node.js است تا بتوانند سریع پروتوتایپ بزنند، دادهها را بررسی و اشکالزدایی کنند و اسکریپهای پایدار بسازند.
پس از خواندن این مقاله، شما یاد میگیرید چگونه محیط را نصب کنید، کرنل مناسب را فعال کنید، مرورگر را از سلولهای نوتبوک مدیریت کنید، و نکات مربوط به پایداری، امنیت و اشکالزدایی را اعمال کنید.
برای اجرای Playwright در Jupyter معمولاً از کرنل ijavascript-await (کرنل Node.js با پشتیبانی از await در سطح سلول) استفاده میکنیم. پس از نصب و راهاندازی کرنل، میتوانید بلوک اول را برای راهاندازی مرورگر اجرا کرده و در سلولهای بعدی page و browser را برای ناوبری، اسکرینشات و استخراج دادهها بهکار ببرید.
مراحل کلی نصب و آمادهسازی:
نمونهٔ دستورات نصب (در خط فرمان):
pip install notebook
npm install -g ijavascript-await
ijsnotebook
پس از باز شدن رابط وب Jupyter، یک نوتبوک جدید بسازید و کرنل Node.js را انتخاب کنید. در اولین سلول، مرورگر را راهاندازی کنید تا متغیرهای browser، context و page در دسترس بمانند:
const playwright = require("playwright");
const browser = await playwright.chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
توضیح ورودی/خروجی کد بالا:
یک سلول جدید ایجاد کنید و برای رفتن به یک آدرس و گرفتن عنوان از این کد استفاده کنید:
await page.goto("https://example.com");
console.log(await page.title());
await browser.close();
گامبهگام:
برای دیدن عملکرد صفحه در یک مرورگر واقعی (نه headless)، هنگام راهاندازی مرورگر گزینهٔ headless را غیرفعال کنید:
const browser = await playwright.chromium.launch({ headless: false });
بهکارگیری این حالت در نوتبوک مفید است چون مرورگر باز میماند و میتوانید سلولها را تغییر داده و دوباره اجرا کنید بدون اینکه بارها پنجره باز و بسته شود.
میتوانید تصویر صفحه را ذخیره کنید و سپس آن را در یک سلول Markdown نمایش دهید (یا از خروجی نوتبوک برای نمایش تصویر استفاده کنید):
await page.screenshot({ path: "test.png" });
ورودی: مسیر فایل خروجی؛ خروجی: فایلی روی دیسک با عکس از صفحه. در نوتبوک، با ایجاد یک سلول Markdown ساده میتوانید تصویر را ببینید (نوتبوک خودتان تصویر را رندر میکند).
نوتبوک وباینترفیسی امکانات breakpoint سنتی را ندارد؛ برای اشکالزدایی عمیقتر از JupyterLab یا IDEهایی مثل VSCode استفاده کنید که قابلیت Debug در سلولها را فراهم میکنند.
در نوتبوک بعضی مشکلات رایج مرتبط با حالت بلندمدت (long-running) وجود دارد. راهحلهای پیشنهادی:
Session timeouts: مقدار timeout را برای ناوبریها کاهش/افزایش دهید و قسمتهای بحرانی را با منطق retry پوشش دهید.
Memory usage: مرورگر را مرتباً ببندید، تبهای اضافی را ببندید یا از contextهای جدید استفاده کنید و صفحات غیرضروری را حذف کنید.
Frozen execution: اگر اجرای کد هنگ میکند، کرنل را ریاستارت کنید و علت احتمالی (حلقهٔ بینهایت، promise ناتمام) را بررسی کنید.
Unhandled promises: حتماً از try/catch برای awaitها استفاده کنید یا از Promise.allSettled برای جمعآوری نتایج چند promise بهره ببرید.
نمونهٔ سادهٔ تابع retry که برای قدمهای حساس استفاده میکنیم:
async function retry(fn, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
return await fn();
} catch (e) {
if (i === retries - 1) throw e;
await new Promise(r => setTimeout(r, 1000));
}
}
}
این الگو برای شبکههای ناپایدار یا عملیاتهایی که گاهی شکست میخورند مناسب است. ورودی fn باید یک تابع async باشد و خروجی نتیجهٔ موفق یا در نهایت خطا خواهد بود.
در نوتبوکها مراقب ذخیرهٔ اعتبارنامهها باشید. چند توصیه عملی:
نمونهٔ استفاده از متغیرهای محیطی:
const username = process.env.PLAY_USER;
const password = process.env.PLAY_PASS;
// استفاده از مقادیر در اسکریپت
// پاکسازی
delete process.env.PLAY_PASS;
اجرای Playwright داخل Jupyter Notebook ترکیبی عالی از توسعهٔ تعاملی و تست سریع فراهم میکند: میتوانید سلکتورها را آزمایش کنید، دادهها را مصور کنید و پروتوتایپ بسازید. در عین حال باید به محدودیتهای حافظه، مدیریت وضعیت و امنیت اعتبارنامهها توجه داشته باشید. با رعایت الگوهای retry، بستن مرورگرها و مدیریت متغیرهای حساس، میتوانید تجربهٔ پایدارتری از وب اسکریپینگ در نوتبوک داشته باشید.
حالا میتوانید کدهای نمونه را اجرا کنید، آنها را با نیاز خود تطبیق دهید و از نکات فوق برای نگهداری و اشکالزدایی استفاده کنید.


