Настройка прокси Patchright: запуск, контексты, аутентификация и Docker
Patchright устраняет утечки CDP, которые выявляют Playwright до запуска браузера. Он не затрагивает репутацию вашего IP — и его рекомендуемая скрытая настройка тихо изменяет способ ротации прокси.
Patchright — это исправленная, незамеченная сборка Playwright, которая работает как замена: измените импорт, оставьте код. Патчи применяются до запуска процесса браузера — они удаляют флаги автоматизации и вызовы Chrome DevTools Protocol, которые позволяют сайту идентифицировать сессию Playwright в первые несколько миллисекунд. Они не затрагивают сеть. Каждый вопрос о прокси Patchright сводится к этому разделению и к одной детали, которую README скрывает: настройка, рекомендованная проектом для максимальной скрытности, — это постоянный контекст, который тихо изменяет способ ротации выходов. Это руководство, ориентированное на прокси — запуск против контекста, аутентифицированные шлюзы, Docker и честный отчет о потолке.
Установка и прокси по умолчанию
Patchright поставляется для Python, Node и .NET и патчит только Chromium — Firefox и WebKit явно не поддерживаются. Установите его и загрузите настоящий Google Chrome, а не встроенный Chromium, который проект рекомендует для скрытности:
pip install patchright
patchright install chrome
# Node: npm i patchright && npx patchright install chrome
API прокси — это Playwright, без изменений, потому что прокси — это одна из немногих вещей, которые Patchright намеренно оставляет без изменений. Учетные данные помещаются в специальные поля, никогда не внутри URL сервера — поэтому аутентифицированные прокси здесь не нуждаются в расширении, в отличие от Selenium или чистого Puppeteer:
from patchright.sync_api import sync_playwright
PROXY = {
"server": "http://gate.quantumproxies.io:PORT",
"username": "USER",
"password": "PASS",
}
with sync_playwright() as p:
browser = p.chromium.launch(channel="chrome", proxy=PROXY)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body")) # the exit IP
browser.close()
Это весь ответ на вопрос "поддерживает ли Patchright прокси": да, идентично оригинальному Playwright, включая список bypass и особенность Chromium, что адреса loopback полностью обходят прокси — так что тестирование на локальном макетном сервере всегда будет выглядеть так, будто прокси игнорируется. Если вы новичок в базовой модели, наше руководство по интеграции прокси Playwright охватывает базовое поведение, а карта прокси антидетект-фреймворков сравнивает, какие стеки принимают учетные данные нативно.
Прокси для каждого контекста и глобальный заглушка
Контексты — это дешевая единица ротации: отдельные куки, хранилище и кэш, создаваемые за миллисекунды вместо секунд, которые стоят запуск браузера. Каждый из них принимает свою собственную опцию proxy, так что один процесс может удерживать идентичность США и идентичность Германии одновременно. Есть одна задокументированная особенность Playwright, которая сбивает людей с толку здесь — браузер должен быть запущен с глобальным прокси, чтобы прокси для каждого контекста работали на Chromium. Если каждый контекст переопределяет его, глобальное значение никогда не используется и может быть любой строкой-заполнителем:
const { chromium } = require('patchright');
(async () => {
// the global proxy is never used — it only enables the per-context option
const browser = await chromium.launch({
channel: 'chrome',
proxy: { server: 'http://per-context' },
});
for (const job of jobs) {
const context = await browser.newContext({
proxy: {
server: 'http://gate.quantumproxies.io:PORT',
username: 'USER-country-' + job.country, // geo in the username
password: 'PASS',
},
});
const page = await context.newPage();
try {
await page.goto(job.url, { timeout: 30000 });
// ...extract...
} finally {
await context.close(); // burns the cookies with the exit
}
}
await browser.close();
})();
Указанный на ротационный шлюз, каждый контекст выходит с другого адреса в пуле из более чем 90 миллионов резидентных адресов без управления списком с вашей стороны — это то, что делают ротационные прокси на стороне сервера. Обратите внимание, где находятся элементы управления гео и сессией в этом фрагменте: в имени пользователя, а не в пользовательском заголовке. Это имеет большее значение в Patchright, чем в обычном Playwright, потому что руководство проекта — избегать пользовательских заголовков и переопределений user-agent, поскольку внедренные значения сами по себе являются поверхностью обнаружения. Управление параметрами через имя пользователя сохраняет форму запроса браузера нетронутой.

