Selenium и headless-браузер на VPS: настройка без монитора

Боты, ИИ и автоматизация
Selenium и headless-браузер на VPS: настройка без монитора

Selenium на VPS — это полноценный браузер, который работает на сервере без монитора, мыши и графической оболочки. Headless Chrome на сервере открывает страницы, выполняет JavaScript, кликает по кнопкам, заполняет формы и делает скриншоты — всё то же, что браузер на вашем ноутбуке, только круглосуточно и без вашего участия. Такая связка нужна для автотестов веб-приложений, снятия скриншотов, мониторинга собственных сайтов и сбора открытых данных со страниц, которые строятся JavaScript. В этой инструкции мы поставим Chromium и chromedriver на Ubuntu 24.04 LTS, запустим первый скрипт в режиме --headless=new и разберём типичные ошибки.

Зачем нужен headless-браузер на сервере

Обычные HTTP-библиотеки вроде requests получают только исходный HTML. Если страница собирается на клиенте — React, Vue, бесконечная подгрузка — в этом HTML полезных данных нет. Headless-браузер исполняет JavaScript и отдаёт готовый DOM. Типичные задачи:

  • Автотесты — прогон E2E-сценариев вашего веб-приложения в CI или по расписанию;
  • Скриншоты и PDF — автоматическая генерация превью страниц и печатных версий;
  • Мониторинг своих сайтов — проверка, что страница реально рендерится, формы работают, а JS-ошибки не положили корзину;
  • Сбор открытых данных — когда информация доступна легально, но появляется только после исполнения JavaScript. О правилах этичного сбора мы подробно писали в статье про парсинг на VPS.

Слово «headless» означает «без головы»: браузер работает без окна и дисплея. Современному Chromium для этого не нужны ни рабочий стол, ни виртуальный X-сервер — только флаг --headless=new.

Требования к ресурсам: какой VPS выбрать под Selenium

Браузер — самое тяжёлое, что обычно запускают на дешёвых серверах. Один экземпляр headless Chromium ест 300–800 МБ RAM в зависимости от страниц, плюс процессор на рендеринг.

СценарийRAMvCPUТариф Cheap-Host
1 браузер, лёгкие страницы, запуск по расписанию4 ГБ2NAT Pro — 199 ₽/мес
1–4 браузера, тяжёлые страницы, регулярные прогоны8 ГБ4NAT Plus — 349 ₽/мес
Параллельные тесты, выделенный IP, свои веб-сервисы рядом8 ГБ6VPS Start — 450 ₽/мес

Оптимум для большинства задач — NAT Plus у Cheap-Host: 4 vCPU, 8 ГБ RAM, 50 ГБ NVMe за 349 ₽/мес. KVM-виртуализация даёт честные выделенные ресурсы — для браузера это критично, потому что на оверселленных серверах Chromium первым страдает от «просевшего» CPU. NVMe-диск ускоряет холодный старт браузера и работу с профилем. На всякий случай настройте swap на 2 ГБ — как это сделать, разбирали в статье про swap на VPS.

Установка Selenium и Chromium на Ubuntu 24.04: пошагово

Сервер Cheap-Host выдаётся за 45–60 секунд с готовым SSH-доступом, так что от оплаты до работающего headless-браузера — минут двадцать.

Шаг 1. Обновляем систему

sudo apt update && sudo apt upgrade -y

Шаг 2. Ставим Chromium и chromedriver

В Ubuntu 24.04 Chromium поставляется как snap-пакет, а apt-пакеты chromium-browser и chromium-chromedriver — обёртки, которые его устанавливают и обновляют синхронно:

sudo apt install -y chromium-browser chromium-chromedriver

Шаг 3. Проверяем версии

Версии браузера и драйвера должны совпадать до мажорного номера — иначе Selenium откажется создавать сессию:

chromium-browser --version
chromedriver --version

Шаг 4. Создаём окружение Python и ставим Selenium

Ubuntu 24.04 не разрешает ставить pip-пакеты в системный Python (PEP 668), поэтому используем виртуальное окружение:

sudo apt install -y python3-venv python3-pip
mkdir ~/selenium-bot && cd ~/selenium-bot
python3 -m venv venv
source venv/bin/activate
pip install selenium

Шаг 5. Первый скрипт в режиме --headless=new

Создайте файл check.py:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

options = Options()
options.binary_location = "/usr/bin/chromium-browser"
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--window-size=1920,1080")

service = Service("/usr/bin/chromedriver")
driver = webdriver.Chrome(service=service, options=options)

try:
    driver.get("https://example.com")
    print("Заголовок страницы:", driver.title)
    driver.save_screenshot("page.png")
finally:
    driver.quit()

Запускаем:

python check.py

Если в консоли появился заголовок «Example Domain», а рядом лёг файл page.png — поздравляем, headless-браузер на сервере работает. Мы явно указали пути к бинарникам, чтобы Selenium Manager не пытался скачивать собственный браузер и всё оставалось под контролем системных пакетов.

