Настройка прокси для использования в браузере: уникальные IP-адреса для каждой сессии
Ищите прокси для использования в браузере, и Google предлагает вам диалог настроек Chrome. Это другое: маршрутизация библиотеки AI-агента для использования в браузере через аутентифицированные резидентные IP, по одному на каждого агента.
Ищите прокси для использования в браузере, и Google предлагает вам диалог настроек Chrome, API расширения chrome.proxy и руководство по корпоративному PAC-файлу. Ничего из этого не то, что вы искали. Вы хотите маршрутизировать browser-use - библиотеку Python с 108k звездами на GitHub, которая позволяет LLM управлять реальным браузером - через аутентифицированный прокси, чтобы ваш агент не атаковал цель с IP вашего офиса. Это то руководство: где на самом деле находится параметр, почему он тихо перестает работать после обновления, как дать каждому параллельному агенту свой выходной IP и что происходит с долгой задачей, когда IP меняется под ней.
Где на самом деле находится параметр прокси для использования в браузере
Прокси является свойством сессии браузера, а не агента. В текущей библиотеке Browser является псевдонимом для BrowserSession - документация четко указывает, что это один и тот же класс - поэтому любое руководство, которое вы найдете, используя одно имя, применимо и к другому. Параметр - это proxy, и в документации он указан как ProxySettings с четырьмя полями: server, bypass, username и password. Работает также эквивалентный словарь, который и передают большинство людей:
import asyncio
from browser_use import Agent, Browser
# llm = ... your model of choice; see the browser-use docs for the import
PROXY = {
"server": "http://gate.quantumproxies.io:8000", # scheme is mandatory
"username": "USER",
"password": "PASS",
"bypass": "localhost,127.0.0.1", # keep local calls off the proxy
}
browser = Browser(proxy=PROXY, headless=False)
async def main():
agent = Agent(
task="Open https://api.ipify.org?format=json and report the IP you see",
llm=llm,
browser_session=browser,
)
await agent.run()
asyncio.run(main())
Две детали, которые люди часто путают. Во-первых, учетные данные должны находиться в полях username и password, а не быть вставлены в server - Chromium не ответит на запрос аутентификации прокси с паролем, встроенным в URL, и у browser-use нет диалога для его ввода. Во-вторых, server нуждается в схеме. gate.quantumproxies.io:8000 не является URL прокси; http://gate.quantumproxies.io:8000 является. Если учетные данные вызывают у вас проблемы, внесение в белый список IP вашего сервера полностью исключает необходимость в user:pass - шлюз распознает вызывающего, и браузер никогда не видит 407.
Почему ваша конфигурация прокси для использования в браузере тихо не работает
Самая посещаемая страница по этой теме после документации - это проблема GitHub #2445, поданная в июле 2025 года: прокси, который работал в версии 0.1.45, перестал действовать в версии 0.5.4, и единственная подсказка была в том, что агент радостно сообщал DNS_PROBE_FINISHED_NXDOMAIN в своем собственном резюме. Этот режим отказа - агент, описывающий сетевую ошибку, как будто это факт о веб-сайте - является признаком прокси, который наполовину настроен. Пройдитесь по этому списку, прежде чем сжигать больше токенов:
- Вы передали
proxy=сессии, которую агент никогда не получил. Создайте одинBrowser, передайте именно этот объект и не позволяйте создать сессию по умолчанию за вашей спиной. - Вы установили
cdp_url. Подключение к уже запущенному Chrome означает, что прокси принадлежит флагам запуска этого браузера (--proxy-server=...), а не вашей конфигурации сессии - browser-use не может его доработать. - Глобальная переменная окружения
HTTP_PROXYилиHTTPS_PROXYконфликтует с настройкой сессии или, что еще хуже, тихо маршрутизирует ваши вызовы LLM API через измеряемую пропускную способность. - Сам прокси не работает. Проверьте его вне агента сначала - это ничего не стоит и исключает половину пространства поиска.
import requests
PROXY_URL = "http://USER:PASS@gate.quantumproxies.io:8000"
r = requests.get(
"https://api.ipify.org?format=json",
proxies={"http": PROXY_URL, "https": PROXY_URL},
timeout=20,
)
print(r.status_code, r.text) # must NOT be your own IP
Если это выводит иностранный IP, учетные данные и шлюз в порядке, и проблема в подключении сессии. Если это выводит ваш собственный адрес или 407, исправьте это сначала. Наш бесплатный проверщик IP показывает, как выглядит выход с другой стороны - ASN, тип и репутация - что является второй вещью, которую нужно проверить, когда страницы загружаются, но каждая из них - CAPTCHA.

