GeekProxy в nodriver

nodriver это официальный преемник undetected-chromedriver: без webdriver, без Selenium, напрямую по CDP с Chrome. Заодно он решил то, что предшественник так и не осилил: прокси с логином и паролем, причём на каждый контекст браузера отдельно. В гайде оба способа задать прокси, как встроенный форвардер заставляет работать логин и пароль, и где тут место SOCKS5.

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

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

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

nodriver управляет настоящим Chrome, поэтому прокси действует на всё, что грузит проксированный контекст: страницы, XHR, вебсокеты, медиа. Ваш Python-код вне браузера не затронут; вызовы requests или httpx в том же скрипте идут напрямую. Механизма два, и логин с паролем понимает только один.

  • browser_args=["--proxy-server=..."] ставит прокси на весь браузер. У ключа Chromium нет поля для логина, так что это вариант для планов с белым списком IP
  • browser.create_context(proxy_server="...") даёт одной вкладке свой прокси и принимает http://LOGIN:PASSWORD@IP:PORT. В докстринге параметр помечен как экспериментальный, но это и есть задокументированный путь

SOCKS5 с логином и паролем: по документации поддерживается через тот же форвардер, причём в двух написаниях, socks:// в докстринге и socks5:// в quickstart. В issue #29 ровно с такой формой сообщали про ERR_TIMED_OUT, и в марте 2026 его закрыли без пометки об исправлении. Ставить на это проект мы бы не стали. Рекомендуем HTTP с логином и паролем, запасной вариант SOCKS5 без логина плюс белый список.

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

  • Активный план GeekProxy (резидентские, ISP или датацентр)
  • Данные прокси из кабинета: хост, порт, логин, пароль
  • pip install nodriver и установленный Chrome или другой браузер на Chromium; Windows, macOS или Linux
Ваши данные доступа
  • Поле Откуда взять
  • Протокол HTTP (SOCKS5 лучше с белым списком IP)
  • Хост IP или имя шлюза из кабинета
  • Порт из кабинета
  • Логин из кабинета
  • Пароль из кабинета

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

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

Форвардер разбирает URL прокси через urllib.parse.urlparse, поэтому @, : и / внутри пароля кодируются процентами. На каждый контекст браузера собирайте свой sticky-логин: session_id у Turbo или session_time у Flex, подробнее в следующем шаге.

ipinfo.io/json
Кабинет GeekProxy, страница Subscriptions: планы ISP со ссылкой Export, планы Residential Flex и Turbo с кнопками Options и Add GB
Кабинет GeekProxy, Residential Flex
Подписка Residential Flex, панель Proxy Configuration: континент, ASN, ZIP, регион, ОС устройства, тип прокси и TTL сессии, ниже готовая строка curl

3 Весь браузер, белый список IP

README и quickstart показывают browser_args как обычный список ключей Chromium. Положите туда --proxy-server, и каждая вкладка браузера пойдёт через прокси. Ответить на 407 от прокси Chrome здесь не может, так что форма работает только при IP машины в белом списке плана и строке без логина.

import nodriver as uc

async def main():
    browser = await uc.start(browser_args=["--proxy-server=http://IP:PORT"])
    page = await browser.get("https://ipinfo.io/json")
    await page.sleep(3)
    print(await page.get_content())

uc.loop().run_until_complete(main())

Сначала узнайте публичный IP машины через curl https://ipinfo.io/json и внесите его в план. Для SOCKS5 ключ пишется --proxy-server=socks5://IP:PORT; DNS-префетчер Chrome в этом случае резолвит имена локально, пока не добавите --host-resolver-rules. Это замечание Chromium, а не nodriver.

nodriver_whitelist.py
Редактор: nodriver запущен с ключом proxy-server в browser_args, без логина, IP в белом списке

4 Прокси на контекст, с логином и паролем

Раздел quickstart называется "Proxies (socks5, authenticated too)". Его суть в одной строке: создавайте сколько угодно контекстов браузера, каждый со своим прокси, тогда как обычно Chrome позволяет один прокси на браузер. Метод называется browser.create_context(), а докстринг перечисляет форматы: http://USERNAME:PASSWORD@SERVER:PORT для HTTP- и HTTPS-прокси, socks://USERNAME:PASSWORD@SERVER:PORT для SOCKS. Сниппет в quickstart напечатан с ломаным синтаксисом, так что вот рабочая форма.

import nodriver as uc

async def main():
    browser = await uc.start()
    tab = await browser.create_context(
        url="https://ipinfo.io/json",
        proxy_server="http://LOGIN:PASSWORD@IP:PORT",
        proxy_bypass_list=["localhost"],
    )
    await tab.sleep(3)
    print(await tab.get_content())

uc.loop().run_until_complete(main())

Дальше работайте с тем tab, который вернул create_context. Собственный get() браузера относится к контексту по умолчанию, а там прокси нет. В сигнатуре есть ещё new_tab, new_window (по умолчанию True, каждый контекст открывает своё окно), dispose_on_detach и proxy_ssl_context для прокси, которые сами говорят по TLS; портам GeekProxy он не нужен.

