Настройка прокси в Playwright для Python и Node.js выполняется через опцию proxy при запуске экземпляра браузера, позволяя маршрутизировать весь сетевой трафик через указанный прокси-сервер.
Основы настройки прокси в Playwright
Playwright поддерживает конфигурацию прокси на уровне браузера. Все запросы, исходящие из запущенного экземпляра браузера, будут проходить через настроенный прокси-сервер, если иное не указано в опциях обхода.
Почему используют прокси в Playwright?
- Геотаргетинг: Доступ к контенту, ограниченному географическим положением, путем использования прокси-серверов в нужных регионах.
- Обход ограничений: Преодоление лимитов запросов, блокировок IP-адресов или других ограничений, накладываемых целевыми веб-сайтами.
- Анонимность и безопасность: Скрытие реального IP-адреса клиента, повышение анонимности при веб-скрапинге или тестировании.
- Тестирование: Проверка поведения приложения при работе через прокси.
Поддерживаемые типы прокси
Playwright поддерживает следующие типы прокси:
- HTTP/HTTPS
- SOCKS5
Базовая конфигурация прокси
Для настройки прокси используется объект proxy в параметрах browserType.launch().
Python
from playwright.sync_api import sync_playwright
def setup_basic_proxy_python(proxy_url: str):
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": proxy_url # e.g., "http://192.168.1.1:8080"
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
# Пример использования
# setup_basic_proxy_python("http://192.168.1.1:8080")
Node.js
const { chromium } = require('playwright');
async function setupBasicProxyNode(proxyUrl) {
const browser = await chromium.launch({
proxy: {
server: proxyUrl // e.g., "http://192.168.1.1:8080"
}
});
const page = await browser.newPage();
await page.goto("https://httpbin.org/ip");
console.log(await page.content());
await browser.close();
}
// Пример использования
// setupBasicProxyNode("http://192.168.1.1:8080");
Конфигурация прокси с аутентификацией
Для прокси-серверов, требующих аутентификации, учетные данные могут быть предоставлены непосредственно в URL прокси или с использованием отдельных полей username и password.
Включение учетных данных в URL
Это наиболее распространенный способ.
Python
from playwright.sync_api import sync_playwright
def setup_auth_proxy_url_python(proxy_url_with_auth: str):
# proxy_url_with_auth: e.g., "http://user:password@192.168.1.1:8080"
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": proxy_url_with_auth
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
# Пример использования
# setup_auth_proxy_url_python("http://proxyuser:proxypass@192.168.1.1:8080")
Node.js
const { chromium } = require('playwright');
async function setupAuthProxyUrlNode(proxyUrlWithAuth) {
// proxyUrlWithAuth: e.g., "http://user:password@192.168.1.1:8080"
const browser = await chromium.launch({
proxy: {
server: proxyUrlWithAuth
}
});
const page = await browser.newPage();
await page.goto("https://httpbin.org/ip");
console.log(await page.content());
await browser.close();
}
// Пример использования
// setupAuthProxyUrlNode("http://proxyuser:proxypass@192.168.1.1:8080");
Использование отдельных полей для учетных данных
Это может быть полезно, когда учетные данные извлекаются из переменных окружения или других источников.
Python
from playwright.sync_api import sync_playwright
def setup_auth_proxy_fields_python(host: str, port: int, username: str, password: str):
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": f"http://{host}:{port}",
"username": username,
"password": password
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
# Пример использования
# setup_auth_proxy_fields_python("192.168.1.1", 8080, "proxyuser", "proxypass")
Node.js
const { chromium } = require('playwright');
async function setupAuthProxyFieldsNode(host, port, username, password) {
const browser = await chromium.launch({
proxy: {
server: `http://${host}:${port}`,
username: username,
password: password
}
});
const page = await browser.newPage();
await page.goto("https://httpbin.org/ip");
console.log(await page.content());
await browser.close();
}
// Пример использования
// setupAuthProxyFieldsNode("192.168.1.1", 8080, "proxyuser", "proxypass");
Обход прокси (Bypass)
Опция bypass позволяет указать список хостов или доменов, для которых трафик не должен проходить через прокси-сервер. Это полезно для локальных ресурсов или специфических доменов, которые не требуют проксирования.
Список bypass представляет собой массив строк, где каждая строка может быть:
* Полным именем хоста (например, localhost).
* Шаблоном с подстановочными знаками (например, *.example.com).
* Специальными значениями (например, <local> для всех локальных адресов).
Python
from playwright.sync_api import sync_playwright
def setup_proxy_with_bypass_python(proxy_url: str, bypass_domains: list):
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": proxy_url,
"bypass": bypass_domains # e.g., ["localhost", "*.internal-domain.com"]
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip") # Пройдет через прокси
page.goto("http://localhost:8000") # Не пройдет через прокси, если localhost в bypass
print(page.content())
browser.close()
# Пример использования
# setup_proxy_with_bypass_python("http://192.168.1.1:8080", ["localhost", "*.myinternal.net"])
Node.js
const { chromium } = require('playwright');
async function setupProxyWithBypassNode(proxyUrl, bypassDomains) {
const browser = await chromium.launch({
proxy: {
server: proxyUrl,
bypass: bypassDomains // e.g., ["localhost", "*.internal-domain.com"]
}
});
const page = await browser.newPage();
await page.goto("https://httpbin.org/ip"); // Пройдет через прокси
await page.goto("http://localhost:8000"); // Не пройдет через прокси, если localhost в bypass
console.log(await page.content());
await browser.close();
}
// Пример использования
// setupProxyWithBypassNode("http://192.168.1.1:8080", ["localhost", "*.myinternal.net"]);
Использование SOCKS5 прокси
Playwright также поддерживает SOCKS5 прокси. Для этого достаточно указать схему socks5:// в URL прокси.
Python
from playwright.sync_api import sync_playwright
def setup_socks5_proxy_python(socks5_proxy_url: str):
# socks5_proxy_url: e.g., "socks5://192.168.1.1:1080"
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": socks5_proxy_url
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
# Пример использования
# setup_socks5_proxy_python("socks5://user:pass@192.168.1.1:1080")
Node.js
const { chromium } = require('playwright');
async function setupSocks5ProxyNode(socks5ProxyUrl) {
// socks5ProxyUrl: e.g., "socks5://192.168.1.1:1080"
const browser = await chromium.launch({
proxy: {
server: socks5ProxyUrl
}
});
const page = await browser.newPage();
await page.goto("https://httpbin.org/ip");
console.log(await page.content());
await browser.close();
}
// Пример использования
// setupSocks5ProxyNode("socks5://user:pass@192.168.1.1:1080");
Управление несколькими прокси и ротация
Playwright настраивает прокси на уровне экземпляра браузера. Для использования разных прокси для разных запросов или сессий необходимо запускать отдельные экземпляры браузера для каждого прокси или реализовать логику ротации прокси на уровне вашего приложения.
Ротация прокси
Пример простой ротации прокси из списка.
Python
from playwright.sync_api import sync_playwright
import itertools
def rotate_proxies_python(proxy_list: list, num_sessions: int):
proxy_cycle = itertools.cycle(proxy_list)
for i in range(num_sessions):
current_proxy = next(proxy_cycle)
print(f"Запуск сессии {i+1} с прокси: {current_proxy}")
with sync_playwright() as p:
try:
browser = p.chromium.launch(
proxy={
"server": current_proxy
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(f"IP для сессии {i+1}: {page.inner_text('body')}")
browser.close()
except Exception as e:
print(f"Ошибка при использовании прокси {current_proxy}: {e}")
# Пример использования
# proxy_servers = [
# "http://user1:pass1@proxy1.example.com:8080",
# "http://user2:pass2@proxy2.example.com:8080",
# "http://user3:pass3@proxy3.example.com:8080",
# ]
# rotate_proxies_python(proxy_servers, 5)
Node.js
const { chromium } = require('playwright');
async function rotateProxiesNode(proxyList, numSessions) {
let proxyIndex = 0;
for (let i = 0; i < numSessions; i++) {
const currentProxy = proxyList[proxyIndex % proxyList.length];
console.log(`Запуск сессии ${i+1} с прокси: ${currentProxy}`);
try {
const browser = await chromium.launch({
proxy: {
server: currentProxy
}
});
const page = await browser.newPage();
await page.goto("https://httpbin.org/ip");
console.log(`IP для сессии ${i+1}: ${await page.innerText('body')}`);
await browser.close();
} catch (e) {
console.error(`Ошибка при использовании прокси ${currentProxy}: ${e.message}`);
}
proxyIndex++;
}
}
// Пример использования
// const proxyServers = [
// "http://user1:pass1@proxy1.example.com:8080",
// "http://user2:pass2@proxy2.example.com:8080",
// "http://user3:pass3@proxy3.example.com:8080",
// ];
// rotateProxiesNode(proxyServers, 5);
Устранение неполадок с прокси
При возникновении проблем с прокси-сервером в Playwright рассмотрите следующие шаги:
- Проверка доступности прокси: Убедитесь, что прокси-сервер доступен и работает, используя инструменты командной строки (например,
curlилиwgetс опцией--proxy). - Правильность учетных данных: Перепроверьте имя пользователя и пароль для прокси, если требуется аутентификация.
- Формат URL: Убедитесь, что URL прокси указан в правильном формате (
http://host:port,https://host:port,socks5://host:port). - Playwright логи: Включите подробные логи Playwright для диагностики сетевых запросов.
- Node.js: Установите переменную окружения
DEBUG=pw:browser. - Python: Используйте
loggingмодуль или установитеPWDEBUG=1для открытия инспектора.
- Node.js: Установите переменную окружения
- Целевой сайт: Проверьте, доступен ли целевой сайт без прокси, чтобы исключить проблемы с сайтом.
- Брандмауэр: Убедитесь, что брандмауэр на вашей машине или на сервере не блокирует исходящие соединения к прокси-серверу.
Сравнение настройки прокси
| Функция / Язык | Python | Node.js |
|---|---|---|
| Базовый прокси | p.chromium.launch(proxy={"server": "http://host:port"}) |
chromium.launch({ proxy: { server: "http://host:port" } }) |
| Прокси с Auth (URL) | p.chromium.launch(proxy={"server": "http://user:pass@host:port"}) |
chromium.launch({ proxy: { server: "http://user:pass@host:port" } }) |
| Прокси с Auth (поля) | p.chromium.launch(proxy={"server": "http://host:port", "username": "user", "password": "pass"}) |
chromium.launch({ proxy: { server: "http://host:port", username: "user", password: "pass" } }) |
| Обход прокси | p.chromium.launch(proxy={"server": "...", "bypass": ["localhost", "*.domain.com"]}) |
chromium.launch({ proxy: { server: "...", bypass: ["localhost", "*.domain.com"] } }) |
| SOCKS5 прокси | p.chromium.launch(proxy={"server": "socks5://host:port"}) |
chromium.launch({ proxy: { server: "socks5://host:port" } }) |