Один прокси на сессию, чтобы параллельные агенты не делили выходной IP
Это вся причина, по которой параметр находится на сессии, а не в глобальной конфигурации. Запустите десять агентов через один общий Browser, и цель увидит в десять раз больше трафика с одного адреса, что является самым быстрым способом сжечь резидентный IP. Создайте сессию внутри корутины вместо этого и дайте каждому из них свой собственный идентификатор сессии с фиксированным IP, чтобы шлюз закрепил его за одним выходом на протяжении всей задачи:
import asyncio, secrets
from browser_use import Agent, Browser
def session_proxy(sid: str, country: str = "us"):
return {
"server": "http://gate.quantumproxies.io:8000",
"username": f"USER-country-{country}-session-{sid}",
"password": "PASS",
}
async def run_task(task: str, country: str):
sid = secrets.token_hex(3) # e.g. a1b2c3
browser = Browser(
proxy=session_proxy(sid, country),
user_data_dir=None, # incognito: no shared cookies
allowed_domains=["*.example.com"], # keep the agent on target
)
agent = Agent(task=task, llm=llm, browser_session=browser)
return await agent.run()
async def main():
await asyncio.gather(
run_task("Find the price of SKU-1", "us"),
run_task("Find the price of SKU-1", "de"),
run_task("Find the price of SKU-1", "gb"),
)
asyncio.run(main())
Три флага действительно работают здесь. user_data_dir=None запускает в режиме инкогнито, чтобы агенты не могли наследовать куки друг друга и тихо объединять две идентичности в один профиль. allowed_domains ограничивает навигацию списком шаблонов - обратите внимание, что подстановочные знаки в позиции TLD, такие как example.*, намеренно отклоняются, а списки более ста записей оптимизируются в наборы с отключенным сопоставлением шаблонов. А идентификатор сессии в имени пользователя делает выходной IP стабильным; точные имена флагов для страны и сессии находятся в вашей панели управления, но форма везде одинакова.
Выбор страны выхода для каждой задачи
Агенты, которые покупают, сравнивают цены или проверяют доступность, по умолчанию ошибаются, если они просматривают из неправильной страны. Поскольку прокси является сессионным, страна - это аргумент для каждой задачи - замените country-us на country-de, и та же задача вернет немецкие цены. Выберите из более чем 200 стран в пуле и держите остальную часть браузера в соответствии с этим: передайте соответствующий язык через args (Chromium принимает --lang=de-DE) вместо того, чтобы позволить немецкому выходному IP запрашивать страницы на американском английском. Для мобильных поверхностей и самых надежных выходов мобильные IP ведут себя иначе, потому что NAT оператора связи ставит тысячи реальных пользователей за один адрес.
Дайте каждому агенту свой собственный резидентный выходной IP

