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 в зависимости от страниц, плюс процессор на рендеринг.
| Сценарий | RAM | vCPU | Тариф Cheap-Host |
|---|---|---|---|
| 1 браузер, лёгкие страницы, запуск по расписанию | 4 ГБ | 2 | NAT Pro — 199 ₽/мес |
| 1–4 браузера, тяжёлые страницы, регулярные прогоны | 8 ГБ | 4 | NAT Plus — 349 ₽/мес |
| Параллельные тесты, выделенный IP, свои веб-сервисы рядом | 8 ГБ | 6 | VPS 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
Ручной запуск нужен только для отладки. Дальше — автоматизация:
- По расписанию через 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 и задачи по расписанию.
- Постоянный процесс через 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.