Разработка · 6 мин чтения

Selenium для автоматизации браузера: когда нужен вместо requests

Когда в ТЗ написано «спарсить цены с сайта на React» или «прогнать сценарий записи на Tilda после каждого деплоя», первый вопрос - хватит ли обычных requests или без Selenium - автоматизации браузера с полноценным рендерингом JS - тут не обойтись. За несколько лет работы с парсингом, ботами на aiogram и сценариями в n8n я отвечаю на этот вопрос за пять минут: открываю страницу с отключённым JS в DevTools и смотрю, остаётся ли на месте нужный контент.

Requests против Selenium: где заканчивается HTML и начинается браузер

Requests с BeautifulSoup или lxml тянут HTML-документ ровно таким, каким его отдаёт сервер до выполнения скриптов. Для статичных страниц с готовой разметкой - блог на WordPress, каталог на чистом PHP, RSS-лента - этого хватает, и связка отрабатывает за миллисекунды на запрос.

Сложности начинаются там, где контент собирается прямо в браузере после загрузки: SPA на React или Vue, каталоги с бесконечной подгрузкой через XHR, личные кабинеты, где данные приходят уже после авторизации через JS-сессию. На одном проекте цена и остаток товара в каталоге подтягивались отдельным запросом через секунду после рендера страницы - requests получал пустой div с нужным id, а цифры появлялись в DOM только после выполнения скрипта. Здесь и нужен Selenium: он запускает настоящий движок Chrome или Firefox, ждёт события, кликает по элементам и возвращает итоговый DOM, а не сырой ответ сервера.

Как Selenium 4 запускает браузер и находит элементы

С версии 4.6 в библиотеку встроен Selenium Manager - он сам подбирает и скачивает нужную сборку chromedriver под установленный браузер, вручную драйвер качать не приходится. Установка сводится к pip install selenium и запуску Chrome или Firefox в обычном либо headless-режиме.

Базовый сценарий такой: открыть страницу, дождаться появления элемента через WebDriverWait (обычный time.sleep на нестабильных сайтах то зависает, то отдаёт пустые результаты), найти элемент через By.CSS_SELECTOR или By.XPATH, кликнуть по нему или прочитать текст.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
driver.get("https://example.com/catalog")

price = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".product-price"))
)
print(price.text)

driver.quit()

Вложенные iframe, модалки с согласием на cookies, ленивая подгрузка через Intersection Observer - со всем этим Selenium справляется штатно, потому что видит страницу так же, как обычный посетитель в браузере, а не как HTTP-клиент, разбирающий текстовый ответ сервера.

Практические кейсы: где браузерная автоматизация закрывает задачу

На практике браузерная автоматизация чаще всего закрывает пять типов задач, и почти в каждой requests просто не справится:

  • Мониторинг цен и остатков на сайтах конкурентов, где данные подгружаются через JS и открыты без авторизации - Selenium дожидается нужного блока и снимает цифры раз в несколько часов по расписанию.
  • Регрессионное тестирование форм на Tilda после доработки скрипта: заполняю поля, отправляю форму, проверяю редирект и запись в CRM - вручную такой прогон занимает 20-30 минут, скриптом - полторы минуты.
  • Действия в личном кабинете СДЭК, где для нужной операции нет открытого API - эмулирую последовательность оператора: логин, выбор накладной, скачивание этикетки.
  • Сквозное тестирование сценариев бота на aiogram через веб-версию Telegram: проверяю, что бот отвечает на команду и присылает нужную клавиатуру, без ручного клика в приложении на телефоне.
  • Триггер для n8n: HTTP Request node закрывает большинство интеграций, но там, где источник отдаёт данные только после рендера, ставлю отдельный Selenium-воркер, который n8n дёргает по вебхуку и получает готовый JSON в ответ.

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

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Ограничения: скорость, память и честная автоматизация

У Selenium есть цена за возможности. Запуск браузера - это секунды, а не миллисекунды: на холодный старт headless Chrome уходит 1-2 секунды, на такой же запрос через requests - 50-150 мс. Для обхода каталога из 10 000 страниц разница выливается в часы против минут, если сайт вообще отдаёт нужные данные без рендера в JS.

Память тоже ощутимая: один инстанс headless Chrome ест 150-300 МБ, десять параллельных воркеров на сервере - уже 2-3 ГБ, и бюджетный VPS такую нагрузку не потянет, нужен инстанс помощнее.

