GeekProxy в Selenium, Puppeteer и Playwright

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

Что нужно: активный план GeekProxy и данные прокси из кабинета. Настройка занимает минут десять.

Получить прокси

1 Перед началом

Все три инструмента управляют настоящим браузером, и прокси действует на всё, что этот браузер грузит: переходы, XHR и fetch, вебсокеты, медиа. Канал управления между скриптом и браузером остаётся локальным. Ваш собственный код на Python или Node вне браузера тоже не затронут; для него есть гайд по requests и curl.

Сложное место это авторизация. Когда прокси отвечает 407 Proxy Authentication Required, Chrome показывает диалог с логином и паролем. У Puppeteer и Playwright есть API, которое на него отвечает. У Selenium такого нет, поэтому реальный путь для Selenium это белый список IP на стороне GeekProxy и строка прокси без логина. Ещё два ограничения общие для всех троих, движки-то одни и те же.

  • SOCKS5 с логином и паролем не поддерживается. Мейнтейнер Playwright сказал прямо: socks5 с авторизацией наши браузеры не умеют, а у socks4 авторизации нет вообще. Берите HTTP с логином и паролем или SOCKS5 с белым списком IP
  • Ни один из трёх сам не подстраивает локаль, часовой пояс и геолокацию под IP прокси

Что понадобится

  • Активный план GeekProxy (резидентские, ISP или датацентр)
  • Данные прокси из кабинета: хост, порт, логин, пароль
  • Selenium 4 с Chrome, Puppeteer (здесь документация версии 25.16.0) или Playwright для Node или Python
Ваши данные доступа
  • Поле Откуда взять
  • Протокол HTTP (SOCKS5 только с белым списком IP)
  • Хост IP или имя шлюза из кабинета
  • Порт из кабинета
  • Логин из кабинета
  • Пароль из кабинета

2 Где взять данные прокси

  1. Войдите в кабинет GeekProxy
  2. Откройте план. У планов с оплатой за IP (датацентр, ISP) список адресов, порты, логин и пароль лежат прямо на карточке, а кнопка Export отдаёт весь список текстом
  3. У резидентских и мобильных планов нажмите Options. Панель Proxy Configuration соберёт строку логина с вашей страной, городом и настройками сессии. Готовую строку копируйте из Proxy List

Для Selenium понадобится ещё и белый список. Узнайте публичный IP машины, на которой крутится браузер, командой curl https://ipinfo.io/json, и добавьте его в план. API GeekProxy делает это одним вызовом: POST /api/proxy/update-options с полем allowed_ip для датацентровых планов за IP, POST /api/resident-proxy/allowed-ips/add для резидентских и мобильных. После этого строка прокси превращается в IP:PORT, без логина вовсе.

Кабинет GeekProxy, Subscriptions
Кабинет GeekProxy, страница Subscriptions: планы ISP со ссылкой Export, планы Residential Flex и Turbo с кнопками Options и Add GB

3 Selenium

Selenium передаёт прокси браузеру через W3C-capability proxy. Ключи: proxyType, httpProxy, sslProxy, socksProxy, socksVersion и noProxy, формат хоста host:port без схемы. На Python это выглядит так, IP уже в белом списке.

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

options = webdriver.ChromeOptions()
options.proxy = Proxy({
    'proxyType': ProxyType.MANUAL,
    'httpProxy': 'IP:PORT',
    'sslProxy': 'IP:PORT',
})

driver = webdriver.Chrome(options=options)
driver.get("https://ipinfo.io/json")
print(driver.find_element("tag name", "body").text)

В Java та же идея: proxy.setHttpProxy("host:port") и затем options.setCapability("proxy", proxy). Альтернатива это родной ключ Chrome: options.add_argument("--proxy-server=http://IP:PORT"). Поля для логина в синтаксисе Chromium нет. Для SOCKS пишут --proxy-server=socks5://IP:PORT, и Chromium советует добавить --host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE IP", чтобы DNS-префетчер перестал резолвить имена локально. --proxy-bypass-list уводит localhost из-под прокси.

selenium_proxy.py
Редактор: Selenium на Python с capability Proxy и адресом GeekProxy из белого списка

Если белый список невозможен: расширение

Общий раннер с плавающим IP в белый список не добавишь. Обход это крошечное расширение Chrome, которое само ставит прокси и само отвечает на запрос логина. Manifest V3 требует разрешения proxy, webRequest и webRequestAuthProvider, последнее обязательно для onAuthRequired. Слушатель работает в режиме asyncBlocking, потому что старое блокирующее разрешение в V3 обычным расширениям больше не выдают.

// manifest.json
{
  "manifest_version": 3,
  "name": "GeekProxy auth",
  "version": "1.0",
  "permissions": ["proxy", "webRequest", "webRequestAuthProvider"],
  "host_permissions": ["<all_urls>"],
  "background": { "service_worker": "background.js" }
}

// background.js
chrome.proxy.settings.set({
  value: {
    mode: "fixed_servers",
    rules: { singleProxy: { scheme: "http", host: "IP", port: PORT } }
  }
});

chrome.webRequest.onAuthRequired.addListener(
  (details, callback) => {
    callback({ authCredentials: { username: "LOGIN", password: "PASSWORD" } });
  },
  { urls: ["<all_urls>"] },
  ["asyncBlocking"]
);

Упакуйте папку в .crx и подключите через options.add_extension("proxy-auth.crx"). Сначала проверьте с окном браузера; грузятся ли расширения в новом headless-режиме, лучше убедиться на своей сборке Chrome.

