Когда бизнес хочет получать данные со сторонних сайтов — цены конкурентов, отзывы, курсы валют, вакансии — возникает развилка: использовать официальный 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 ФНС.

Как встроить внешние данные в свой продукт

Полученные данные нужно куда-то складывать и как-то использовать. Типичная архитектура:

  1. Сборщик — скрипт или сервис, который ходит за данными по расписанию (cron или очередь задач)
  2. Хранилище — PostgreSQL для структурированных данных, Redis для кеша
  3. API — ваш бэкенд отдаёт данные фронтенду или другим системам
  4. Мониторинг — алерты, если сборщик упал или данные перестали обновляться

Это уже полноценная интеграция — и здесь важно сделать всё правильно с первого раза, иначе потом придётся переписывать.

В REEXY такие интеграции делают от 1 500 ₽ — понятно, что конечная цена зависит от сложности: одно дело подключить готовый API с документацией, другое — написать скрейпер с обходом защит и автоматическим перезапуском при сбоях.

Что выбрать — быстрая шпаргалка

  • Есть официальный API → используйте его, не изобретайте колесо
  • Нет API, но есть внутренний XHR → попробуйте его, сэкономите время
  • Нет ничего, данные нужны → скрейпинг, но с пониманием рисков
  • Данные нужны в реальном времени и в больших объёмах → смотрите на коммерческие агрегаторы данных, иногда купить готовое дешевле, чем поддерживать свой скрейпер

Главное правило: скрейпинг — это не разовая работа. Это система, которую нужно обслуживать. Если данные нужны критически, закладывайте бюджет на поддержку или ищите официальный источник.