Все статьиРуководства8 мин

Сбор данных с маркетплейсов в масштабе: руководство для B2B

Как настроить производственный скрейпинг страниц товаров на крупных маркетплейсах: обход Cloudflare, TLS-отпечатки, CAPTCHA, extract_rules vs extract_schema, резидентные и датацентровые прокси.

Команда InfraProxy

20 февраля 2026 г.

#маркетплейсы#масштабирование#Python#extract_rules#TLS#API для скрейпинга

Почему крупные маркетплейсы сложно скрейпить

Крупные маркетплейсы — одни из самых защищённых объектов для веб-скрейпинга. Данные о ценах, наличии, рейтингах и отзывах критичны для конкурентной разведки, мониторинга рынка и ценовой оптимизации, однако получить их в автоматизированном режиме без специальной инфраструктуры практически невозможно.

Cloudflare и антибот-системы. Большинство маркетплейсов используют многоуровневую защиту: проверку TLS-отпечатков, детектирование headless-браузеров, блокировку подозрительных IP. Обычный HTTP-клиент (requests, httpx без специальных настроек) получает 403 или страницу с CAPTCHA уже после нескольких запросов.

TLS-отпечатки. Python-клиенты используют OpenSSL, чей JA3/JA4-отпечаток отличается от Chrome или Firefox. Антибот-системы сравнивают User-Agent с TLS-отпечатком: несоответствие сразу выдаёт автоматизацию.

CAPTCHA. При превышении порога «нормальной» активности пользователю показывается reCAPTCHA v3, hCaptcha или Cloudflare Turnstile. Обойти их без специализированных сервисов или браузерной эмуляции нельзя.

JavaScript-зависимый контент. Цены, наличие, блоки отзывов часто подгружаются через XHR/Fetch после выполнения скриптов. Запрос без рендеринга возвращает пустой или неполный HTML.

Для стабильного сбора в объёмах сотен и тысяч страниц требуется полноценный стек обхода: резидентные прокси, браузерные TLS-профили, решение CAPTCHA и JavaScript-рендеринг.

Стек обхода антиботов

Типичный стек для скрейпинга маркетплейсов включает:

  1. Резидентные прокси — IP домашних провайдеров с высокой репутацией, меньше подвержены блокировкам
  2. TLS-профили браузера — отпечаток Chrome или Firefox вместо OpenSSL
  3. Решение CAPTCHA — интеграция с сервисами автоматического решения или headless-браузер, проходящий проверки
  4. JavaScript-рендеринг — Playwright/Puppeteer для полной загрузки страницы перед извлечением данных

API для скрейпинга объединяет эти компоненты: вы передаёте URL и параметры извлечения, сервис выполняет запрос в защищённой среде и возвращает готовые данные.

Пошаговый Python-скрейпер

Базовый workflow: формирование запроса с extract_rules, отправка в API, парсинг ответа.

Настройка запроса

import httpx
import os

API_KEY = os.environ.get("SCRAPER_API_KEY")
BASE_URL = "https://api.example.com/v1/scrape"

extract_rules = {
    "title": "h1.product-title",
    "price": ".price-value, .product-price",
    "currency": ".price-currency",
    "rating": ".rating-value, .stars",
    "review_count": ".review-count",
    "availability": ".availability span",
    "seller": ".seller-name",
    "features": {
        "selector": ".product-features li",
        "type": "list",
        "fields": {
            "text": ":self"
        }
    }
}

Отправка и обработка ответа

def scrape_product(url: str) -> dict | None:
    payload = {
        "url": url,
        "use_js_render": True,
        "use_residential": True,
        "extract_rules": extract_rules
    }
    with httpx.Client(timeout=60.0) as client:
        resp = client.post(
            BASE_URL,
            json=payload,
            headers={
                "Authorization": f"Bearer {API_KEY}",
                "Content-Type": "application/json"
            }
        )
        resp.raise_for_status()
        data = resp.json()
        return data.get("extract")

Ожидаемый формат ответа

