# Интеграция прокси в Playwright: браузер, контекст и ротация

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

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

## Прокси в Playwright при запуске браузера

Передайте объект `proxy` в `launch()`, и каждая страница в браузере будет маршрутизироваться через него. Обратите внимание на форму: URL сервера не содержит учетных данных — они находятся в отдельных полях `username` и `password`, что позволяет Playwright избежать проблемы всплывающих окон аутентификации, которая преследует Selenium и Puppeteer:

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

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://residentialpremium.quantumproxies.io:8080',
      username: 'USER',
      password: 'PASS',
    },
  });
  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  console.log(await page.textContent('body')); // proxy exit IP
  await browser.close();
})();
```

API Python точно это отражает:

```python
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://residentialpremium.quantumproxies.io:8080",
        "username": "USER",
        "password": "PASS",
    })
    page = browser.new_page()
    page.goto("https://httpbin.org/ip")
    print(page.text_content("body"))
    browser.close()
```

Если ваши учетные данные находятся в стандартной строке `http://user:pass@host:port`, разделите её с помощью класса URL (`new URL()` в Node, `urllib.parse` в Python), а не строковых операций — так пароли со специальными символами сохраняются. Одно предостережение для тест-раннеров: `use.proxy` в `playwright.config.ts` охватывает тесты, но есть давние сообщения о том, что настройки прокси на уровне конфигурации игнорируются в смешанных настройках, поэтому для скриптов парсинга всегда устанавливайте прокси при `launch()` или непосредственно в контексте.

## Прокси на уровне контекста: ротация без новых браузеров

`BrowserContext` — это изолированный браузер в браузере: отдельные куки, хранилище и кэш, которые делят только процесс. Контексты принимают свою собственную опцию `proxy`, и создание одного занимает миллисекунды по сравнению с секундами для полного запуска — поэтому шаблон ротации: один браузер, контекст на каждую задачу:

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

const PROXY = {
  server: 'http://residentialpremium.quantumproxies.io:8080',
  username: 'USER',
  password: 'PASS',
};

