Продукты
Безлимитные прокси от $19/мес Ротационные прокси от $49/мес ISP прокси от $33/мес Персональные прокси от $3.50/мес UDP прокси от $5/мес Попробовать прокси
По целям
Парсинг и данные ИИ-сервисы Соцсети и мессенджеры Медиа и развлечения Все задачи →
Цены
Полная таблица цен Все 20 стран Гарантия возврата
Ресурсы
Блог MCP-сервер Инструкции по настройке Частые вопросы Для бизнеса О сервисе Партнёрская программа
Русский
English Русский

Настройка прокси в Playwright

В Playwright поддержка прокси встроена прямо в API: объект proxy передаётся либо в launch() — для всего браузера, либо в newContext() — для отдельного контекста. Работает одинаково в Chromium, Firefox и WebKit, а авторизацию по логину и паролю Playwright выполняет сам — никаких всплывающих окон входа. Ниже рабочие примеры для Node.js и Python.

Перед настройкой: данные прокси и порты

Вам понадобятся IP-адрес прокси и порт. И то и другое есть в личном кабинете — откройте активную подписку, там указаны все данные для подключения. Порт зависит от способа авторизации:

Авторизация Порт HTTP Порт SOCKS5 Кому подходит
Логин / пароль
данные из личного кабинета
8080 1080 Запуск скриптов с машин, у которых меняется IP
Привязка по IP
логин и пароль не нужны
8085 1085 Серверы со статическим IP — данные для входа не попадают в код

При работе с привязкой сначала добавьте IP-адрес сервера в привязку в личном кабинете — после этого в объекте proxy достаточно одного поля server.

Прокси для всего браузера

Передайте параметр proxy в launch() — его унаследуют все страницы и контексты:

Node.js

