Назад в Центр знаний
Развертывание

Browserless или собственный браузер: что даёт сервис

Управляемый браузер отдаёт сеанс по CDP. Он не отдаёт устойчивую идентичность браузера. Вот где проходит граница и какие ограничения заявлены в документации.

BotBrowser Team

Документация

Нужна структурированная документация по теме Развертывание?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Управляемый браузер это сервис, который запускает процесс браузера и отдаёт вам подключение к нему, и всё решение зависит от того, какими частями браузера он распоряжается. BotBrowser предоставляет объявленный профиль, который сохраняет согласованность поверхностей, доступных странице, между запусками, и не может заменить размещённый парк, брокер сеансов или квоту параллельных подключений. Сервис публикует больше, чем сокет: состояние сеанса, эмуляция операционной системы и усиленные маршруты закрывают разные слои, а слой, который они не закрывают, и решает, будет ли новый сеанс похож на предыдущий.

Кратко

  • Управляемый браузер даёт работающий браузер по CDP или WebSocket; автоматизацию по-прежнему пишете вы, и результат против антибот-контроля тоже ваш.
  • Управляемые сервисы сбора данных это другой продукт: они возвращают данные, а не сеанс.
  • Browserless документирует два механизма сохранения: API сеансов хранит cookies, localStorage и cache, а профили с авторизацией добавляют IndexedDB и два стабильных заголовка.
  • Эмуляция операционной системы это параметр запроса на отдельных маршрутах, а не сохранённый профиль; часовой пояс и язык она оставляет вам или прокси, а мобильный viewport задаёт только для Android-persona.
  • browserless vs puppeteer это ошибка категории: одно сервис, другое библиотека, через которую вы подключаетесь.
  • Оплата считается как параллельные подключения, умноженные на время, поэтому точка перехода к собственному хостингу зависит от загрузки, а не от объёма.
  • Собственный браузер уместен, когда идентичность должна переживать сеансы, сборки и машины; управляемый браузер уместен, когда работа такой идентичности не требует.

Содержание

Три колонки. Управляемый сервис сбора данных возвращает готовые данные. Управляемый браузер возвращает сеанс, которым вы управляете по CDP, с сохранением состояния, но без фиксированной идентичности. Собственный браузер работает на вашей машине с объявленным профилем, и процесс, версия и отпечаток принадлежат вам.

Что такое управляемый браузер, а что нет

Сервис запускает процесс браузера на своей инфраструктуре и открывает его по протоколу, который ваш код уже понимает. Browserless описывает это как Browser-as-a-Service: подключите Puppeteer или Playwright к endpoint WebSocket и сохраните имеющийся скрипт, где единственное изменение это строка подключения. Тот же аккаунт открывает и REST endpoints без состояния, такие как /content, /scrape и /screenshot, где один HTTP-запрос выполняет одну задачу браузера и возвращает результат.

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

BaaS endpoint      -> wss://.../chromium?token=...   session you drive; you own the code
REST endpoint      -> https://.../content?url=...    one request, one result, no session
self-hosted        -> chrome --user-data-dir=...     process on your machine

Управляемая половина убирает операционную поверхность: пулы процессов, перезапуски после сбоев, установку версий и ёмкость. Чего она не убирает, так это слой решений. Вы по-прежнему выбираете viewport, заголовки, момент навигации и политику повторов, и по-прежнему выясняете, принял ли целевой сайт сеанс. Управляемый браузер это другое место запуска браузера, а не другой вывод о том, пройдёт ли он. То же разделение видно, когда страница собирается из нескольких источников во время исполнения, и магазин, смешивающий API и отрендеренные данные, показывает это на конкретном случае.

