Назад к блогу

Настройка прокси в Playwright для headless-тестирования и парсинга: полное руководство

Разбираем, как правильно подключить прокси в Playwright для headless-тестирования и парсинга — с примерами кода, ротацией IP и обходом антибот-защиты.

📅8 мая 2026 г.

Playwright — один из самых мощных инструментов для автоматизации браузера, headless-тестирования и парсинга данных. Но без правильно настроенного прокси ваш скрипт быстро получит бан по IP: сайты научились распознавать автоматизированные запросы и блокировать их. В этом руководстве разберём все способы подключения прокси в Playwright — от базовой конфигурации до ротации IP и обхода Cloudflare.

Зачем прокси в Playwright и когда без него не обойтись

Playwright запускает реальный браузер (Chromium, Firefox или WebKit) в фоновом режиме — это и есть headless. С точки зрения сайта вы выглядите как обычный пользователь, но только до определённого момента. Как только с одного IP начинают идти сотни запросов в час, алгоритмы защиты реагируют мгновенно: CAPTCHA, временная блокировка, полный бан.

Вот конкретные сценарии, когда прокси обязателен:

  • Парсинг маркетплейсов — Wildberries, Ozon, Авито, Яндекс.Маркет блокируют скрипты уже после 50–100 запросов с одного IP.
  • Мониторинг цен конкурентов — если запускать проверку каждые 15 минут, без смены IP вы получите бан в течение нескольких часов.
  • Тестирование геолокации — нужно проверить, как сайт выглядит для пользователей из Германии, США или Казахстана.
  • Заполнение форм и регистрация аккаунтов — платформы привязывают аккаунты к IP и блокируют массовую регистрацию.
  • SEO-мониторинг — сбор позиций из Google и Яндекс требует постоянной смены IP, иначе поисковик покажет CAPTCHA.
  • Тестирование A/B-функций — некоторые фичи доступны только пользователям из определённых стран или регионов.

Важно понимать: Playwright сам по себе не делает вас анонимным. Без прокси все запросы идут с вашего реального IP-адреса. Добавление прокси — это первый и самый важный шаг к стабильной работе любого автоматизированного скрипта.

💡 Важно знать

Playwright поддерживает прокси на уровне всего браузера, отдельного контекста (BrowserContext) и даже отдельной страницы. Это даёт гибкость: разные страницы могут работать через разные IP одновременно.

Какой тип прокси выбрать для headless-автоматизации

Не все прокси одинаково подходят для Playwright. Выбор зависит от задачи: что вы парсите, насколько агрессивна защита сайта и какой объём запросов планируете.

Тип прокси Уровень доверия Скорость Подходит для
Дата-центр Низкий Очень высокая Парсинг без строгой защиты, тестирование
Резидентные Высокий Средняя Сайты с Cloudflare, маркетплейсы, соцсети
Мобильные Максимальный Средняя Facebook, TikTok, Instagram, строгие антиботы
SOCKS5 Зависит от источника Высокая Универсальный протокол, поддерживается Playwright

Для большинства задач парсинга оптимальный выбор — резидентные прокси с ротацией. Они имеют реальные IP домашних пользователей, поэтому сайты не определяют их как дата-центр и не блокируют автоматически. Для сайтов с агрессивной защитой (Cloudflare Bot Management, Akamai) лучше использовать мобильные прокси — их IP принадлежат операторам сотовой связи, что вызывает максимальное доверие.

Playwright поддерживает протоколы http, https и socks5. Важно: SOCKS5 не поддерживает авторизацию через username:password напрямую в некоторых версиях — об этом подробнее в разделе об ошибках.

Базовая настройка прокси в Playwright (JavaScript и Python)

Playwright позволяет задать прокси при запуске браузера через параметр proxy. Это самый простой способ — все запросы браузера будут идти через указанный прокси-сервер.

JavaScript / Node.js

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy.example.com:8080'
    }
  });

  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  
  const content = await page.textContent('body');
  console.log(content); // покажет IP прокси-сервера

  await browser.close();
})();

Python

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server": "http://proxy.example.com:8080"
        }
    )
    
    page = browser.new_page()
    page.goto("https://httpbin.org/ip")
    
    print(page.text_content("body"))  # покажет IP прокси
    
    browser.close()

Для SOCKS5 просто измените схему в адресе сервера:

# Python — SOCKS5 прокси
browser = p.chromium.launch(
    proxy={
        "server": "socks5://proxy.example.com:1080"
    }
)

Чтобы быстро проверить, что прокси работает, откройте https://httpbin.org/ip или https://api.ipify.org — в ответе должен быть IP прокси-сервера, а не ваш реальный.

Прокси с авторизацией по логину и паролю

Большинство коммерческих прокси-провайдеров используют авторизацию по логину и паролю — это стандартная практика. Playwright поддерживает её через поля username и password в объекте прокси.

JavaScript

const browser = await chromium.launch({
  proxy: {
    server: 'http://gate.proxyprovider.com:7777',
    username: 'your_login',
    password: 'your_password'
  }
});

Python

browser = p.chromium.launch(
    proxy={
        "server": "http://gate.proxyprovider.com:7777",
        "username": "your_login",
        "password": "your_password"
    }
)