Ключевые опции headless Chrome: что означает каждый флаг

  • --headless=new — новый headless-режим: тот же движок, что у обычного Chrome, поэтому рендеринг и поведение страниц идентичны десктопу;
  • --no-sandbox — отключает песочницу; нужен, если скрипт запускается под root. Лучше создать отдельного пользователя и работать без этого флага;
  • --disable-dev-shm-usage — заставляет Chromium писать временные данные в /tmp вместо маленького раздела /dev/shm; спасает от внезапных падений вкладок на VPS;
  • --window-size=1920,1080 — задаёт размер «виртуального окна»: без него страницы могут рендериться в мобильной раскладке;
  • --disable-gpu — на серверах без видеокарты обычно уже не обязателен, но безвреден и иногда убирает предупреждения в логах.

Для скриншотов всей страницы добавьте driver.set_window_size(1920, driver.execute_script("return document.body.scrollHeight")) перед снятием снимка.

Автоматизация: запуск по расписанию и 24/7

Ручной запуск нужен только для отладки. Дальше — автоматизация:

  1. По расписанию через cron. Например, прогон проверки каждые 30 минут:
   */30 * * * * /home/user/selenium-bot/venv/bin/python /home/user/selenium-bot/check.py >> /home/user/selenium-bot/run.log 2>&1

Синтаксис планировщика разобран в статье про cron и задачи по расписанию.

  1. Постоянный процесс через systemd. Если скрипт крутится в бесконечном цикле или слушает очередь задач, оформите его службой с Restart=on-failure — упавший браузер перезапустится сам. Готовый шаблон юнита есть в материале о запуске Python-скриптов на сервере 24/7.

Обязательно вызывайте driver.quit() в блоке finally: каждый незакрытый браузер оставляет в памяти процессы chromium, и через неделю таких «сирот» сервер начнёт задыхаться. Периодическая проверка — ps aux | grep chromium.

Типичные ошибки и как их лечить

  • session not created: This version of ChromeDriver only supports... — версии браузера и драйвера разошлись. Обновите оба пакета: sudo apt install --only-upgrade chromium-browser chromium-chromedriver.
  • DevToolsActivePort file doesn't exist — классика при запуске под root. Добавьте --no-sandbox или, правильнее, запускайте скрипт от обычного пользователя.
  • Вкладка падает: session deleted because of page crash — переполнился /dev/shm. Флаг --disable-dev-shm-usage решает проблему.
  • Процесс убит, в dmesg — Out of memory — браузеру не хватило RAM. Сократите число параллельных экземпляров, добавьте swap или апгрейдите тариф — у Cheap-Host CPU и RAM увеличиваются без потери данных.
  • Скрипт не находит элементы — страница не успела отрендериться. Используйте явные ожидания WebDriverWait вместо time.sleep().

И напоминание про этику: используйте headless-браузер для своих сайтов, тестов и открытых данных, уважайте robots.txt и не создавайте нагрузку на чужие ресурсы — правила те же, что и для обычного парсинга.

FAQ

Сколько RAM нужно для Selenium на VPS?

Один экземпляр headless Chromium занимает 300–800 МБ. С учётом системы и Python комфортный минимум — 4 ГБ для одного браузера и 8 ГБ для 2–4 параллельных. У Cheap-Host под это подходит NAT Plus: 4 vCPU и 8 ГБ RAM за 349 ₽/мес.

Чем --headless=new отличается от старого headless-режима?

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

Нужен ли графический интерфейс или Xvfb на сервере?

Нет. Chromium в режиме --headless=new рендерит страницы без дисплея. Xvfb нужен только приложениям, которые вообще не умеют работать headless.

Почему Selenium падает с ошибкой session not created?

Почти всегда — несовпадение версий chromedriver и браузера. Ставьте оба из одного источника: пакеты chromium-browser и chromium-chromedriver обновляются синхронно. Вторая причина — запуск под root без --no-sandbox.

Можно ли запускать Selenium на самом дешёвом VPS?

На 1 ГБ RAM браузер будет регулярно убиваться OOM-killer. Минимум — 4 ГБ, рекомендуемо 8 ГБ. Если задача решается без рендеринга JavaScript, дешевле обойтись HTTP-запросами на лёгком тарифе.

Вывод

Selenium на VPS превращает сервер в браузер, который работает без монитора: пять шагов установки на Ubuntu 24.04, флаг --headless=new — и у вас круглосуточная автоматизация тестов, скриншотов и мониторинга. Главное — не экономить на памяти, следить за совпадением версий браузера и драйвера и всегда закрывать сессии через driver.quit().

Если для этой задачи вам нужен сервер — у Cheap-Host есть тариф NAT Plus за 349 ₽/мес: 4 vCPU, 8 ГБ RAM, 50 ГБ NVMe, KVM с выделенными ресурсами, безлимитный трафик и выдача за минуту. Все тарифы — на cheap-host.onl.

Читайте также