Третий продукт в этой области легко спутать с двумя предыдущими. Сервис разблокировки веб-страниц или API сбора данных тоже запускает браузер на сервере, но возвращает извлечённый результат, а не сеанс. Если вам нужен сеанс, которым можно управлять, этот продукт имеет не ту форму, как бы хорошо он ни работал, и обратное тоже верно: автоматизация потока страница за страницей поверх endpoint без состояния означает пересборку состояния сеанса при каждом вызове.

Одно практическое следствие архитектуры в том, что локальные инструменты отладки продолжают работать. Endpoint WebSocket принимает те же сообщения протокола devtools, что и локальный браузер, поэтому скрипт, который записывает трафик CDP локально, записывает его и для удалённого браузера, а трассировку, снятую в одном месте, можно воспроизвести в другом. Не переносится сам браузер: локально установленное расширение, локальный набор шрифтов или локальный путь GPU существуют только там, где установлены, а в удалённом сеансе есть то, что положил туда провайдер.

Три архитектуры рядом

Операционно важное различие в том, кто запускает браузер, кто отвечает за результат против антибот-контроля и что получает вызывающий код.

Управляемый сервис сбора данныхУправляемый браузерСобственный браузер
Что вы получаетеГотовые данныеСеанс по CDP/WebSocketПроцесс, который запустили вы
Кто запускает браузерПровайдерПровайдерВы
Кто отвечает за блокировкиПровайдерВыВы
Идентичность между сеансамиНе раскрываетсяСостояние, не отпечатокТо, что объявляет профиль
Контроль версии браузераВыбор провайдераМатрица провайдераФиксируете вы
Какой сбой вы разбираетеКачество данныхСелекторы, тайминги, заголовкиПроцесс, профиль, сборка

Прочитайте третью строку внимательно, потому что именно она меняет решение о покупке. Управляемый браузер переносит машину, а не проблему: усиленные маршруты в документации Browserless описаны как изменение поведения браузера и поэтому не являются вариантом по умолчанию. Если целевой сайт отклонил ваш сеанс, этот сеанс всё равно оставался вашим для диагностики.

Четвёртая строка показывает, где два управляемых продукта действительно различаются, и где собственный хостинг отличается от обоих. Сервис сбора данных скрывает идентичность, потому что идентичность находится внутри его конвейера; управляемый браузер раскрывает состояние, а это более узкая вещь; собственный браузер раскрывает браузер целиком, и только в нём отпечаток является свойством, которое вы задаёте намеренно, а не наследуете.

Строка о версии заслуживает примера, потому что её команды обнаруживают поздно. Провайдер, который обновляет парк по своему графику, меняет движок отрисовки под скриптом, который не менялся вовсе, и проверка вёрстки, прошедшая в понедельник, может упасть в среду по причине, которую не объясняет ни один коммит. Собственный хостинг тоже не убирает этот риск; он превращает его в решение, которое вы планируете, а это другая и обычно предпочтительная задача. Фиксация версии через Chrome for Testing это механизм, который делает её решением, а не случайностью.

Состояние сеанса не равно идентичности браузера

Browserless документирует два способа сохранять данные между подключениями, и оба стоит прочитать именно из-за их перечня. Первый это команда CDP, вызываемая посреди скрипта, Browserless.reconnect, которая помечает работающий браузер как переподключаемый, чтобы сервер держал процесс открытым в течение окна ожидания; в документации отмечено, что она только для Puppeteer, поскольку нужен browser.disconnect(), а в Playwright такого вызова нет. Второй это REST API сеансов, который выделяет изолированный каталог данных пользователя на сеанс и хранит данные днями, переживая полные перезапуски браузера.

standard session   -> process kept alive; window in seconds to minutes; Puppeteer only
persisting state   -> isolated user-data-dir per session; survives process restarts

API сеансов сохраняет cookies, localStorage и cache, как перечислено на странице обзора сеансов. Функция профилей с авторизацией идёт дальше и называет cookies, localStorage и IndexedDB, а sessionStorage исключает с документированным обоснованием, что его воспроизведение вносит устаревшее состояние в перенаправления OAuth и потоки CSRF. Это исключение верное инженерное решение для своей цели, и проведённая им граница и есть полезная часть: восстанавливаются состояние входа и те заголовки, которые провайдер решил сохранить, а не весь браузер, который их создал.