const { chromium } = require('playwright'); (async () => { const browser = await chromium.launch({ proxy: { server: 'http://123.45.67.89:8080', username: 'ваш-логин', password: 'ваш-пароль' } }); const page = await browser.newPage(); await page.goto('https://api.ipify.org'); console.log(await page.textContent('body')); // выведет IP прокси await browser.close(); })();

Python

from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(proxy={ "server": "http://123.45.67.89:8080", "username": "ваш-логин", "password": "ваш-пароль", }) page = browser.new_page() page.goto("https://api.ipify.org") print(page.text_content("body")) # выведет IP прокси browser.close()

В Playwright Test тот же объект задаётся один раз в playwright.config.ts — и его подхватят все тесты:

import { defineConfig } from '@playwright/test'; export default defineConfig({ use: { proxy: { server: 'http://123.45.67.89:8080', username: 'ваш-логин', password: 'ваш-пароль' } } });

Поля username и password автоматически отвечают на запрос авторизации прокси — это и есть решение проблемы «proxy authentication», которая мучает всех при работе с голым флагом --proxy-server в Chromium. Храните данные для входа в переменных окружения, а не в самом скрипте. На порту 8085 с привязкой по IP оба поля не нужны — передавайте только server.

Свой прокси на каждый контекст

Контекст в Playwright — это изолированный «профиль инкогнито», и у каждого может быть собственный прокси. Это удобно, когда одному скрипту нужны несколько аккаунтов или локаций одновременно:

Node.js

const browser = await chromium.launch(); const usContext = await browser.newContext({ proxy: { server: 'http://123.45.67.89:8085' } }); const deContext = await browser.newContext({ proxy: { server: 'http://98.76.54.32:8085' } });

Python

browser = p.chromium.launch() context = browser.new_context(proxy={"server": "http://123.45.67.89:8085"}) page = context.new_page()

Если нужен постоянный профиль (куки и хранилище сохраняются на диск), launch_persistent_context() принимает тот же параметр proxy:

context = p.chromium.launch_persistent_context( "/path/to/profile", proxy={"server": "http://123.45.67.89:8085"}, )

Прокси SOCKS5

Чтобы использовать SOCKS5, поменяйте схему в server:

browser = p.chromium.launch(proxy={"server": "socks5://123.45.67.89:1085"})

Важное ограничение: Playwright не передаёт логин и пароль SOCKS5-прокси — поля username/password работают только с HTTP-прокси. Поэтому для SOCKS5 используйте порт 1085 с привязкой по IP. Впрочем, для большинства задач в Playwright проще взять HTTP-прокси.

В мануалах по curl и Python requests встречается схема socks5h:// — там дополнительная «h» заставляет прокси резолвить доменные имена вместо вашей машины, чтобы DNS-запросы не уходили мимо прокси. Браузеры такую схему не распознают, и она им не нужна: по документации Chromium с обычной socks5:// резолвинг имён всегда выполняется на стороне прокси.

Как пустить часть хостов мимо прокси

Необязательное поле bypass перечисляет хосты, к которым нужно ходить напрямую — например, ваши собственные тестовые серверы:

proxy: { server: 'http://123.45.67.89:8085', bypass: 'localhost, .internal.example.com' }

Загрузка прокси из списка и ротация

С пакетом прокси адреса никто не вписывает в код руками: выгрузите весь список из личного кабинета в файл — по одному IP:порт на строку, порядок полей и разделитель настраиваются при выгрузке — и загружайте его в начале скрипта:

Python

from playwright.sync_api import sync_playwright # proxies.txt — по одному адресу на строку: 123.45.67.89:8085 with open("proxies.txt") as f: proxies = [f"http://{line.strip()}" for line in f if line.strip()] with sync_playwright() as p: # машина в привязке: прокси-заглушка в launch включает прокси на контекст в Chromium browser = p.chromium.launch(proxy={"server": "per-context"}) for server in proxies: context = browser.new_context(proxy={"server": server}) page = context.new_page() page.goto("https://example.com") # ... парсим ... context.close() browser.close()

Node.js

const fs = require('node:fs'); const { chromium } = require('playwright'); // proxies.txt — по одному адресу на строку: 123.45.67.89:8085 const proxies = fs.readFileSync('proxies.txt', 'utf8') .split('\n').map(s => s.trim()).filter(Boolean) .map(s => `http://${s}`); const browser = await chromium.launch({ proxy: { server: 'per-context' } }); for (const server of proxies) { const context = await browser.newContext({ proxy: { server } }); const page = await context.newPage(); await page.goto('https://example.com'); // ... парсим ... await context.close(); } await browser.close();

Если список работает на портах с логином и паролем (8080 для HTTP), новая выгрузка не нужна — задайте логин и пароль один раз константами и передавайте их вместе с каждым адресом; на запрос авторизации Playwright ответит сам:

from playwright.sync_api import sync_playwright LOGIN, PASSWORD = "ваш-логин", "ваш-пароль" # proxies.txt — по одному адресу на строку: 123.45.67.89:8080 with open("proxies.txt") as f: proxies = [f"http://{line.strip()}" for line in f if line.strip()] with sync_playwright() as p: browser = p.chromium.launch(proxy={"server": "per-context"}) for server in proxies: context = browser.new_context(proxy={ "server": server, "username": LOGIN, "password": PASSWORD, }) page = context.new_page() page.goto("https://example.com") # ... парсим ... context.close() browser.close()

В Node.js те же три поля — { server, username, password } — передаются в newContext(). Помните про ограничение: Chromium не принимает логин и пароль для SOCKS5, поэтому ротация с авторизацией работает на порту 8080. А если файл выгружен уже с данными для входа (строки вида логин:пароль@IP:порт), разбейте каждую строку по @ и заполните те же три поля — доставать логин и пароль из URL сервера Playwright надёжно не умеет.

Контексты создаются и закрываются дёшево, поэтому «один контекст на прокси из списка» — стандартный паттерн ротации. Наши пакеты серверных прокси начинаются от 100 IP, так что сам список узким местом не станет, а когда целевой сайт начнёт ограничивать запросы — обновите список по запросу и выгрузите файл заново.

Если что-то не работает

Самые частые причины: ERR_TUNNEL_CONNECTION_FAILED или ERR_PROXY_CONNECTION_FAILED обычно означают, что порт не соответствует способу авторизации (см. таблицу) — либо, на портах 8085/1085, что IP машины не добавлен в привязку; ошибка авторизации на SOCKS5-прокси значит, что логин и пароль ожидались там, где Playwright их не передаёт, — перейдите на порт 1085 с привязкой; а если один из контекстов ведёт себя не так, как остальные, проверьте, не переопределяет ли он прокси, заданный в launch(). Если дело не в этом — напишите нам в онлайн-чат прямо на этой странице, поможем подключиться.