Socks5Proxy

Настройка прокси в Playwright: подключение разных IP для браузеров и контекстов

Это руководство объясняет, как подключить HTTP- и SOCKS5-прокси Socks5Proxy через опцию proxy в Playwright, используя server, username, password, и как использовать разные IP для каждого контекста в одном браузере с помощью Node.js и Python.

Какие настройки прокси удобны в Playwright?

Playwright принимает адрес прокси, имя пользователя и пароль в одной proxy-опции, поэтому не требует отдельной обработки окна аутентификации. Одна и та же опция работает для Chromium, Firefox и WebKit.

Также можно запустить один браузер с несколькими контекстами, каждый со своим прокси. Контексты - это отдельные профили с изолированными куками и хранилищем, что позволяет работать с несколькими IP и сессиями в одном браузере, экономя память.

Пример использует 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, создаёт 3 контекста с разными IP и выводит IP для каждого. При работе с несколькими аккаунтами свяжите один контекст с одним аккаунтом и IP.

В некоторых версиях Chromium и на Windows для работы прокси по контекстам может потребоваться указать proxy в 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:// в server. 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 имеет такую же структуру. Укажите server, username и password в словаре proxy. Ниже приведен пример для синхронного режима. В асинхронном режиме названия опций те же.

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 - страница отобразится с корректными языком и временем. Например, для Германии: 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 поддерживает одинаковые параметры proxy для всех трех браузеров. Если у вас тестовая команда, можно запускать Chromium, Firefox и WebKit через один прокси, чтобы проверить, совпадают ли страницы в разных браузерах.

Как и Chromium, Firefox не поддерживает аутентификацию по логину/паролю для SOCKS5 - используйте авторизацию по IP. HTTP-порт поддерживает аутентификацию во всех браузерах.

Если используете Playwright Test, добавьте proxy в раздел 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-порт.

Настройка прокси в Playwright: разные IP для браузеров и контекстов | Socks5Proxy