

این مقاله بهصورت عملی توضیح میدهد چطور در یک اسکریپر NodeJS مبتنی بر Playwright از پراکسیها استفاده کنید. بعد از مطالعهِ مقاله خواهید دانست چه انواع پراکسیای وجود دارد، چگونه پراکسی ساده یا دارای احراز هویت را به chromium.launch اضافه کنید، چرا برخی «APIهای پراکسی» با مرورگرهای هدلس مشکل دارند و چه نکات عملی برای پایداری، امنیت و عملکرد باید رعایت شود.
پیش از شروع کدنویسی بهتر است انواع پراکسی را بشناسید:
برای اسکریپهای مبتنی بر مرورگر، بهترین گزینه زمانی که فراهم است، استفاده از «پورت پراکسی» است زیرا مرورگرها هنگام مواجهه با آدرسهای نسبی در صفحه ممکن است endpointهای API را بهاشتباه به عنوان مبنا در نظر بگیرند و برخی منابع صفحه لود نشوند.
فرض کنید یک پراکسی ساده مانند 11.456.448.110:8080 دارید. برای اضافه کردن آن به Playwright کافی است در launchOptions شیء proxy را ست کنید:
const { chromium } = require('playwright');
const PROXY_SERVER = 'http://11.456.448.110:8080';
const launchOptions = {
proxy: { server: PROXY_SERVER }
};
(async () => {
const browser = await chromium.launch(launchOptions);
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
const pageContent = await page.textContent('body');
console.log(pageContent);
await browser.close();
})();
توضیح ورودی/خروجی و نقش توابع:
نکته: برای فایرفاکس کافی است chromium را با firefox جایگزین کنید و از firefox.launch استفاده کنید.
سرویسهای تجاری اغلب یک نقطهٔ ورود واحد میدهند و احراز هویت را از طریق نام کاربری و رمز عبور انجام میدهند. ساختار کد شبیه حالت قبل است، اما فیلدهای username و password را اضافه میکنیم:
const { chromium } = require('playwright');
const proxyUrl = '11.456.448.110:8080';
const proxyUsername = 'PROXY_USERNAME';
const proxyPassword = 'PROXY_PASSWORD';
const launchOptions = {
proxy: {
server: proxyUrl,
username: proxyUsername,
password: proxyPassword
}
};
(async () => {
const browser = await chromium.launch(launchOptions);
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
const pageContent = await page.textContent('body');
console.log(pageContent);
await browser.close();
})();
توضیحات خط به خط (خلاصه):
بعضی ارائهدهندگان پراکسی، یک API هوشمند ارائه میدهند که خودش rotation، بررسی بن و retry را انجام میدهد. این APIها معمولاً یک URL endpoint دارند. مسئله این است که وقتی مرورگر صفحهای با لینکهای نسبی دریافت میکند، Playwright ممکن است آن لینکها را نسبت به آدرس پراکسی (endpoint) تفسیر کند و منابع صفحه درست لود نشوند.
راهحل: اگر ارائهدهنده پورت پراکسی (proxy port) ارائه میدهد، از آن استفاده کنید تا مرورگر مانند یک پراکسی معمولی عمل کند و آدرسهای نسبی به درستی کار کنند. به عنوان مثال، در حالت پورت شما همانند نمونههای بالا آدرس proxy را به شکل 'proxy.example.io:5353' به launchOptions.proxy.server میدهید و نام کاربری/کلید API را در فیلد password قرار میدهید.
// مثال ادغام با proxy port و کلید API
const { chromium } = require('playwright');
const proxyUrl = 'proxy.scrapeops.io:5353';
const SCRAPEOPS_API_KEY = 'YOUR_API_KEY';
const launchOptions = {
ignoreHTTPSErrors: true, // بعضی proxyها نیاز به نادیده گرفتن خطاهای SSL دارند
proxy: {
server: proxyUrl,
username: 'scrapeops',
password: SCRAPEOPS_API_KEY
}
};
(async () => {
const browser = await chromium.launch(launchOptions);
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
const pageContent = await page.textContent('body');
console.log(pageContent);
await browser.close();
})();
نکته SSL: بعضی proxyهای API برای هدایت ترافیک نیاز دارند که خطاهای گواهینامهٔ TLS نادیده گرفته شوند (ignoreHTTPSErrors: true). این را فقط وقتی که مطمئن هستید به سرویسهای قابل اعتماد متصل میشوید فعال کنید.
برای پروژههای واقعی این موارد را در نظر بگیرید:
نمونهٔ ساده برای wrapper retry که میتوانید هنگام page.goto استفاده کنید:
async function withRetries(fn, attempts = 3, delay = 1000) {
let lastErr;
for (let i = 0; i < attempts; i++) {
try {
return await fn();
} catch (err) {
lastErr = err;
const wait = delay * Math.pow(2, i); // exponential backoff
await new Promise(r => setTimeout(r, wait));
}
}
throw lastErr;
}
// استفاده:
await withRetries(() => page.goto('https://example.com'), 4, 500);
چند اصل مهم:
وقتی انتخاب بین استفاده از پراکسیها روی پورت و استفاده از API دارید، عوامل زیر را در نظر بگیرید:
اضافه کردن پراکسی به اسکریپرهای Playwright کاری مستقیم است: کافی است launchOptions.proxy را تنظیم کنید. برای پراکسیهای احراز هویت فیلدهای username و password را اضافه کنید و در صورت استفاده از proxy APIها، تا جای ممکن از پورت پراکسی استفاده کنید تا مشکلات لینکهای نسبی پیش نیاید. در نهایت، مدیریت خطا، rotation، و حفاظت از کلیدها، نقش کلیدی در پایداری و امنیت اسکریپر شما دارند.


