Блог AST-SoftPro
Python-парсеры: от BeautifulSoup до Playwright
Введение в парсинг веб-сайтов
Парсинг — это процесс извлечения данных из 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 + логирование ошибок.
Главное правило при парсинге:
-
Всегда проверяйте
robots.txtи условия использования сайта (Terms of Service). -
Не превышайте разумную частоту запросов.
-
Документируйте свои действия — это снижает риски блокировок и юридических проблем.