Также логин и пароль можно передать прямо в URL прокси-сервера — это удобно, если вы формируете строку динамически:

# Авторизация в URL (Python)
proxy_url = f"http://{login}:{password}@gate.proxyprovider.com:7777"

browser = p.chromium.launch(
    proxy={"server": proxy_url}
)

⚠️ Внимание

Не храните логин и пароль прокси прямо в коде! Используйте переменные окружения (os.environ в Python или process.env в Node.js) или файл .env с библиотекой dotenv.

Безопасное хранение через .env (Python)

import os
from dotenv import load_dotenv
from playwright.sync_api import sync_playwright

load_dotenv()

PROXY_SERVER   = os.getenv("PROXY_SERVER")
PROXY_LOGIN    = os.getenv("PROXY_LOGIN")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server":   PROXY_SERVER,
            "username": PROXY_LOGIN,
            "password": PROXY_PASSWORD
        }
    )
    # ...

Ротация прокси: смена IP для каждого запроса

Один прокси не спасёт от бана при большом объёме запросов. Для серьёзного парсинга нужна ротация IP — автоматическая смена прокси-сервера через определённые интервалы или для каждого нового запроса.

Существует два подхода к ротации в Playwright:

Подход 1: Ротирующий прокси-эндпоинт

Большинство провайдеров резидентных прокси предоставляют единый gateway-адрес, который автоматически меняет IP при каждом подключении. Вам не нужно писать логику ротации — она встроена на стороне провайдера.

# Один эндпоинт — новый IP при каждом подключении браузера
browser = p.chromium.launch(
    proxy={
        "server":   "http://rotating.proxyprovider.com:8888",
        "username": "your_login",
        "password": "your_password"
    }
)

Подход 2: Ручная ротация через список прокси

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

import random
from playwright.sync_api import sync_playwright