Пять аккаунтов, пять прокси, один процесс Chrome: пять вызовов create_context с пятью sticky-логинами. На эту возможность мейнтейнер и указал, закрывая issue #4 в марте 2025, после года просьб ровно об этом.

tab_a = await browser.create_context(
    url="https://ipinfo.io/json",
    proxy_server="http://LOGIN:PASSWORD@IP:PORT",   # логин с session_id A
)
tab_b = await browser.create_context(
    url="https://ipinfo.io/json",
    proxy_server="http://LOGIN:PASSWORD@IP:PORT",   # логин с session_id B
)
nodriver_context.py
Редактор: nodriver create_context с proxy_server, в котором логин и пароль GeekProxy

Как на самом деле работает логин

CDP-команда Target.createBrowserContext принимает строку proxyServer с тем же синтаксисом, что и ключ командной строки, так что пароль туда тоже не положить. nodriver обходит это локальным форвардером. Когда в URL есть логин и пароль, ProxyForwarder берёт свободный порт на 127.0.0.1, поднимает asyncio-сервер и отдаёт Chrome адрес http://127.0.0.1:<port>. Chrome шлёт ему CONNECT без авторизации, форвардер открывает соединение с апстримом и сам добавляет логин и пароль. Нет логина в URL, нет и форвардера: строка уходит в Chrome как есть.

Из этой конструкции следуют три вещи. Форвардер принимает только CONNECT и на всё остальное отвечает 400, поэтому обычные сайты http:// через авторизованный прокси это непроверенная территория; попробуйте один, прежде чем на это рассчитывать. Форвардер живёт внутри вашего Python-процесса, и с выходом скрипта путь через прокси умирает. И он пишет полный URL прокси вместе с паролем в лог на уровне INFO. Поднимите уровень логирования или вычищайте логи перед тем, как кому-то их показать.

Ключ самого Chrome это другой механизм. --proxy-server в browser_args с логином внутри форвардер не получит, Chrome просто покажет свой диалог авторизации. Логин и пароль только в create_context.

5 Что изменилось после undetected-chromedriver

README формулирует родословную прямо: nodriver это официальный преемник undetected-chromedriver, без webdriver и без Selenium посередине. Прямое общение по CDP даёт лучшую устойчивость к файрволам веб-приложений и большой прирост скорости, модуль полностью асинхронный, а файлы профиля он за собой подчищает.

В части прокси разница больше, чем даёт понять README. README самого undetected-chromedriver показывает только opts.add_argument(f'--proxy-server=socks5://127.0.0.1:9050'), прокси без логина. Авторизованный прокси там требовал расширения-помощника или обработчика CDP Fetch.authRequired, и то и другое самодельные обходы. create_context(proxy_server=...) заменяет всё это и добавляет по прокси на контекст в одном процессе браузера. Переносите скрипт с UC? Первым делом удалите код расширения.

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

Каждый сниппет выше открывает https://ipinfo.io/json и печатает страницу. Поле ip должно показать адрес прокси, а не ваш. На ISP или датацентре это адрес из кабинета, на Residential или Turbo любой адрес из пула в выбранной стране.

С двумя контекстами откройте один URL в обоих окнах и сравните. Два разных IP доказывают, что прокси на контекст сработал. Одинаковый IP в обоих значит, что логины делят один session id, либо одна из вкладок открыта через browser.get(), а не через create_context().

Chrome, два контекста nodriver
Вкладка браузера с ipinfo.io/json: поля ip, city, country и org описывают выходной адрес прокси

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

Сессия nodriver это браузерная сессия на потребительском сайте, ей нужен резидентский выход, который не меняется, пока живут куки. Residential Turbo со sticky session_id и session_time до 1440 минут по HTTP это выбор по умолчанию. Residential Flex с session_time до 120 минут и фильтром -os-windows подходит под отпечаток десктопного Chrome на коротких задачах. Аккаунты, которым неделями нужен один IP, живут на статическом ISP или датацентре IPv4, по адресу на контекст; с белым списком IP форвардер вообще выпадает из схемы. Мобильные нужны для чисто мобильных сценариев. SOCKS5 здесь ничего не добавляет.

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

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

Логин попал в browser_args, а там Chromium его игнорирует. Перенесите прокси в create_context(proxy_server=...) либо внесите IP в белый список и уберите логин.

Страница грузится с моим настоящим IP

Вы перешли через browser.get(), а он открывает контекст по умолчанию. Берите вкладку, которую вернул create_context(), с url= или её собственным get().

ERR_TIMED_OUT с socks5://LOGIN:PASSWORD@IP:PORT

Известный репорт, закрыт без пометки об исправлении. Переключите тот же план на HTTP-порт с логином или оставьте SOCKS5 и внесите IP в белый список.

Пароль виден в логе

Форвардер пишет URL прокси на уровне INFO. Поднимите уровень логирования для nodriver или вычищайте пароль, прежде чем куда-то вставлять логи.

Ошибка пароля, хотя пароль верный

Спецсимволы. Закодируйте процентами @, : и / в пароле, URL проходит через urlparse.

Обычный сайт http:// не открывается через авторизованный прокси

Форвардер понимает только CONNECT. Такие сайты проверяйте отдельно или ведите их через план с белым списком и browser_args.

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

Прокси для nodriver

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

Заказать

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

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