# Использование прокси с Playwright: отдельный выходной узел для браузера или контекста

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


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

**Python**

```python
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://res.hodlproxy.com:9000",
        "username": "USER-cc-us-sid-run1-ttl-30m",
        "password": "PASS",
    })
    page = browser.new_page()
    page.goto("https://api.ipify.org")
    print(page.inner_text("body"))
    browser.close()
```

**Node.js**

```node
import { chromium } from "playwright";

const browser = await chromium.launch({
  proxy: { server: "http://res.hodlproxy.com:9000", username: "USER-cc-us-sid-run1-ttl-30m", password: "PASS" },
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.innerText("body"));
await browser.close();
```

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


## Прокси для отдельных контекстов

Чтобы использовать в одном браузере несколько стран или сессий, запустите его с прокси-заглушкой и назначьте каждому контексту собственный прокси. Chromium требует прокси на уровне запуска, чтобы прокси отдельных контекстов применялись.

**Python**

```python
browser = p.chromium.launch(proxy={"server": "http://per-context"})

de = browser.new_context(proxy={"server": "http://res.hodlproxy.com:9000", "username": "USER-cc-de-city-berlin-sid-de1-ttl-30m", "password": "PASS"})
us = browser.new_context(proxy={"server": "http://res.hodlproxy.com:9000", "username": "USER-cc-us-state-tx-sid-us1-ttl-30m", "password": "PASS"})
```

**Node.js**

```node
const browser = await chromium.launch({ proxy: { server: "http://per-context" } });

const de = await browser.newContext({ proxy: { server: "http://res.hodlproxy.com:9000", username: "USER-cc-de-city-berlin-sid-de1-ttl-30m", password: "PASS" } });
const us = await browser.newContext({ proxy: { server: "http://res.hodlproxy.com:9000", username: "USER-cc-us-state-tx-sid-us1-ttl-30m", password: "PASS" } });
```


## Согласуйте контекст с выходным узлом

Задайте каждому контексту локаль и часовой пояс его страны, чтобы IP-адрес, язык и время соответствовали друг другу: `locale=\"de-DE\", timezone_id=\"Europe/Berlin\"` для берлинского контекста. Расхождения служат более явным признаком бота, чем сам IP-адрес.


## Экономьте гигабайты: блокируйте ненужное

**Python**

```python
def block(route):
    if route.request.resource_type in {"image", "media", "font", "stylesheet"}:
        return route.abort()
    return route.continue_()

page.route("**/*", block)
```

**Node.js**

```node
await page.route("**/*", (route) => {
  const t = route.request().resourceType();
  return ["image", "media", "font", "stylesheet"].includes(t) ? route.abort() : route.continue();
});
```

Отрисованная страница может занимать от 3 до 5 МБ, а её HTML и вызовы API — лишь несколько сотен килобайт. В сети с оплатой за гигабайт одно это правило сокращает расходы на 80–90 %.


## Проверка и устранение неполадок

- Сначала откройте сервис определения IP-адреса и проверьте страну, затем уточните город в сервисе геолокации.
- Ошибка `net::ERR_TUNNEL_CONNECTION_FAILED` или `ERR_PROXY_CONNECTION_FAILED` при запуске означает, что учётные данные или один из параметров указаны неверно; проверьте тот же URL с помощью cURL, чтобы увидеть код шлюза.
- В контекстах Playwright WebRTC не отключён по умолчанию: его необходимо блокировать. Когда важна конфиденциальность, добавьте защиту наподобие `--disable-webrtc` или заблокируйте STUN.


## Вопросы

**Можно ли назначить каждой вкладке отдельный прокси?**

Можно назначить каждому контексту; вкладки (страницы) внутри контекста используют общий прокси. Создавайте отдельный контекст для каждой сессии или страны.

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

Chromium не принимает учётные данные SOCKS5; используйте HTTP-прокси на порту 9000 с именем пользователя и паролем либо добавьте IP-адрес своего сервера в белый список и используйте socks5://res.hodlproxy.com:9001 без учётных данных.

Источник: https://hodlproxy.com/ru/guides/playwright-proxy
