Когда бизнес хочет получать данные со сторонних сайтов — цены конкурентов, отзывы, курсы валют, вакансии — возникает развилка: использовать официальный API или написать скрейпер. У каждого подхода своя цена, своя сложность и свои риски. Разберём оба.
Что такое парсинг и скрейпинг
Эти слова часто используют как синонимы, но разница есть.
Парсинг — это разбор структурированных данных. Получили JSON или XML — распарсили, извлекли нужное. Технически это происходит постоянно: браузер парсит HTML, приложение парсит ответ сервера.
Скрейпинг (web scraping) — сбор данных с сайтов, которые не предназначены для машинного чтения. Вы эмулируете браузер или делаете HTTP-запросы, получаете HTML-страницу и вытаскиваете из неё нужное через CSS-селекторы или XPath.
Простой пример: хотите знать, сколько стоит определённый товар на Wildberries. Если у Wildberries есть API — используете его. Если нет — пишете скрейпер, который загружает страницу товара и достаёт цену из разметки.
Когда есть официальный API — используйте его
Официальный API — это договор. Площадка говорит: «вот endpoint, вот формат данных, вот лимиты». Вы работаете по правилам, данные приходят стабильно, никто вас не блокирует.
Примеры площадок с нормальными API:
- ВКонтакте — API для получения постов, комментариев, статистики сообществ
- HH.ru — открытый API для вакансий и резюме
- ЦБ РФ — XML-фид с курсами валют, обновляется каждый день
- OpenWeatherMap — погода по координатам или городу
- DaData — стандартизация адресов, ФИО, реквизитов
- Ozon, Wildberries — у обоих есть API для продавцов, но не для всех данных
Официальные API бывают платными и бесплатными. OpenWeatherMap даёт 1000 бесплатных запросов в сутки, за большее платите. ЦБ РФ бесплатный. HH.ru бесплатный для базовых запросов.
Работа с API в коде выглядит так:
import requests
# Курс доллара с сайта ЦБ РФ
url = "https://www.cbr-xml-daily.ru/daily_json.js"
response = requests.get(url)
data = response.json()
usd_rate = data["Valute"]["USD"]["Value"]
print(f"Доллар: {usd_rate} ₽")
Десять строк кода — и у вас актуальный курс. Никаких рисков, никаких блокировок.
Когда API нет — идём на скрейпинг
Если площадка не предоставляет API, а данные нужны — остаётся скрейпинг. Типичные случаи:
- Мониторинг цен конкурентов
- Сбор отзывов с картографических сервисов
- Агрегация объявлений с нескольких досок
- Парсинг каталогов, которые не дают выгрузку
Для простых случаев хватает связки requests + BeautifulSoup на Python:
import requests
from bs4 import BeautifulSoup
url = "https://example.com/catalog"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
prices = soup.select(".product-price")
for price in prices:
print(price.text.strip())
Но большинство современных сайтов рендерятся на JavaScript. Обычный HTTP-запрос получит пустую страницу, потому что данные подгружаются динамически. Здесь нужен Playwright или Selenium — инструменты, которые запускают настоящий браузер и ждут, пока страница загрузится.
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/catalog")
page.wait_for_selector(".product-price")
prices = page.query_selector_all(".product-price")
for price in prices:
print(price.text_content())
browser.close()
Playwright в headless-режиме невидим для пользователя, работает в фоне и справляется с 90% динамических сайтов.
Три главные проблемы скрейпинга
1. Блокировки
Сайты не любят ботов. Если вы шлёте 100 запросов в минуту с одного IP — вас заблокируют. Защита бывает разная:
- Rate limiting — больше N запросов в секунду, и вы получаете 429 Too Many Requests
- CAPTCHA — reCAPTCHA, hCaptcha, Яндекс.SmartCaptcha
- Fingerprinting — сайт анализирует заголовки, куки, поведение мыши и понимает, что вы бот
- IP-блокировки — просто банят ваш адрес
Что помогает: ротация User-Agent, случайные задержки между запросами, прокси-серверы, а для серьёзных случаев — специализированные сервисы вроде Bright Data или Oxylabs.
2. Хрупкость
Вёрстка меняется — скрейпер ломается. Обновил сайт-источник CSS-класс с .product-price на .price-block — и ваш скрипт перестал работать. Это основная операционная головная боль: нужен мониторинг и регулярное обслуживание.
3. Юридические риски
Здесь важно понимать несколько вещей. Публично доступные данные (цены, описания, адреса) в большинстве случаев собирать можно. Но:
- Персональные данные — нельзя без согласия, это GDPR и 152-ФЗ
- Данные за авторизацией — нельзя, нарушение условий использования
- Агрессивный скрейпинг, создающий нагрузку на сервер, — это уже ближе к DDoS
Читайте robots.txt и Terms of Service площадки перед тем, как писать скрейпер.
Промежуточный вариант: неофициальные API
Много сайтов имеет внутренние API, которые использует их собственный фронтенд. Откройте DevTools → Network, загрузите страницу и посмотрите XHR-запросы. Часто вы увидите что-то вроде:
GET /api/v2/products?category=phones&page=1
Content-Type: application/json
Это не документированный API, но он работает. Вы можете делать те же запросы — без парсинга HTML, получая чистый JSON. Такой подход надёжнее скрейпинга HTML, но нестабильнее официального API: площадка может в любой момент изменить формат или добавить авторизацию.
Инструменты — что выбрать
| Задача |
Инструмент |
| Статические страницы, простой HTML |
requests + BeautifulSoup |
| Динамические JS-сайты |
Playwright, Puppeteer |
| Масштабный скрейпинг |
Scrapy |
| Обход блокировок |
Bright Data, Oxylabs, Smartproxy |
| Парсинг официальных API |
requests, httpx, aiohttp |
| Визуальный no-code скрейпинг |
Apify, ParseHub |
Scrapy — это целый фреймворк для скрейпинга на Python. Он умеет соблюдать rate limits, следовать по ссылкам, сохранять данные в базу. Для проектов, где нужно обходить тысячи страниц в сутки, это правильный выбор.
Когда это нужно бизнесу
Несколько реальных сценариев:
Ценовой мониторинг. Интернет-магазин хочет автоматически корректировать цены в зависимости от конкурентов. Скрейпер раз в час собирает цены с 5 площадок, складывает в базу, дашборд показывает картину. Это экономит несколько часов ручной работы ежедневно.
Агрегация вакансий. HR-платформа собирает вакансии с hh.ru (через официальный API), Авито (через скрейпинг) и Superjob (через неофициальный API). Всё складывается в единый поиск.
Мониторинг отзывов. Бренд хочет видеть все отзывы о себе в интернете — Яндекс.Карты, 2GIS, отраслевые порталы. Агрегатор собирает их автоматически и отправляет уведомления.
Обогащение данных. CRM хочет автоматически подставлять реквизиты компаний по ИНН. Здесь лучше использовать официальные сервисы — DaData или API ФНС.
Как встроить внешние данные в свой продукт
Полученные данные нужно куда-то складывать и как-то использовать. Типичная архитектура:
- Сборщик — скрипт или сервис, который ходит за данными по расписанию (cron или очередь задач)
- Хранилище — PostgreSQL для структурированных данных, Redis для кеша
- API — ваш бэкенд отдаёт данные фронтенду или другим системам
- Мониторинг — алерты, если сборщик упал или данные перестали обновляться
Это уже полноценная интеграция — и здесь важно сделать всё правильно с первого раза, иначе потом придётся переписывать.
В REEXY такие интеграции делают от 1 500 ₽ — понятно, что конечная цена зависит от сложности: одно дело подключить готовый API с документацией, другое — написать скрейпер с обходом защит и автоматическим перезапуском при сбоях.
Что выбрать — быстрая шпаргалка
- Есть официальный API → используйте его, не изобретайте колесо
- Нет API, но есть внутренний XHR → попробуйте его, сэкономите время
- Нет ничего, данные нужны → скрейпинг, но с пониманием рисков
- Данные нужны в реальном времени и в больших объёмах → смотрите на коммерческие агрегаторы данных, иногда купить готовое дешевле, чем поддерживать свой скрейпер
Главное правило: скрейпинг — это не разовая работа. Это система, которую нужно обслуживать. Если данные нужны критически, закладывайте бюджет на поддержку или ищите официальный источник.