Подписывайтесь:

Блог AST-SoftPro

Python-парсеры: от BeautifulSoup до Playwright

19.06.2026 9 мин чтения

Введение в парсинг веб-сайтов

Парсинг — это процесс извлечения данных из HTML-страниц интернета. Он используется для сбора информации: цен на товары, новостей, расписаний и других публичных ресурсов. В Python существует множество библиотек, позволяющих выполнять скрапинг (web scraping) эффективно. Цель этой статьи — сравнить основные подходы к парсингу: от простых решений с BeautifulSoup до продвинутых инструментов вроде Playwright. Особое внимание уделено реальным вызовам: динамическому контенту, защите сайтов и использованию прокси-сервисов для масштабирования запросов. Статья не содержит рекомендаций по коммерческим решениям или описанию конкретных проектов — только техническая информация о возможностях библиотек и практические советы по их применению.

Основные подходы к парсингу в Python

1. BeautifulSoup: простой статический анализ

BeautifulSoup — одна из самых популярных библиотек для начального уровня скрапинга. Она работает с HTML/XML-документами, не требуя выполнения JavaScript. Подходит для сайтов со статическим контентом (например, старые версии страниц или сайты без динамической загрузки).

Пример:

from bs4 import BeautifulSoup
import requests

url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1').text
print(title)

Ограничения:

  • Не работает с динамическим контентом (AJAX, SPA).

  • Может не находить элементы, загружаемые после загрузки страницы.

  • Требует ручного обхода защиты через User-Agent, задержки и прокси.

2. Selenium: автоматизация браузера

Selenium позволяет управлять реальным браузером (Chrome/Edge/Firefox) из Python. Он выполняет JavaScript, может кликать по элементам, заполнять формы — то есть имитирует поведение пользователя.

Пример:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')
title = driver.find_element('tag name', 'h1').text
print(title)
driver.quit()

Плюсы:

  • Полная поддержка JavaScript.

  • Возможность взаимодействия с элементами (клики, ввод).

  • Подходит для сложных сайтов (например, Airbnb, Avito).

Минусы:

  • Высокое потребление ресурсов (RAM, CPU).

  • Медленная скорость — сотни запросов в час могут быть проблематичны.

  • Требует установки драйверов браузера и актуальных версий ChromeDriver/GeckoDriver.

3. Playwright: современная альтернатива Selenium

Playwright — это библиотека от Microsoft (ранее Puppeteer), но с поддержкой Python, JavaScript, Java и других языков. Он работает быстрее, стабильнее и предлагает больше функций по сравнению со старым Selenium. Ключевые преимущества:

  • Поддержка нескольких браузеров (Chromium, Firefox, WebKit) на одной стороне.

  • Высокая скорость: до 10–20 раз быстрее Selenium.

  • Встроенная поддержка headless-режима и автокликов без JS-зависимости.

Пример:

from playwright.sync_api import sync_playwright
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto('https://example.com')
title = page.title()
print(title)
browser.close()

Дополнительные возможности Playwright:

  • page.wait_for_selector() — ожидание появления элемента.

  • page.screenshot(path='screenshot.png') — автоматическая фиксация экрана.

  • Поддержка cookies, localStorage, авторизации через OAuth.

4. Scrapy: фреймворк для массового парсинга

Scrapy — это не библиотека, а полноценный веб-фреймворк на Python. Он ориентирован на обработку тысяч страниц за короткое время и часто используется в production-средах. Преимущества:

  • Высокая производительность (асинхронная обработка).

  • Встроенная система правил (Item Pipeline) для очистки данных.

  • Поддержка middleware, прокси, кастомных обработчиков ошибок. Пример items.py:

import scrapy
class Product(scrapy.Item):
    title = scrapy.Field()
    price = scrapy.Field()
class Review(scrapy.Item):
    rating = scrapy.Field()
    text = scrapy.Field()

Недостатки:

  • Сложнее для новичков (много конфигов).

  • Менее гибкий, чем Selenium/Playwright — не подходит для интерактивных сценариев.

Обход защиты: капчи, rate-limiting и блокировки

Почему сайты блокируют парсеры

Многие сайты блокируют парсеры по нескольким причинам:

  • Высокая частота запросов (rate limiting).

  • Отсутствие User-Agent.

  • Подозрительное поведение (быстрые клики).

  • Антимониторинг: JavaScript-проверки.

Стратегии обхода

1. Использование прокси-сервисов

Прокси позволяют:

  • Маскировать IP при запросах.

  • Распределять нагрузку между несколькими IP.

  • Обходить блокировки по регионам или провайдерам. Рекомендации:

  • Использовать качественные VPS (например, Hetzner, DigitalOcean) вместо бесплатных прокси.

  • Настраивать ротацию через requests.Session():

import requests
session = requests.Session()
session.proxies = {
    'http': 'http://proxy1:port',
    'https': 'http://proxy2:port'
}
  • Избегать IP из стран с высоким риском (Россия, Китай) при работе на международных сайтах.

2. Headless vs GUI-браузеры

Некоторые сайты детектируют headless-режим через:

navigator.hardwareConcurrency() == 1 // true в headless — подозрительно
document.documentMode === undefined // IE-specific flag, может срабатывать

Решение:

  • Использовать --disable-blink-features=AutomationControlled при запуске Playwright.

  • Устанавливать случайные значения для navigator.vendor, window.innerWidth/Height.

3. Запросы через API (если доступно)

Вместо парсинга HTML, стоит искать официальные endpoints:

import requests
url = 'https://api.example.com/products'
token = get_bearer_token_from_credentials()
headers = {'Authorization': f'Bearer {token}'}
data = requests.get(url, headers=headers).json()

API обычно более стабильны и не блокируют запросы.

4. Обработка JavaScript через Playwright

Для SPA (React/Vue/Angular):

  • page.wait_for_selector('#price') — ожидание загрузки динамического контента.

  • page.evaluate('window.scrollTo(0, document.body.scrollHeight); return true;') — имитация прокрутки для lazy-load.

Сравнительная таблица подходов

Библиотека Статический контент Динамический контент Скорость (запросов/мин) Ресурсы Поддержка API
BeautifulSoup ✅ Отличная ❌ Нет 10–50 Низкие Не поддерживается
Selenium ⚠️ Частично ✅ Полная 2–5 Высокие Через JS-автоматизацию
Playwright ⚠️ (с ограничениями) ✅ Отличная 20–100+ Средние Полностью
Scrapy ❌ Только через API 100–1000+ Низкие Да, основная цель

Заключение: выбор инструмента под задачу

  • Для личного использования или тестов — BeautifulSoup достаточно.

  • Для сайтов с AJAX/SPA (например, Avito, Cian) — Playwright предпочтительнее Selenium из-за скорости и стабильности.

  • Для массовой обработки тысяч страниц — Scrapy + API.

  • При высоких требованиях к масштабируемости — комбинация: Playwright для взаимодействия + прокси-пул на VPS + логирование ошибок.

Главное правило при парсинге:

  1. Всегда проверяйте robots.txt и условия использования сайта (Terms of Service).

  2. Не превышайте разумную частоту запросов.

  3. Документируйте свои действия — это снижает риски блокировок и юридических проблем.

AI-Помощник