Что происходит, когда IP меняется во время выполнения задачи
Агенты медленные так, как скрейперы не медленные. Между стандартной паузой в 0,5 секунды после каждого действия, минимальным ожиданием состояния страницы в 0,25 секунды и ожиданием сетевой неактивности в 0,5 секунды, browser-use тратит более секунды на каждый шаг, прежде чем модель что-либо скажет - а время кругового трипа модели обычно занимает несколько секунд больше. Задача в пятнадцать шагов, следовательно, выполняется от одной до двух минут по реальному времени. Если ваш выходной IP меняется на каждый запрос, сайт увидит другой адрес на каждом из этих шагов: вход в систему прерывается, корзина очищается, и агент сообщает, что кнопка оформления заказа исчезла.
Решение - это сессия с фиксированным IP, окно которой комфортно превышает вашу наихудшую продолжительность задачи, а не среднюю. Проведите несколько реальных запусков, возьмите самый медленный и добавьте запас - агенты повторяют попытки, и повтор удваивает время. Когда задача действительно должна пережить любое окно с фиксированным IP, разделите ее: войдите в систему и экспортируйте состояние, затем возобновите в новой сессии с куками, которые вы сохранили через storage_state. И если вы выбираете между ротацией на каждый запрос и фиксированным IP вообще, наш контрольный список инфраструктуры для AI-агентов охватывает остальной слой вокруг этого решения.
Держите прокси подальше от ваших вызовов LLM
Это стоит реальных денег, и почти никто этого не замечает. Установка HTTPS_PROXY в качестве переменной окружения, чтобы прокси "применялся везде", также маршрутизирует каждый вызов API модели через ваш резидентный шлюз - запросы и ответы, на каждом шаге, оплачиваемые за гигабайт за привилегию идти длинным путем. Настройте прокси только на Browser и оставьте окружение процесса в покое. Пока вы считаете байты, обратите внимание, что browser-use загружает uBlock Origin по умолчанию через enable_default_extensions: оставьте его включенным, потому что каждый рекламный запрос, который он убивает, - это тот, за который вы не платите. Полная арифметика в нашем разборе сколько стоит AI-агент в пропускной способности, а классическая версия компромисса для скрейпинга находится в безголовый браузер против HTTP-запросов.
Часто задаваемые вопросы
Как настроить прокси в browser-use?
Передайте proxy=, когда создаете Browser (также экспортируется как BrowserSession), затем передайте этот объект Agent. Значение содержит server с явной схемой http://, а также username, password и необязательный список bypass. На уровне агента настройки прокси нет - она принадлежит сессии.
Почему моя конфигурация прокси для использования в браузере не работает?
По степени вероятности: агент работает в другой сессии, чем та, которую вы настроили, server отсутствует схема, вы установили cdp_url, поэтому браузер был запущен в другом месте без флагов прокси, или глобальная переменная окружения прокси переопределяет вас. Проверьте прокси с помощью простого HTTP-клиента сначала - ошибка DNS в журнале агента обычно означает, что прокси вообще не подключен.
Может ли каждый агент browser-use использовать другой IP?
Да, и вы должны. Создайте Browser внутри каждой корутины задачи с собственными учетными данными прокси, а не делитесь одним экземпляром. Добавление уникального идентификатора сессии к имени пользователя шлюза закрепляет каждого агента за отдельным выходом на протяжении всего его выполнения, так что десять параллельных агентов выглядят как десять пользователей, а не один очень занятый.
Какой тип прокси лучше всего подходит для агентов browser-use?
Ротационный резидентный для исследований и проверки цен, где каждая задача независима, фиксированный резидентный для всего, что связано с входом в систему или корзиной, и мобильный, когда цель враждебна или только для мобильных устройств. Датацентрические IP подходят для внутренних целей и незащищенных страниц, и они намного дешевле за гигабайт - что важно, потому что агент браузера перемещает много гигабайт.
Останавливает ли прокси обнаружение browser-use?
Нет. Прокси исправляет только IP-уровень; отпечаток автоматизированного Chromium - это отдельная проблема, как и поведение агента, который кликает с миллисекундной точностью. Доверенные резидентные выходы убирают самый легкий сигнал, но сочетайте их с браузером, ориентированным на скрытность, если цель использует серьезное управление ботами.
Здесь нет ничего экзотического: прокси - это свойство сессии, и две вещи, которые его ломают, - это отсутствие схемы и сессия, которую вы никогда не передали. Сделайте это правильно, дайте каждому параллельному агенту свой собственный фиксированный выход и держите шлюз подальше от ваших вызовов модели API. Для более широкой картины смотрите нашу карту антидетект-фреймворков и аутентифицированных прокси.
Запустите browser-use на более чем 90 миллионов резидентных IP в более чем 200 странах