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 до нескольких строк кода.