PROXY_LIST = [
    {"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
    {"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
    {"server": "http://proxy3.example.com:8080", "username": "user", "password": "pass"},
]

URLS_TO_SCRAPE = [
    "https://example.com/page1",
    "https://example.com/page2",
    "https://example.com/page3",
]

with sync_playwright() as p:
    for url in URLS_TO_SCRAPE:
        proxy = random.choice(PROXY_LIST)  # случайный прокси
        
        browser = p.chromium.launch(proxy=proxy)
        page = browser.new_page()
        
        page.goto(url)
        # ... парсинг данных ...
        
        browser.close()  # закрываем браузер, меняем IP

Подход 3: Ротация через BrowserContext (без перезапуска браузера)

with sync_playwright() as p:
    browser = p.chromium.launch()  # браузер без прокси
    
    for i, url in enumerate(URLS_TO_SCRAPE):
        proxy = PROXY_LIST[i % len(PROXY_LIST)]  # по кругу
        
        # Новый контекст с новым прокси — быстрее чем перезапуск браузера
        context = browser.new_context(proxy=proxy)
        page = context.new_page()
        
        page.goto(url)
        # ... парсинг ...
        
        context.close()  # закрываем контекст, не браузер
    
    browser.close()

Третий подход — самый производительный для массового парсинга. Перезапуск браузера занимает 2–4 секунды, тогда как создание нового контекста — менее 100 миллисекунд.

Прокси на уровне контекста и страницы

Playwright поддерживает гибкую архитектуру: один браузер может иметь несколько изолированных контекстов, каждый со своим прокси. Это позволяет параллельно работать с несколькими IP в рамках одного процесса.

Несколько контекстов с разными прокси (параллельный парсинг)

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();

  // Контекст 1 — прокси из Германии
  const context_de = await browser.newContext({
    proxy: {
      server: 'http://de-proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  // Контекст 2 — прокси из США
  const context_us = await browser.newContext({
    proxy: {
      server: 'http://us-proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  const page_de = await context_de.newPage();
  const page_us = await context_us.newPage();

  // Параллельный запуск
  await Promise.all([
    page_de.goto('https://example.com'),
    page_us.goto('https://example.com')
  ]);

  // Обе страницы видят разные IP
  console.log('DE IP:', await page_de.textContent('body'));
  console.log('US IP:', await page_us.textContent('body'));

  await browser.close();
})();

Этот подход идеально подходит для тестирования геолокации: вы одновременно проверяете, как сайт отображается для пользователей из разных стран, не запуская несколько экземпляров браузера.

💡 Совет по производительности

Для максимальной параллельности используйте asyncio в Python или Promise.all в Node.js. Один браузер может держать 10–20 параллельных контекстов без значительной нагрузки на память.

Обход антибот-защиты: Cloudflare, Akamai, DataDome

Прокси — это только часть решения. Современные антибот-системы анализируют десятки сигналов одновременно: fingerprint браузера, поведение мыши, скорость заполнения форм, заголовки HTTP и многое другое. Даже с хорошим прокси вас могут заблокировать, если не учесть эти факторы.

1. Маскировка headless-режима

Playwright в headless-режиме имеет характерные признаки, которые легко определяются: специфические значения navigator.webdriver, отсутствие плагинов, нестандартные размеры экрана. Используйте библиотеку playwright-stealth для маскировки:

# Python: установка
# pip install playwright-stealth

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server":   "http://residential.proxyprovider.com:8888",
            "username": "user",
            "password": "pass"
        }
    )
    page = browser.new_page()
    stealth_sync(page)  # применяем маскировку
    
    page.goto("https://bot.sannysoft.com")  # тест на определение бота
    browser.close()

2. Реалистичный User-Agent и viewport

context = browser.new_context(
    proxy={
        "server":   "http://proxy.example.com:8080",
        "username": "user",
        "password": "pass"
    },
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    viewport={"width": 1920, "height": 1080},
    locale="ru-RU",
    timezone_id="Europe/Moscow"  # должен совпадать с геолокацией прокси!
)

3. Имитация человеческого поведения

import time
import random

# Случайные задержки между действиями
def human_delay(min_ms=500, max_ms=2000):
    time.sleep(random.randint(min_ms, max_ms) / 1000)

page.goto("https://example.com")
human_delay()

# Плавный скролл вместо мгновенного
page.evaluate("window.scrollBy({top: 500, behavior: 'smooth'})")
human_delay(300, 800)

# Движение мыши перед кликом
page.mouse.move(100, 200)
human_delay(100, 300)
page.mouse.move(300, 400)
human_delay(100, 200)
page.click("button#submit")

4. Совпадение таймзоны с геолокацией прокси

Это часто игнорируют, но антибот-системы проверяют соответствие: если ваш прокси из Москвы, а браузер показывает таймзону UTC-8 (Лос-Анджелес) — это красный флаг. Всегда устанавливайте timezone_id в соответствии с геолокацией используемого прокси.

Типичные ошибки и как их исправить

При работе с прокси в Playwright разработчики регулярно сталкиваются с одними и теми же проблемами. Разберём каждую с конкретным решением.

Ошибка 1: ERR_PROXY_CONNECTION_FAILED

Причина: Неверный адрес или порт прокси, прокси недоступен, неверные учётные данные.
Решение: Проверьте доступность прокси через curl перед запуском Playwright:

# Проверка прокси через curl
curl -x http://user:[email protected]:8080 https://api.ipify.org

Ошибка 2: SOCKS5 не принимает авторизацию

Причина: Playwright (Chromium) имеет ограниченную поддержку SOCKS5 с авторизацией через username/password.
Решение: Используйте HTTP-прокси с авторизацией или настройте локальный SOCKS5-туннель через ssh -D без пароля.

Ошибка 3: Прокси работает, но сайт всё равно блокирует

Причина: Используются прокси дата-центра, которые находятся в чёрных списках; не замаскирован headless-режим; слишком высокая частота запросов.
Решение: Перейдите на резидентные или мобильные прокси, добавьте playwright-stealth, увеличьте задержки между запросами.

Ошибка 4: Утечка реального IP (DNS leak)

Причина: DNS-запросы могут идти в обход прокси.
Решение: Playwright по умолчанию направляет DNS через прокси при использовании HTTP-прокси. Но для проверки используйте https://dnsleaktest.com в headless-браузере.

Ошибка 5: Медленная работа с прокси

Причина: Резидентные прокси медленнее дата-центровых; большое расстояние до прокси-сервера.
Решение: Выбирайте прокси в географически близких локациях. Для задач без строгих требований к анонимности используйте прокси дата-центров — они значительно быстрее.

Ошибка Быстрое решение
ERR_PROXY_CONNECTION_FAILED Проверить curl, логин/пароль, доступность порта
407 Proxy Auth Required Добавить username и password в конфиг прокси
Сайт показывает CAPTCHA Сменить тип прокси на резидентные, добавить stealth
IP не меняется при ротации Закрывать контекст/браузер между запросами
Таймаут подключения Увеличить timeout в goto(), выбрать более близкий прокси

Заключение и рекомендации

Настройка прокси в Playwright — это не разовая задача, а часть архитектуры вашего инструмента автоматизации. Правильно подобранный тип прокси, грамотная ротация IP и маскировка headless-режима вместе дают стабильную работу даже на сайтах с агрессивной антибот-защитой.

Подведём итоги по выбору типа прокси для конкретных задач:

  • Парсинг открытых данных без строгой защиты — подойдут быстрые прокси дата-центров.
  • Маркетплейсы (Wildberries, Ozon), новостные агрегаторы — нужны резидентные прокси с ротацией.
  • Соцсети (Instagram, Facebook, TikTok) и сайты с Cloudflare — только мобильные или резидентные прокси.
  • Тестирование геолокации — любой тип прокси в нужной стране, главное — совпадение таймзоны.
  • Массовый парсинг с высокой частотой — ротирующие резидентные прокси с gateway-эндпоинтом.

Если вы строите систему парсинга или автоматизированного тестирования на Playwright и вам нужна стабильная работа без блокировок, рекомендуем рассмотреть резидентные прокси — они обеспечивают высокий уровень доверия со стороны сайтов и поддерживают ротацию IP через единый эндпоинт, что упрощает интеграцию с Playwright до нескольких строк кода.