Налаштування проксі у Playwright: підключення різних IP для кожного браузера та контексту
Цей посібник пояснює, як підключити HTTP- та SOCKS5-проксі Socks5Proxy через параметр proxy у Playwright, використовуючи server, username, password, а також як використовувати різні IP для кожного контексту в одному браузері за допомогою Node.js та Python.
Який спосіб налаштування проксі у Playwright найзручніший?
Playwright приймає адресу проксі, ім'я користувача та пароль у одній proxy-опції, тому не потрібно окремо обробляти вікно автентифікації. Ця опція працює для Chromium, Firefox та WebKit.
Також можна запустити один браузер із кількома контекстами, кожен з яких використовує різні проксі. Контексти мають окремі cookies та сховища, що дозволяє економити пам’ять.
У прикладі використовується IP 198.51.100.23, HTTP порт 8000, SOCKS5 порт 1080, ім'я користувача spx_user, пароль spx_pass.
npm install playwright
npx playwright install chromiumЯк налаштувати HTTP-проксі для всього браузера?
Додавши server, username та password до опції proxy в launch, ви зможете використовувати один проксі для всіх сторінок у браузері. HTTPS-сайти передаються через зашифрований CONNECT-тунель.
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" },
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body")); // proxy IP
await browser.close();Як використовувати різні IP для різних контекстів?
Додавши опцію proxy до newContext, ви зможете використовувати цей проксі лише для цього контексту. У прикладі нижче список проксі отримується через API, створюються три контексти з різними IP, і для кожного виводиться його IP. Для роботи з кількома акаунтами одночасно рекомендується зв'язувати один контекст з одним акаунтом та однією IP.
У деяких версіях Chromium та на Windows для використання проксі на рівні контексту іноді потрібно також вказати проксі в launch. У такому разі вкажіть перший проксі в launch, а потім перевизначте його для кожного контексту.
import { chromium } from "playwright";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);
const browser = await chromium.launch();
for (const line of lines) {
const [ip, port, user, pass] = line.trim().split(":");
const context = await browser.newContext({
proxy: { server: "http://" + ip + ":" + port, username: user, password: pass },
locale: "en-US",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(ip, await page.textContent("body"));
await context.close();
}
await browser.close();Як використовувати проксі SOCKS5?
Використовуйте адресу у форматі socks5://. Chromium не підтримує авторизацію через логін та пароль для SOCKS5, тому рекомендується IP-авторизація. Додайте IPv4 вашого сервера до списку дозволених у панелі керування та вкажіть лише server без username та password.
Якщо потрібне підключення за ім'ям/паролем, використовуйте HTTP-порт того самого IP. Цільовий сайт бачитиме ту саму IP та місцезнаходження.
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: { server: "socks5://198.51.100.23:1080" }, // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await browser.close();Як використовувати у Python?
Playwright для Python має таку саму структуру. Використовуйте словник proxy з server, username, password. Нижче наведено приклад для синхронного режиму. Назви опцій для асинхронного режиму такі самі.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://198.51.100.23:8000",
"username": "spx_user",
"password": "spx_pass",
})
page = browser.new_page()
page.goto("https://api.ipify.org")
print(page.text_content("body"))
browser.close()Що потрібно налаштувати, щоб результати виглядали як у користувачів цієї країни?
Встановіть locale та timezoneId у контексті відповідно до країни IP, щоб сторінка відображалася мовою та часом для користувачів цієї країни. Наприклад, для IP Німеччини використовуйте locale de-DE та timezoneId Europe/Berlin.
Якщо зображення та відео не потрібні, ви можете заблокувати ці запити за допомогою page.route, що дозволяє заощадити пропускну здатність та час. Це особливо корисно для спільних планів, де пропускна здатність обмежена щомісяця.
- Налаштування locale та timezoneId відповідно до країни IP
- Один контекст - один акаунт - одна IP
- Блокуйте зайві запити зображень та відео за допомогою page.route
- Для SOCKS5 використовуйте IP-авторизацію, а для HTTP-порту - логін та пароль
Як автоматично отримувати список і розділяти його для різних завдань?
GET /proxies API повертає JSON із IP, портом та країною для кожного рядка. Фільтруючи за країною, ви можете одразу отримати список для завдань у конкретній країні. У цьому прикладі створюються контексти для роботи з американськими проксі. Назви полів відповіді можна перевірити в документації API.
Якщо у вас багато завдань, рекомендуємо закривати контекст після завершення кожного завдання, щоб звільнити пам’ять.
import { chromium } from "playwright";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies?country=us&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const { proxies } = await res.json();
const browser = await chromium.launch();
for (const p of proxies.slice(0, 5)) {
const context = await browser.newContext({
proxy: { server: "http://" + p.host + ":" + p.http_port, username: p.username, password: p.password },
locale: "en-US",
timezoneId: "America/New_York",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await context.close();
}
await browser.close();Як блокувати зайві запити для економії трафіку?
Використання page.route або context.route для блокування запитів зображень, шрифтів та відео пришвидшує завантаження сторінок та зменшує використання пропускної здатності проксі. Особливо ефективно для збору даних.
await context.route("**/*", (route) => {
const type = route.request().resourceType();
return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});Чи працюють однакові проксі в Firefox та WebKit?
Так. Playwright приймає однакові параметри проксі для всіх трьох браузерів. Тестуючий відділ може послідовно запускати Chromium, Firefox та WebKit через один проксі, щоб перевірити узгодженість відображення сторінок у різних браузерах.
Як і Chromium, Firefox не підтримує автентифікацію SOCKS5 за логіном/паролем на рівні браузера, тому для SOCKS5 використовуйте IP авторизацію. HTTP порт підтримує логін та пароль у всіх трьох браузерах.
Якщо ви використовуєте Playwright Test, ви можете додати проксі до use у playwright.config для застосування до всіх тестів або розділити проект за країнами з різними проксі.
import { defineConfig } from "@playwright/test";
export default defineConfig({
projects: [
{ name: "us", use: { locale: "en-US", proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" } } },
{ name: "de", use: { locale: "de-DE", proxy: { server: "http://198.51.100.24:8000", username: "spx_user", password: "spx_pass" } } },
],
});Як вирішити поширені помилки?
Помилка net::ERR_PROXY_CONNECTION_FAILED вказує на невірну адресу чи порт сервера. Помилки 407 або пов'язані з авторизацією вимагають перевірки username та password. Помилка Browser does not support socks5 proxy authentication виникає при спробі авторизації через SOCKS5 з логіном та паролем. Використовуйте IP-авторизацію або HTTP-порт.