manifest.json, расширение proxy-auth
Редактор: файл Manifest V3 с разрешениями proxy, webRequest и webRequestAuthProvider

В старых ответах ещё встречается selenium-wire. Проект сам пишет, что больше не поддерживается; репозиторий заархивирован 3 января 2024. Он поднимает локальный перехватывающий прокси со своим CA, и сайты видят другой TLS-отпечаток. Только как наследие.

4 Puppeteer

Puppeteer отдаёт прокси Chromium через args, а на логин отвечает методом page.authenticate(). Метод принимает { username, password }, вызывается на каждой странице до навигации и незаметно включает перехват запросов, что документация отмечает как цену по производительности. Чтобы выключить, передайте null.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    args: ['--proxy-server=http://IP:PORT'],
  });
  const page = await browser.newPage();
  await page.authenticate({ username: 'LOGIN', password: 'PASSWORD' });
  await page.goto('https://ipinfo.io/json');
  console.log(await page.evaluate(() => document.body.innerText));
  await browser.close();
})();

Один процесс браузера может держать несколько прокси. browser.createBrowserContext({ proxyServer, proxyBypassList }) даёт каждому контексту свой прокси и свой список исключений; логин и пароль по-прежнему идут через page.authenticate на каждой странице этого контекста. Это дешёвый способ гонять пять аккаунтов на пяти сессиях GeekProxy, не запуская пять Chrome.

puppeteer_proxy.js
Редактор: запуск Puppeteer с аргументом proxy-server и page.authenticate

5 Playwright

Playwright самый аккуратный из трёх. У опции proxy четыре поля: server, username, password и bypass, и документация прямо говорит, что для HTTP(S)-прокси можно задать логин и пароль. В server идёт http://host:port или socks5://host:port; короткая форма host:port считается HTTP. Опция ставится либо на браузер при запуске, либо на каждый контекст.

# Python
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://IP:PORT",
        "username": "LOGIN",
        "password": "PASSWORD",
    })
    page = browser.new_page()
    page.goto("https://ipinfo.io/json")
    print(page.inner_text("body"))
    browser.close()
// Node, свой прокси на каждый контекст
const browser = await chromium.launch();
const context = await browser.newContext({
  proxy: {
    server: 'http://IP:PORT',
    username: 'LOGIN',
    password: 'PASSWORD',
    bypass: 'localhost, 127.0.0.1',
  },
});

В Python это browser.new_context(proxy={...}). Прокси на контекст естественно ложится на sticky-сессии GeekProxy: один контекст на одну строку сессии, у каждого свои куки и свой выходной IP.

playwright_proxy.py
Редактор: запуск Playwright на Python с server, username и password прокси

6 Проверка работы

Каждый сниппет выше открывает https://ipinfo.io/json и печатает тело ответа. Сравните поле ip с той же страницей, открытой без прокси на той же машине. IP другой, значит вы прошли.

Несколько контекстов? Откройте один и тот же URL в каждом и положите ответы рядом. Два разных IP подтверждают, что прокси на контекст сработал. Если адрес один и тот же, прокси встал на браузер, а не на контекст, или оба контекста используют одну строку сессии.

7 Какой продукт GeekProxy подходит

Браузерной сессии нужен один и тот же выходной IP на всё время жизни кук, обычно от минут до часов, и репутация, которую принимают потребительские сайты. Это Residential Turbo со sticky-сессией от 1 до 1440 минут по HTTP или SOCKS5, либо Residential Flex со статической сессией от 1 до 120 минут, только TCP, с фильтром выхода Windows или Android для разовых задач. Аккаунты, которым нужен один IP неделями, живут на статическом ISP или датацентре IPv4. Для Puppeteer и Playwright берите HTTP-строки с логином и паролем. Для Selenium ставьте план на белый список IP, заодно там заработает и SOCKS5. Мобильные нужны целям, которые требуют именно операторскую сеть.

8 Частые проблемы

Chrome показывает диалог логина прокси или страница падает с ошибкой прокси

Selenium не умеет отвечать на 407. Добавьте IP раннера в белый список и уберите логин из строки прокси либо подключите расширение из раздела 3.

SOCKS5 с паролем не подключается

В Chromium нет авторизации SOCKS5, и мейнтейнеры Playwright говорят то же про свои браузеры. Перейдите на HTTP с логином и паролем или оставьте SOCKS5 и внесите IP в белый список.

Puppeteer получает 407 на первой странице

page.authenticate() вызван после goto() или на другой странице. Вызывайте его на каждой новой странице до первой навигации, в том числе внутри контекста, созданного с proxyServer.

Локальный dev-сервер перестал отвечать

Запросы к localhost уходят через прокси. Добавьте bypass в Playwright, proxyBypassList в Puppeteer или --proxy-bypass-list в Chrome.

С SOCKS-прокси в Chrome утекают DNS-запросы

DNS-префетчер Chrome резолвит имена локально независимо от --proxy-server. Добавьте --host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE IP", как советует Chromium.

Сайт всё равно видит мой настоящий IP

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

Не получается? Напишите нам в Telegram, Discord или в чат на сайте. Обычно отвечаем в течение нескольких минут.

Прокси для автоматизации браузера

Sticky-сессии резидентских по HTTP или статические ISP и датацентр, выдача за секунды.

Заказать

We use cookies to improve user experience. By clicking "Yes, I agree", you consent to this use of cookies.

Привилегия первых: В честь глобального запуска [мы даем скидку 50%+] на все датацентр тарифы. Эксклюзивное предложение для наших стартовых партнеров.