GeekProxy в nodriver
nodriver это официальный преемник undetected-chromedriver: без webdriver, без Selenium, напрямую по CDP с Chrome. Заодно он решил то, что предшественник так и не осилил: прокси с логином и паролем, причём на каждый контекст браузера отдельно. В гайде оба способа задать прокси, как встроенный форвардер заставляет работать логин и пароль, и где тут место SOCKS5.
Что нужно: активный план GeekProxy и данные прокси из кабинета. Настройка занимает минут пять.
Получить прокси1 Перед началом
nodriver управляет настоящим Chrome, поэтому прокси действует на всё, что грузит проксированный контекст: страницы, XHR, вебсокеты, медиа. Ваш Python-код вне браузера не затронут; вызовы requests или httpx в том же скрипте идут напрямую. Механизма два, и логин с паролем понимает только один.
browser_args=["--proxy-server=..."]ставит прокси на весь браузер. У ключа Chromium нет поля для логина, так что это вариант для планов с белым списком IPbrowser.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 Где взять данные прокси
- Войдите в кабинет GeekProxy
- Откройте план. У планов с оплатой за IP (датацентр, ISP) список адресов, порты, логин и пароль лежат прямо на карточке, а кнопка Export отдаёт весь список текстом
- У резидентских и мобильных планов нажмите Options. Панель Proxy Configuration соберёт строку логина с вашей страной, городом и настройками сессии. Готовую строку копируйте из Proxy List
Форвардер разбирает URL прокси через urllib.parse.urlparse, поэтому @, : и / внутри пароля кодируются процентами. На каждый контекст браузера собирайте свой sticky-логин: session_id у Turbo или session_time у Flex, подробнее в следующем шаге.
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.
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
)
Как на самом деле работает логин
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().
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.
Прокси для nodriver
Sticky-сессии резидентских по HTTP или статические ISP и датацентр на каждый контекст, выдача за секунды.
Заказать