Браузерные агенты на Python - как заставить нейросеть кликать по сайтам и автоматизировать любую рутину

Любой разработчик, писавший парсеры или скрипты автоматизации на Selenium и Playwright, знает это чувство бессилия.

Браузерные агенты на Python - как заставить нейросеть кликать по сайтам и автоматизировать любую рутину

Вы потратили три дня на написание селекторов, настроили авторизацию, запустили скрипт в крон, а через неделю верстальщик сайта меняет название CSS-класса с btn-primary на button_submit_v2. Еще через неделю маркетологи выкатывают всплывающий баннер с промокодом, который перекрывает кнопку оформления заказа.

Скрипт падает с ошибкой ElementNotInteractableException. Все приходится переписывать с нуля.

Браузерные агенты на базе зрительных языковых моделей (Vision LLM) решают задачу принципиально иначе. Модель не разбирает километры обфусцированного HTML-кода. Она смотрит на скриншот страницы глазами человека, находит нужные элементы по смыслу и сама решает, как обойти препятствия.

Мы протестировали открытый фреймворк browser-use. Разбираем механику визуального управления и пишем готового автономного агента на Python.

Как это устроено - метод маркировки элементов

Попытка скормить модели сырой DOM-дерево современной веб-страницы на React или Vue - верный способ сжечь сто тысяч токенов за один запрос. Большая часть разметки - это служебные теги, скрипты и стили Tailwind, которые не несут смысловой нагрузки.

Фреймворк browser-use использует технологию разметки визуальных меток (Set-of-Marks):

  1. Библиотека Playwright открывает страницу в браузере Chromium.
  2. Специальный JavaScript-скрипт находит все кликабельные элементы (кнопки, ссылки, поля ввода, выпадающие списки) и накладывает поверх них маленькие цветные плашки с номерами (1, 2, 3...).
  3. Делается скриншот страницы с наложенными номерами, а из разметки вычищается весь мусор, оставляя компактное дерево только интерактивных узлов.
  4. Скриншот и дерево отправляются в модель со зрением.

Модель анализирует изображение и отдает одну из базовых команд:

  • click(index=14) - кликнуть по элементу с номером 14.
  • input_text(index=8, text="RTX 4090") - ввести текст в поле 8.
  • scroll_down(amount=500) - прокрутить страницу вниз.
  • switch_tab(page_id=2) - переключить вкладку.

Кстати, если вы хотите протестировать все самые свежие модели уровня Claude Sonnet 5, GPT-5.6 или Gemini 3 в одном удобном месте и сравнить их ответы без костылей с иностранными картами - на платформе SYNTX.AI это можно сделать за пару кликов.

По промокоду NEIROSKUF дадут 15% скидку на все тарифы.

Движок выполняет действие, делает новый скриншот и снова отдает управление модели, пока задача не будет выполнена.

Если на экране выскочил рекламный баннер, агент сам находит крестик, кликает по нему и продолжает выполнение основного сценария.

Пишем первого агента за тридцать строк

Для запуска потребуется Python 3.11+, пакет browser-use и установленные браузерные движки Playwright.

Ставим зависимости:

pip install browser-use playwright langchain-openai playwright install chromium

Создаем скрипт agent.py:

import asyncio import os from browser_use import Agent, Browser, BrowserConfig from langchain_openai import ChatOpenAI # Настраиваем зрительную модель llm = ChatOpenAI( model="gpt-4o", # Или claude-3-7-sonnet / qwen-vl локально api_key=os.getenv("OPENAI_API_KEY"), ) # Настраиваем браузер (headed=True позволяет видеть окно в реальном времени) browser = Browser( config=BrowserConfig( headless=False, # Открываем реальное окно браузера для отладки disable_security=True, # Отключает строгие проверки CORS для тестов ) ) async def main(): task = """ 1. Зайди на сайт https://habr.com/ru/hubs/it/ 2. Найди три самые популярные статьи за сегодня. 3. Для каждой статьи открой страницу, скопируй заголовок, автора и количество просмотров. 4. Верни итоговый список в виде структурированного текста. """ agent = Agent( task=task, llm=llm, browser=browser, max_steps=20, # Защита от бесконечного блуждания по сайту ) # Запускаем выполнение history = await agent.run() print("\nРезультат выполнения задачи:") print(history.final_result()) await browser.close() if __name__ == "__main__": asyncio.run(main())

Запускаем:

python agent.py

В открывшемся окне браузера видно, как агент сам находит поисковую строку, кликает по статьям, листает страницы и собирает финальный результат в консоль.

Боевой сценарий - сохранение авторизации и сбор данных

Если сайту требуется вход по логину и паролю, заставлять модель вводить пароль на каждом шаге небезопасно и дорого по токенам.

Правильное инженерное решение - использовать постоянный профиль браузера (user_data_dir). Вы один раз авторизуетесь на нужных сайтах вручную, сохраняете куки и сессию, а агент использует уже готовый авторизованный профиль.

Обновляем конфигурацию браузера:

from browser_use import Browser, BrowserConfig browser = Browser( config=BrowserConfig( headless=True, # В проде запускаем без графического интерфейса user_data_dir="./chrome_profile", # Папка с сохраненными куками и сессиями ) )

Теперь агент может заходить в закрытые партнерские кабинеты, корпоративные CRM или почту без повторной авторизации и ввода SMS-кодов.

Собственно, если вам нужно выгрузить миллион карточек товаров из открытого каталога - забудьте про агентов, пишите старый добрый асинхронный парсер на aiohttp. Иначе вы разоритесь на токенах за скриншоты в первый же час.

Но если вам нужно раз в сутки зайти в три закрытых партнерских кабинета без API, нажать пять кнопок в вечно меняющемся интерфейсе, собрать отчет и отправить в рабочий чат - браузерный агент закрывает эту головную боль навсегда.

Браузерные агенты на Python - как заставить нейросеть кликать по сайтам и автоматизировать любую рутину
1100