Вёрстка сайта-источника меняется без предупреждения - ломаются селекторы, и скрипт нужно поддерживать так же, как любой другой код в проде. Для задач сбора открытых данных без авторизации закладываю рандомизацию отпечатка браузера (размер окна, user-agent, часовой пояс), паузы между действиями и соблюдение rate-limit - это снижает число ложных блокировок и не создаёт лишней нагрузки на чужой сервер. Собираю только то, что доступно без авторизации, и с оглядкой на robots.txt - это вопрос не только этики, но и стабильности самого скрипта в долгую.

Selenium, Playwright и requests - что выбрать

Инструмент Выполняет JS Скорость Когда беру
requests + BeautifulSoup Нет Миллисекунды на запрос Статичный HTML, открытые API, RSS-ленты
Selenium Да, полноценный браузер Секунды на страницу Legacy-проекты, широкая поддержка браузеров, готовая инфраструктура Selenium Grid
Playwright Да, полноценный браузер Секунды на страницу, старт чуть быстрее Selenium Новые проекты, встроенное ожидание элементов, стабильная работа с несколькими вкладками

На новых проектах я всё чаще беру Playwright - меньше шаблонного кода на ожидания и стабильнее работа с несколькими вкладками и контекстами одновременно. Но там, где уже развёрнут Selenium Grid, тесты написаны на Java или в контракте прямо указан Selenium (в корпоративных проектах такое встречается регулярно), меняю инструмент только если это оправдано бюджетом и сроками.

Сроки и стоимость внедрения

Простой скрипт на Selenium - открыть страницу, собрать 5-10 полей, сохранить в таблицу или отправить в CRM - занимает 2-3 дня вместе с тестированием на реальных данных сайта-источника. У меня такая задача стоит от 20 000 ₽ (услуга «Парсинг/автоматизация на Python»).

Интеграция с личным кабинетом СДЭК или другой закрытой системой, где нужно логиниться, обрабатывать сессию и держать скрипт устойчивым к изменениям верстки, - это уже комплексная доработка, от 40 000 ₽. Если результат работы Selenium-скрипта нужно встроить в цепочку n8n или в Telegram-бота на aiogram, стоимость самой автоматизации в n8n (от 25 000 ₽) или бота (от 30 000 ₽) считаю отдельно, в зависимости от того, что уже есть у клиента.

На рынке у фрилансеров и в студиях цена похожей задачи гуляет широко - от 10 000 до 150 000 ₽ в зависимости от того, входит ли в неё только код или ещё сервер, мониторинг и правка селекторов при изменении разметки источника. Я обычно закладываю техподдержку отдельно (от 15 000 ₽/мес), потому что сайты меняют вёрстку без предупреждения, и скрипт, который стабильно отработал полгода, может сломаться в любой момент из-за чужого редизайна.

Данные и процессы на автопилоте

Парсинг / Автоматизация

от 20 000 ₽

Подробнее →

Частые вопросы

Чем Selenium отличается от Playwright?

Оба запускают настоящий браузер и выполняют JS, разница в API и деталях: у Playwright встроенное ожидание элементов, почти никогда не нужно вручную городить WebDriverWait, из коробки работает с несколькими вкладками и контекстами. Selenium старше, стабильнее на legacy-проектах и шире по поддержке языков и связке с Selenium Grid для распределённого запуска тестов на разных браузерах.

Нужен ли Selenium для парсинга интернет-магазина на Tilda?

Зависит от конкретного блока. Каталог на стандартном движке Tilda обычно отдаёт товары в HTML сразу, requests с этим справляется без браузера. А вот кастомные виджеты с ценами, подгруженными через отдельный JS-скрипт (частый случай при интеграции с CRM или сторонним прайсом), требуют браузера - Selenium дожидается, пока скрипт отработает, и только потом снимает данные.

Можно ли запускать Selenium на сервере без графического интерфейса?

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

Сколько времени занимает поддержка Selenium-скрипта после сдачи?

Зависит от того, как часто меняется сайт-источник. Спокойный проект требует правки раз в 2-3 месяца, если верстка нестабильна - поломку можно поймать раз в 2-3 недели. Поэтому для регулярного мониторинга рекомендую держать техподдержку, а не чинить скрипт разово каждый раз с нуля.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно