Парсинг веб-страниц Python в 2026 году: httpx + BeautifulSoup + Playwright — когда какой использовать
В большинстве руководств по очистке веб-страниц Python от 2018 года по-прежнему рекомендуются requests + BeautifulSoup. С частью «запросов» все в порядке, но теперь есть лучшие значения по умолчанию, и половина современных веб-сайтов отображает контент в JavaScript, поэтому классический стек молча возвращает пустые страницы.
В этом руководстве рассматривается дерево решений 2026 года: когда «httpx + BeautifulSoup» подходит (по-прежнему более 90% сайтов), когда обращаться к «Драматургу», как избежать блокировки и два правила, которые сделают ваш парсер одновременно законным и этичным.
Дерево решений в одном изображении
Вот и все. Девяносто процентов задач парсинга — это статический HTML — классический стек (переименованный) — подходящий инструмент. Остальное требует исполнения JS, и «Драматург» — современный ответ.
Шаг 1: httpx + BeautifulSoup (случай 90%)
httpx — это полная замена requests. Тот же API, плюс поддержка HTTP/2 и встроенная асинхронность. BeautifulSoup не изменился с 2015 года — выбор парсера имеет значение (lxml работает в 5 раз быстрее, чем по умолчанию).
Ключевые варианты:
- `headers={"User-Agent": ...}` — всегда устанавливайте настоящий UA (контактный адрес указывается вежливо). UA по умолчанию
httpxчасто блокируется. - `timeout=10` — никогда не делать неограниченный запрос; зависшие соединения приводят к утечке дескрипторов файлов.
- `raise_for_status()` — рейз на 4xx/5xx, поэтому неудачи громкие, а не тихие.
- `"lxml"` синтаксический анализатор — в 5 раз быстрее, чем стандартный
html.parser, и более прощает искажения HTML. - `soup.select("css-selector")` — трактуйте очистку как «представьте, что вы используете
document.querySelectorAll» JavaScript. Обычно вам нужны CSS-селекторы, а не API обхода по дереву.
Шаг 2: Драматург (когда JS визуализирует контент)
Многие современные SPA (React, Vue, Angular) поставляют пустой <div id="root"> и гидратируют все на стороне клиента. httpx.get предоставляет вам пустую оболочку — нужные вам данные загружаются через fetch после загрузки страницы.
Тест: httpx.get(url).text — поиск нужных данных. Если его нет, сайту необходимо выполнение JS.
Установка: pip install playwright && playwright install chromium (загрузка браузера занимает ~150 МБ — один раз стоит того, болезненно при каждом запуске CI без кэширования).
Стоимость: Playwright в 10-50 раз медленнее, чем httpx (загрузка страницы + выполнение JS + накладные расходы браузера). Используйте его только в том случае, если данные не находятся в статическом HTML.
Четыре способа быть заблокированным
Большинство систем защиты от царапин отслеживают эти четыре отпечатка пальца:
1. Отсутствует/очевиден пользовательский агент
2. Нет задержки между запросами
Необработанные последовательные запросы забивают сервер. Добавьте задержку, пропорциональную времени ответа — если страница обслуживается 500 мс, подождите 500–2000 мс между запросами. asyncio.sleep(random.uniform(0.5, 2.0)).
3. Запрос запрещенных путей /robots.txt
Некоторые сайты используют файл robots.txt для достоверных сигналов скорости — проверьте перед парсингом:
4. Несовпадение отпечатков TLS и браузера
Расширенная защита от очистки (Cloudflare, DataDome) позволяет получить отпечатки пальцев вашего рукопожатия TLS и среды JS. httpx не похож на Chrome на уровне TLS. Опции:
curl_cffi— библиотека на основе олицетворения завитка, которая имитирует настоящий браузерный TLS.
— Драматург — настоящий браузер TLS по определению.
- Ротация резидентных прокси — ядерный вариант.
Для 99% случаев использования (не враждебные сайты, умеренный объем, вход в систему не требуется) достаточно уважения к httpx + реальный UA + задержка + robots.txt. Если вы масштабно очищаете сайты, защищенные Cloudflare, вам нужны настоящие браузеры или платные услуги разблокировки.
Ограничение скорости (семафор + схема сна)
Для массового парсинга объедините asyncio.Semaphore (максимальное число одновременностей) с asyncio.sleep (задержка для каждого запроса):
Ограничение на уровне 5–10 одновременных запросов + задержка 500 мс–2 с на запрос позволяет значительно снизить уровень срабатывания сигналов тревоги об ограничении скорости на большинстве сайтов.
Юридические и этические правила
1. Прочтите Условия обслуживания сайта. Многие из них прямо запрещают сбор данных — вы все равно можете это делать (ToS — это договорное право, а не уголовное право в большинстве юрисдикций), но вы берете на себя юридический риск. В деле LinkedIn v. hiQ (2022 г.) было установлено, что сбор общедоступных данных не является нарушением CFAA в США, но ношение толстовки с капюшоном не делает вас невидимым.
2. Не собирайте личные данные. GDPR/CCPA/все остальное предусматривает наказание за сбор личной информации без согласия. Если вы создаете набор данных «сотрудники компании X», остановитесь.
Этические дополнения, о которых все забывают:
- Отправьте реальный контактный адрес в вашем UA. Если ваш бот вызывает проблемы, владелец сайта сможет написать вам по электронной почте.
- Если вы кэшируете данные сайта, кэшируйте агрессивно — не затрагивайте их серверы при каждом запуске.
– Отдавайте предпочтение общедоступным API, даже если они платные. Дешевле, чем юридический риск.
Обзор инструментов 2026 года
| Задача | Достичь |
|---|---|
| Статические HTML-страницы | httpx + BeautifulSoup(html, "lxml") |
| JS-рендеринг SPA | Драматург (Хром без головы) |
| Cloudflare/антибот | curl_cffi или Драматург + резидентный прокси |
| Выскабливание больших объемов | httpx.AsyncClient + Семафор + сон |
| Структурированные данные API | httpx.get + .json() — суп не нужен |
Парсинг веб-страниц в 2026 году на 90% по-прежнему будет использовать «httpx + BeautifulSoup», плюс знание того, когда следует перейти к реальному браузеру. Овладейте навыками вежливого парсинга (настоящий UA, семафор, сон, robots.txt), и вы сможете построить надежные конвейеры данных, не подвергаясь блокировке или судебному преследованию.
Следующий шаг: Наука о данных содержит 15 уроков по парсингу, ETL и pandas — вы создадите настоящий сквозной конвейер от выборки HTTP до DataFrame и экспорта CSV.