Заголовки это та часть, которая сохраняет честность предыдущего утверждения. Профиль, сохранённый из сеанса Browserless, помнит и User-Agent того браузера, и сеансы, которые его загружают, показывают тот же; сеансы создания профиля и сеансы Brave, загружающие такой профиль, отправляют стабильный Accept-Language, а остальные сеансы Brave сохраняют встроенную вариацию Brave. Значит, профиль это не только хранилище, и точная формулировка в том, что он несёт сохранённый вход плюс два заголовка, задокументированные провайдером, а не в том, что он не несёт никакой идентичности. Чего он по-прежнему не несёт, так это всего остального, из чего вычисляется отпечаток.

Параметр эмуляции операционной системы показывает то же разделение слоёв с другой стороны. emulationOs задаёт согласованный набор сигналов, производных от системы: user agent, client hints, navigator.platform, средство отрисовки WebGL, hardwareConcurrency и список медиаустройств. Далее документация перечисляет то, что он не меняет, и этот список и есть полезная часть: часовой пояс, язык и Accept-Language следуют за прокси, а для настольных персон размер экрана и viewport остаются за клиентом. Параметр действует на усиленных маршрутах, на REST API разблокировки и сбора данных, включая /unblock, /smart-scrape и их варианты с префиксом провайдера, на маршрутах BQL и на маршруте agent, и игнорируется на простом endpoint /chromium или /chrome.

emulationOs=windows  -> changes: UA, client hints, navigator.platform, WebGL renderer
                     -> keeps:   timezone, locale, Accept-Language, viewport, WebRTC
emulationOs=android  -> also sets a high-DPI mobile screen and viewport

Значение Android это исключение, которое делает настольное правило точным. emulationOs=android действительно задаёт размер экрана и соотношение пикселей как часть согласованной мобильной персоны, которую при необходимости сужает emulatedDevice; настольные персоны оставляют и то и другое defaultViewport или setViewport. Чтение списка изменений без этого исключения даёт неверный вывод о мобильном тестировании.

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

Есть второе следствие для тех, кто проверяет поведение нескольких аккаунтов или регионов. Профиль, восстанавливающий вход, идеально подходит для возобновления одного аккаунта и совершенно не подходит для доказательства различимости двух аккаунтов, потому что различает их не то хранилище, которое он восстанавливает. Для такой проверки нужны две среды, различающиеся объявленными поверхностями и одинаковые во всём остальном, а это сравнение сохранённый cookie выразить не может.

Сравнение, которое не является сравнением

Две подсказки автодополнения вокруг этого продукта это browserless vs puppeteer и browserless vs playwright, и ни одна не является сравнением равных. Puppeteer и Playwright это библиотеки, которые управляют браузером; Browserless это место, где такой браузер работает. Спрашивать, кто побеждает, всё равно что спрашивать, побеждает ли автомобиль дорогу.

Ответ в композиции, и она различается между библиотеками одним документированным образом. С Puppeteer стандартный поток переподключения работает, потому что существует browser.disconnect(). С Playwright он не работает, и поэтому документация направляет пользователей Playwright к REST API сеансов. Если ваш стек это Playwright, планируйте именно такую форму; если Puppeteer, доступны обе.

У этой асимметрии есть цена и за пределами сервиса. Поток переподключения, который зависит от отключения живого браузера, предполагает, что клиент отличает чистое отключение от оборванного сокета, а скрипт Playwright, повторяющий попытку после ошибки сокета, делает не то же самое, что скрипт Puppeteer, отключающийся намеренно. Прежде чем выбирать механизм сохранения, стоит записать, на какое событие скрипт реагирует на самом деле: явное отключение, истёкший таймаут или ошибка транспорта. Только первое является решением жизненного цикла; два других это сбои, и если принять одно за другое, сеанс проживёт дольше, чем предполагала проверка.

Сравнение с собственным хостингом настоящее, и в нём обмен наиболее ясен. Свой хостинг означает, что вы отвечаете за пул, перезапуски, обновления версий и планирование ёмкости. Запуск браузера с явным каталогом данных пользователя и сохранение этого каталога стабильным между запусками и делает идентичность воспроизводимой; подводные камни запуска и профиля в Puppeteer разбирает четыре решения при запуске, которые сохраняют профиль главным. На сервере эта работа не исчезает, а переезжает: настройка headless-сервера это список проверок для дисплея, бинарника и цикла восстановления, которые управляемый endpoint иначе берёт на себя.

За что на самом деле берут деньги

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

managed monthly   ~= peak_concurrency x hours_used x unit_price
self-hosted cost  ~= machines x amortised_hours + ops_hours_per_month x loaded_rate

Поэтому точка перехода это вопрос загрузки, и формула выше называет три величины, которые нужно измерить: peak_concurrency, hours_used и unit_price. Если пиковая параллельность высока, а средняя низка, тариф за единицу следует за средней и выигрывает, потому что вы не платите за простаивающие машины. Если нагрузка ровная, а параллельность умеренная, машина, способная простаивать, оплачивается один раз и второе слагаемое доминирует, и здесь выигрывает собственный хостинг. Опубликованные потолки тарифов прямо описывают первое слагаемое, от бесплатного уровня с двумя одновременными браузерами и пределом сеанса в две минуты до ста одновременных браузеров с пределом в шестьдесят минут, чего достаточно, чтобы посчитать управляемую сторону для своей нагрузки без запроса коммерческого предложения.

В ту же арифметику входят ещё два слагаемых. Перезапуски не бесплатны ни с одной стороны: управляемый endpoint их скрывает, поэтому они проявляются как хвост задержки, а не как строка счёта, а собственный пул показывает их как ёмкость, которую нужно резервировать. Второе это хранение, потому что сохранённый профиль расходует квоту, которой запрос без состояния не расходует, и нагрузка, хранящая большое авторизованное состояние на каждую идентичность, платит за это состояние даже в день, когда браузер не открывается.

Две затраты легко выпадают из этой арифметики. Первая это работа над идентичностью: если нагрузке нужен стабильный браузер между сеансами, этого требования нет пока ни в одной из колонок, и удовлетворить его внутри управляемого сеанса всё равно означает нести профиль самому. Вторая это потолок сеанса: задача, которая законно длится дольше максимального времени сеанса в тарифе, становится другой задачей, разбитой на возобновляемые части, и такая переработка это работа независимо от того, кто размещает браузер.

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

Практический итог

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

Две проверки делают решение конкретным. Первая: запишите, относится требование к состоянию или к идентичности; документация Browserless прямо говорит, что её профили восстанавливают cookies, localStorage, IndexedDB, User-Agent и Accept-Language, и прямо говорит, что emulationOs не трогает часовой пояс, язык и viewport настольных персон. Вторая: посчитайте пиковую параллельность против средней, потому что именно это отношение, а не месячный объём, решает, какой счёт растёт быстрее.

Когда сеанс падает на управляемом endpoint, диагностика всё равно остаётся за клиентом: какие селекторы, какие заголовки, какой момент навигации, какая сборка. О том, какая сборка установлена и как её зафиксировать, читайте в фиксации версии через Chrome for Testing; о том, что страница может наблюдать о самом сеансе, читайте в сравнении сигналов headless и headed.

Источники

#Browserless#Управляемые Браузеры#Собственный Хостинг#CDP#Идентичность Браузера

Эта статья входит в руководство: Развёртывание и выпуск браузера: операционная карта

Выполните ту же проверку в BotBrowser

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