Налаштування проксі в Puppeteer та Playwright
Покрокова інструкція по підключенню проксі до Puppeteer та Playwright з прикладами коду на JavaScript, обробкою помилок і ротацією IP в межах сесії.
Puppeteer: базова інтеграція
Найпростіший варіант — передати проксі через args при запуску браузера:
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
args: [
'--proxy-server=http://gate.proxyprovider.com:7777',
'--no-sandbox'
]
});
const page = await browser.newPage();
await page.goto('https://api.ipify.org');
console.log(await page.content()); // ваша нова IP
Puppeteer: з авторизацією
Більшість провайдерів вимагають user:pass авторизацію. Puppeteer не підтримує її напряму через args, тому треба використовувати page.authenticate():
const page = await browser.newPage();
await page.authenticate({
username: 'your-username',
password: 'your-password'
});
await page.goto('https://target.com');
Для residential-провайдерів user:pass формат зазвичай містить параметри сесії:
// Decodo: sticky 30 min, US gateway
username: 'user-spXXXX-country-us-session-abc123'
password: 'your-password'
// SOAX: sticky 1 hour, package id
username: 'package-XXX-country-us-sessionid-abc'
password: 'your-password'
Playwright: налаштування
У Playwright API трохи зручніший — проксі передається в browser context:
const { chromium } = require('playwright');
const browser = await chromium.launch();
const context = await browser.newContext({
proxy: {
server: 'http://gate.proxyprovider.com:7777',
username: 'your-username',
password: 'your-password'
}
});
const page = await context.newPage();
await page.goto('https://api.ipify.org');
Ротація IP в коді
Для rotation у межах одного скрипту створюйте новий context для кожного "робочого батча":
async function scrapeUrls(urls) {
for (const url of urls) {
const context = await browser.newContext({
proxy: { server: getNextProxy() } // ваша функція ротації
});
const page = await context.newPage();
await page.goto(url);
// ... process
await context.close(); // звільняє IP
}
}
Оптимізація трафіку
Найбільша економія — заблокувати завантаження медіа і скриптів, які вам не потрібні:
await page.setRequestInterception(true);
page.on('request', req => {
const resourceType = req.resourceType();
if (['image', 'stylesheet', 'font', 'media'].includes(resourceType)) {
req.abort();
} else {
req.continue();
}
});
На сайтах типу Amazon це економить 60-80% bandwidth, перетворюючи задачу 10 GB/день на 2-3 GB/день. У провайдерів з оплатою по гігабайтах — це означає економію в 3-4 рази.
Обережно: повне блокування JS може зламати сторінки на React/SPA-фреймворках. Для них блокуйте лише image, font, media — а stylesheet і script лишайте.