Компромисс постоянного контекста
Рекомендуемая конфигурация скрытности Patchright — это не launch(). Это launch_persistent_context() с реальным каналом Chrome, каталогом пользовательских данных, без переопределения viewport и в режиме с интерфейсом — и явно без пользовательских заголовков или поддельного user-agent. Эта настройка также сохраняет любые куки разрешения, которые предоставляет вам вызов, так что решенный вызов может быть повторно использован в разных запусках. Следствие для прокси структурное: постоянный контекст есть контекст. Нет newContext(), чтобы повесить второй прокси, так что один процесс равен одной идентичности выхода.
from patchright.sync_api import sync_playwright
with sync_playwright() as p:
ctx = p.chromium.launch_persistent_context(
user_data_dir="profiles/it-01", # one profile per identity
channel="chrome",
headless=False,
no_viewport=True,
proxy={
"server": "http://gate.quantumproxies.io:PORT",
"username": "USER-country-it-session-it01", # sticky, pinned to the profile
"password": "PASS",
},
# do NOT pass user_agent or extra_http_headers here
)
page = ctx.new_page()
page.goto("https://example.com")
ctx.close()
Таким образом, ротация становится решением на уровне процесса: один каталог профиля на идентичность, одна закрепленная сессия, привязанная к нему, и пул рабочих вместо цикла контекста. Сохраняйте стабильность пары — профиль, который накопил куки за итальянским выходом, а затем появляется за бразильским, является противоречием, которое никакой патч CDP не может скрыть. Практическое правило: называйте каталог по идентификатору сессии, удаляйте каталог, когда вы сжигаете сессию, и никогда не делитесь профилем между двумя выходами.
Запуск Patchright в Docker за прокси
Контейнеризация скрытого браузера имеет две ловушки, и обе имеют последствия для прокси. Первая — это --no-sandbox: обычное исправление для Chrome, отказывающегося запускаться от имени root, и флаг, который антибот-вендоры с удовольствием читают. Запускайте от имени пользователя, не являющегося root. Вторая — это режим без интерфейса — проект рекомендует с интерфейсом, поэтому используйте виртуальный дисплей, а не переключатель без интерфейса:
# Dockerfile
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
xvfb ca-certificates && rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir patchright \
&& patchright install --with-deps chrome
RUN useradd -m app
USER app
WORKDIR /home/app
COPY --chown=app:app scrape.py .
# headed under a virtual display: no --no-sandbox, no HeadlessChrome tell
CMD ["xvfb-run", "-a", "python", "scrape.py"]
# build & run:
# docker build -t patchright-worker .
# docker run --ipc=host --shm-size=1g patchright-worker
--ipc=host и увеличенный /dev/shm — это стандартные исправления для Chromium в Docker для предотвращения сбоев вкладок под нагрузкой, прямо из документации по контейнерам Playwright. Одна специфическая для прокси ловушка: если вы запускаете локальный реле для добавления учетных данных к SOCKS5 конечной точке, 127.0.0.1 внутри контейнера — это контейнер, а не ваш хост. Либо поместите реле в тот же контейнер, адресуйте хост явно, либо запустите реле как сайдкар в общей сети. И храните каталог профиля на томе, если вы используете постоянные контексты, иначе каждый перезапуск контейнера выбрасывает куки разрешения, которые вы заработали, потратив полосу пропускания.
Что покрывают патчи и что они никогда не исправят
Стоит точно знать, что вы покупаете. Главный фикс Patchright — это утечка Runtime.enable — он запускает JavaScript в изолированных контекстах выполнения вместо включения домена, который выдает игру. Он отключает API консоли, чтобы закрыть Console.enable (поэтому логирование page.on("console") исчезает, что является реальной стоимостью, когда вы отлаживаете сбой прокси). Он переписывает флаги по умолчанию Playwright: добавляет --disable-blink-features=AutomationControlled, удаляет --enable-automation, и возвращает --disable-popup-blocking, --disable-component-update, --disable-default-apps и --disable-extensions. Он также достигает закрытых теневых корней с помощью обычных локаторов.
Читайте этот список флагов как строку расходов на полосу пропускания. Восстановление обновлений компонентов и приложений по умолчанию означает браузер, который звонит домой в фоновом режиме — через ваш измеряемый выход. Измерьте передачу сессии перед масштабированием и блокируйте типы ресурсов изображения, шрифта и медиа на контексте, чтобы снизить стоимость на страницу. Ничто из этого не касается другой стены: исправленный браузер на сгоревшем IP-адресе центра обработки данных все еще остается сгоревшим IP, и запрос отклоняется по репутации до того, как будет оценена вся эта хитрость. Проверьте адрес с помощью бесплатного проверщика качества IP перед тем, как заключить, что патчи не сработали, и поместите резидентные прокси под браузер, чтобы два уровня решали разные проблемы.

Часто задаваемые вопросы
Как установить прокси в Patchright?
Точно так же, как в Playwright: передайте proxy={"server": "http://host:port", "username": "USER", "password": "PASS"} в chromium.launch(), launch_persistent_context() или new_context(). Patchright не патчит слой прокси, поэтому все поведение оригинала — список обхода, исключение loopback — применяется без изменений.
Поддерживает ли Patchright аутентификацию прокси SOCKS5?
Нет, и это ограничение Chromium, а не Patchright: у Chromium нет механизма для учетных данных SOCKS, поэтому аутентифицированные конечные точки SOCKS5 не работают. Используйте HTTP-порт того же шлюза с полями имени пользователя и пароля или аутентифицируйтесь по белому списку IP и сохраняйте схему SOCKS5 — каждый план QuantumProxies поддерживает белый список как альтернативу user:pass. Полный набор обходных решений находится в нашем руководстве по аутентификации прокси SOCKS5 для Playwright, которое применяется здесь без изменений.
Может ли Patchright использовать разные прокси для каждого контекста?
Да, если вы запустили браузер с глобальным значением прокси — даже заполнителем — потому что Chromium включает прокси для каждого контекста, когда один присутствует при запуске. Исключение — настройка постоянного контекста, которую Patchright рекомендует для скрытности: это дает вам один контекст, поэтому ротация означает отдельный процесс с собственным каталогом профиля.
Patchright поддерживает только Chromium?
Да. Проект прямо заявляет, что патчатся только браузеры на основе Chromium; Firefox и WebKit не поддерживаются. Если вам нужна скрытность на движке Firefox с гео, полученным от выхода прокси, это другой инструмент — см. наше руководство по прокси и geoip для Camoufox.
Продолжают ли меня блокировать с Patchright?
На сложных целях, да. Независимые тесты показывают, что режим без интерфейса все еще утечивает признак HeadlessChrome, и страницы вызовов, которые достигает исправленный браузер, но не может очистить. Патчи закрывают дешевые проверки автоматизации; репутация IP, отпечатки TLS и решение вызовов — это отдельные проблемы, требующие отдельных решений.
Относитесь к Patchright как к тому, чем он является: очень хорошим исправлением для одного конкретного класса утечек, предоставленным без необходимости переписывать строку Playwright. Сочетайте его с выходами, которые чисты, устойчивы там, где важна идентичность, и проверены перед запуском — тогда оставшиеся неудачи действительно касаются цели, а не вашей настройки. Это техническое руководство, а не юридическая консультация: автоматизируйте в рамках закона и условий сайта.