Прокси в Playwright: браузерная автоматизация
Playwright от Microsoft — современная альтернатива Puppeteer и Selenium с нативной поддержкой прокси на уровне browser context. Один context — один IP, изолированные cookies и storage. Это удобно для параллельных воркеров с разными адресами NEONPROXY. Ниже — конфигурации для Python и Node.js. Используйте прокси только для задач, разрешённых robots.txt и Terms of Service сайтов.
HTTP-прокси в Python
Playwright принимает proxy dict при создании context — с username и password без костылей:
from playwright.sync_api import sync_playwright
PROXY = {
"server": "http://123.45.67.89:8080",
"username": "your_login",
"password": "your_password"
}
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(proxy=PROXY)
page = context.new_page()
page.goto("https://api.ipify.org?format=json")
print(page.content())
context.close()
browser.close()
Сверьте IP с результатом «Мой IP» при работе через тот же прокси в браузере.
SOCKS5
Укажите схему socks5:// в поле server:
PROXY = {
"server": "socks5://123.45.67.89:1080",
"username": "your_login",
"password": "your_password"
}
context = browser.new_context(proxy=PROXY)
Сравнение протоколов — SOCKS5 vs HTTPS.
Node.js: launch с proxy
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true,
proxy: {
server: 'http://123.45.67.89:8080',
username: 'your_login',
password: 'your_password'
}
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Proxy на launch наследуют все context'ы. Для разных IP на воркер создавайте отдельные context с разными proxy dict.
Параллельные context и ротация
Playwright эффективен при параллельном парсинге: каждый context = свой IP из пула:
import asyncio
from playwright.async_api import async_playwright
PROXIES = [
{"server": "http://1.2.3.4:8080", "username": "u", "password": "p"},
{"server": "http://5.6.7.8:8080", "username": "u", "password": "p"},
]
async def fetch(url, proxy):
async with async_playwright() as p:
browser = await p.chromium.launch()
context = await browser.new_context(proxy=proxy)
page = await context.new_page()
await page.goto(url)
title = await page.title()
await browser.close()
return title
async def main():
tasks = [fetch("https://example.com", px) for px in PROXIES]
print(await asyncio.gather(*tasks))
Стратегии ротации и sticky session — в гайде по ротации.
Отладка
При ошибке net::ERR_PROXY_CONNECTION_FAILED проверьте прокси в чекере. Playwright сохраняет HAR и скриншоты — включите record_har_path для диагностики. Для простых GET без JS достаточно requests или Scrapy.
Firefox и WebKit
Тот же объект proxy работает с p.firefox.launch() и p.webkit.launch(). Для большинства scraping-задач хватает Chromium.
Интеграция с API
Подгружайте список прокси из API NEONPROXY при старте. Выбор типа адреса — как выбрать прокси. Сравнение с Puppeteer — отдельный гайд. Заказ — здесь.