{
  "title": "Product Name Example",
  "price": "29.99",
  "currency": "$",
  "rating": "4.5 out of 5 stars",
  "review_count": "1,234 ratings",
  "availability": "In Stock",
  "seller": "StoreName",
  "features": [
    {"text": "Feature 1"},
    {"text": "Feature 2"}
  ]
}

Параметр use_residential: true заставляет API использовать резидентные прокси — для маркетплейсов это обычно обязательно. use_js_render: true обеспечивает полную загрузку динамического контента.

extract_rules vs extract_schema: когда что использовать

extract_rules — декларативное описание через CSS-селекторы. Быстро, дёшево, предсказуемо. Требует стабильной структуры HTML: при редизайне сайта селекторы могут перестать работать. Идеально для однотипных маркетплейсов с предсказуемой вёрсткой.

extract_schema (AI-экстракция) — описание целевой структуры в виде JSON Schema, модель извлекает данные из страницы без привязки к конкретным тегам. Устойчивее к изменениям разметки, работает с неоднородными и неструктурированными блоками. Минусы: выше стоимость запроса и время обработки.

Рекомендация: начинайте с extract_rules для быстрого старта; при частых поломках из-за A/B-тестов или редизайнов переходите на extract_schema для критичных полей.

Резидентные vs датацентровые прокси

Резидентные прокси — IP домашних пользователей. Максимальная репутация, минимальный процент блокировок. Используйте для маркетплейсов, новостных агрегаторов и любых защищённых площадок. Стоимость выше.

Датацентровые прокси — IP серверов в дата-центрах. Дешевле и быстрее, но маркетплейсы часто блокируют целые подсети. Подходят для внутренних страниц, тестирования и незащищённых каталогов.

На практике: для страниц товаров и поисковой выдачи маркетплейсов — только резидентные. Для бренд-мониторинга своих страниц, если сайт не агрессивно защищён — можно пробовать датацентровые с ротацией и ограничением частоты.

Масштабирование: асинхронные и batch-эндпоинты

При объёмах в тысячи страниц последовательные запросы неэффективны. Используйте:

  1. Асинхронный эндпоинт — отправка URL, получение job_id, опрос статуса до готовности, скачивание результата
  2. Batch-эндпоинт — массив URL в одном запросе, единый результат с массивом extract по каждому URL

Пример асинхронного подхода:

import asyncio
import httpx

async def scrape_batch(urls: list[str], max_concurrent: int = 5) -> list[dict]:
    results = []
    sem = asyncio.Semaphore(max_concurrent)

    async def fetch_one(client: httpx.AsyncClient, url: str):
        async with sem:
            payload = {
                "url": url,
                "use_js_render": True,
                "use_residential": True,
                "extract_rules": extract_rules
            }
            resp = await client.post(BASE_URL, json=payload, headers={"Authorization": f"Bearer {API_KEY}"})
            resp.raise_for_status()
            return {"url": url, "extract": resp.json().get("extract")}

    async with httpx.AsyncClient(timeout=90.0) as client:
        tasks = [fetch_one(client, url) for url in urls]
        results = await asyncio.gather(*tasks)
    return results

Ограничьте max_concurrent (5–15), чтобы не превышать лимиты API и не провоцировать блокировки на стороне целевого сайта. Добавляйте небольшие задержки между батчами при необходимости.

Резюме

  • Крупные маркетплейсы защищены Cloudflare, TLS-проверками и CAPTCHA — необходим полноценный стек обхода
  • API для скрейпинга объединяет резидентные прокси, браузерные TLS-профили, рендеринг и решение CAPTCHA
  • extract_rules подходят для стабильной разметки; extract_schema — при частых изменениях
  • Для страниц товаров используйте резидентные прокси; датацентровые — только для незащищённых источников
  • Масштабируйте через асинхронные и batch-эндпоинты с ограничением concurrency

InfraProxy Scraper API предоставляет резидентные прокси, TLS-профили и обход антиботов для стабильного сбора данных с маркетплейсов в масштабе. Узнайте условия.

Нужны надёжные прокси для вашего проекта?

InfraProxy предоставляет серверные и резидентные прокси для российского бизнеса. Договор, постоплата, техподдержка.