(async () => {
  const browser = await chromium.launch();
  const urls = ['https://example.com/a', 'https://example.com/b'];

  for (const url of urls) {
    const context = await browser.newContext({ proxy: PROXY });
    const page = await context.newPage();
    try {
      await page.goto(url, { timeout: 30000 });
      // ...extract...
    } finally {
      await context.close(); // frees cookies, cache, session
    }
  }
  await browser.close();
})();
```

Подключенные к вращающемуся шлюзу, каждый контекст выходит с другого IP в пуле из более чем 90 миллионов резидентных адресов без управления списками — это то, что делают [вращающиеся прокси](https://quantumproxies.io/rotating-proxies) на серверной стороне. Когда задача требует одного и того же IP для нескольких страниц (вход плюс оформление заказа), запросите липкую сессию через параметры имени пользователя, и выходной IP сохранится на время окна сессии. Контексты также изолируют сбои: заблокированный выходной IP умирает вместе с контекстом, а не отравляет весь браузер.

Тот же шаблон дает вам гео-таргетинг бесплатно. Поскольку прокси является опцией контекста, один браузер может одновременно содержать контекст США, контекст Германии и контекст Японии — каждый из которых видит локализованные цены, результаты поиска и баннеры согласия с локального выходного IP. Для работы по сравнению цен и проверки рекламы это заменяет три облачных региона тремя строками конфигурации.

![Один процесс браузера Playwright содержит три изолированных контекста, американский, немецкий и японский, каждый из которых направлен через свой резидентный выходной IP к одному и тому же сайту. Карточка: один процесс, раздельные cookies и хранилище, прокси на каждый newContext, а контекст стоит миллисекунды там, где браузер стоит секунды.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335143/blog/generated/qp-b9-004-diag1.png)
*Контексты — это единица ротации в Playwright: тот же процесс, отдельная идентичность, собственный прокси. Запуск контекста стоит миллисекунды; браузера — секунды.*

## SOCKS5, правила обхода и ловушка localhost

- **SOCKS5 работает, аутентификация SOCKS5 — нет.** Chromium не поддерживает учетные данные SOCKS, поэтому `server: 'socks5://...'` подключается только к неаутентифицированным конечным точкам. С аутентифицированными прокси SOCKS5 либо переключитесь на HTTP-порт того же шлюза, либо добавьте IP вашего компьютера в белый список, чтобы не требовались учетные данные.
- **Обход хостов** с помощью `bypass: '*.internal.example.com, localhost'` — трафик к этим хостам идет напрямую. Полезно, когда ваш скрипт также взаимодействует с внутренними сервисами, которые не должны проходить через прокси.
- **Localhost особенный.** Chromium по умолчанию пропускает прокси для адресов обратной петли, поэтому тестирование на локальном имитационном сервере кажется 'игнорирующим' ваш прокси. Это браузер, а не Playwright — тестируйте на внешней конечной точке, такой как httpbin.org/ip.
- **Контрольный список 'прокси не работает':** учетные данные в полях (не в URL сервера), схема присутствует в значении сервера, и выходной IP проверен загрузкой страницы эхо IP перед тем, как винить целевой сайт.

## Сократите трафик перед масштабированием

Браузер, выполняющий рендеринг, загружает все — изображения, шрифты, аналитику, скрипты рекламы — и через измеренный резидентный трафик вы платите за все это. Блокировка несущественных типов ресурсов регулярно сокращает передачу на страницу на половину или более, и маршрутизация Playwright делает это однострочной задачей на контексте. Больше шаблонов в нашем руководстве по [сокращению затрат на трафик прокси](https://quantumproxies.io/blog/reduce-proxy-bandwidth-costs-scraping):

```js
await context.route('**/*', (route) => {
  const type = route.request().resourceType();
  if (type === 'image' || type === 'font' || type === 'media') {
    return route.abort();
  }
  return route.continue();
});
```

Измеряйте эффект, а не предполагайте его: подпишитесь на события ответа контекста, суммируйте размеры передачи для выборки страниц с маршрутом и без него, и вы получите реальную стоимость в ГБ на страницу — число, которое решает, будет ли обход миллиона страниц округлением или строкой бюджета.

## Ограничения скрытности: что прокси не может исправить

Будьте честны насчет потолка. Резидентный выход решает проблему репутации IP — первый и самый большой фильтр — но Playwright все равно показывает признаки автоматизации выше сетевого уровня: особенности рендеринга в безголовом режиме, артефакты CDP и поверхности отпечатков, которые антиботы проверяют напрямую. Плагины скрытности исправляют некоторые сигналы и отстают от обновлений детекторов в других; это гонка вооружений, которую вы наследуете, а не настройка, которую вы включаете. Прагматичное разделение: запускайте Playwright через [резидентные прокси](https://quantumproxies.io/residential-proxies) для длинного хвоста обычных сайтов, а действительно враждебные домены маршрутизируйте через [Scraper API](https://quantumproxies.io/scraper-api), который управляет отпечатками, рендерингом и повторными попытками как своей основной задачей и возвращает HTML, markdown или структурированный JSON. Ваш код Playwright продолжает делать то, в чем он уникально хорош — потоки взаимодействия — в то время как задачи по извлечению и разбору переходят к API. Та же логика применима к [Puppeteer](https://quantumproxies.io/blog/puppeteer-proxy-setup) и [Selenium](https://quantumproxies.io/blog/selenium-proxy-setup-authenticated); ни одна замена фреймворка не решает проблему отпечатков.

![Шкала от обычных сайтов до враждебных доменов: резидентный прокси проходит первую стену, репутацию IP; стелс-плагины отстают от обновлений детекторов в проверках отпечатков; Scraper API берет на себя вторую стену для враждебных доменов. Карточка: держите Playwright на резидентных IP, а самые сложные домены направляйте через API.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335143/blog/generated/qp-b9-004-diag2.png)
*Чистые IP проводят вас через первую стену. Проверки отпечатков — вторая — и точка, где API превосходит очередной патч скрытности.*

## Часто задаваемые вопросы

### Как установить прокси в Playwright Python?

Передайте словарь прокси в `launch()`: `p.chromium.launch(proxy={"server": "http://host:port", "username": "USER", "password": "PASS"})`. Тот же словарь работает на `browser.new_context()` для маршрутизации на уровне контекста. Учетные данные всегда указываются в отдельных полях, никогда внутри URL сервера.

### Может ли Playwright использовать разные прокси для каждого контекста?

Да — передайте опцию `proxy` для каждого вызова `newContext()`. Контексты не делят ничего, кроме процесса браузера, поэтому два контекста с разными прокси ведут себя как два несвязанных браузера для целевых сайтов. Это стандартный шаблон ротации: один запуск, затем свежий контекст для каждой задачи или идентичности.

### Поддерживает ли Playwright аутентификацию прокси SOCKS5?

Нет. Playwright передает SOCKS5 в браузер, и Chromium не имеет механизма для учетных данных SOCKS, поэтому аутентифицированные конечные точки SOCKS5 не работают. Используйте HTTP(S)-порт того же шлюза прокси с полями имени пользователя и пароля или аутентифицируйтесь по белому списку IP и сохраняйте схему SOCKS5.

### Каков правильный формат прокси в Playwright?

Объект с полем `server` (`scheme://host:port` — http, https или socks5) плюс необязательные поля `username`, `password` и `bypass`. Не помещайте учетные данные внутри URL сервера; Playwright ожидает их отдельно, и пароли со специальными символами сохраняются только в выделенных полях.

### Почему мой прокси в Playwright не работает на localhost?

Chromium по умолчанию обходит прокси для адресов обратной петли, поэтому запросы к `localhost` или `127.0.0.1` идут напрямую и кажутся игнорирующими вашу конфигурацию. Проверьте прокси на внешнем URL, таком как httpbin.org/ip. В тестовых настройках также предпочтительно устанавливать прокси при `launch()`, а не полагаться на опции конфигурационного файла.

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

[Направьте Playwright на резидентные прокси](https://quantumproxies.io/residential-proxies)
