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

Скрейпинг товарных агрегаторов с обходом CAPTCHA

Как собирать данные с товарных агрегаторов и ценовых площадок: обход антибот-защиты, TLS-профили, CAPTCHA, extract_rules, extract_schema и масштабирование через batch API.

Команда InfraProxy

20 февраля 2026 г.

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

Почему стандартный скрейпинг не работает на товарных агрегаторах

Товарные агрегаторы и ценовые площадки — важный источник данных для мониторинга цен, конкурентной разведки и ценовой оптимизации. При этом эти ресурсы относятся к числу наиболее защищённых: попытки автоматизированного сбора данных быстро натыкаются на блокировки, CAPTCHA и «пустые» страницы. Классические методы скрейпинга здесь не работают.

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

Поведенческий анализ. Продвинутые системы отслеживают паттерны запросов, скорость навигации, наличие скролла и движения мыши. Простой HTTP-запрос не генерирует «человеческое» поведение.

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

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

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

Решение: API для скрейпинга с обходом антиботов

Scraper API (API для скрейпинга) объединяет все необходимые компоненты:

  • TLS-профили браузера — отпечаток Chrome или Firefox вместо OpenSSL
  • JavaScript-рендеринг — headless Chrome для полной загрузки динамического контента
  • Решение CAPTCHA — автоматическое определение и обработка reCAPTCHA, hCaptcha, Turnstile
  • Резидентные прокси — IP домашних провайдеров с высокой репутацией

Вы передаёте URL и правила извлечения — получаете структурированный JSON. Вся логика обхода защит инкапсулирована в сервисе.

Рабочий Python-пример с extract_rules

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

import httpx
import os

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

payload = {
    "url": "https://example.com/shopping/results?q=laptop",
    "use_antibot": True,
    "tls_profile": "chrome124",
    "use_js_render": True,
    "solve_captcha": True,
    "use_residential": True,
    "extract_rules": {
        "products": {
            "selector": ".product-card, .search-result-item",
            "type": "list",
            "fields": {
                "title": "h3 a, .product-title",
                "price": ".price-value, .amount",
                "currency": ".currency",
                "rating": ".rating-stars",
                "review_count": ".reviews-count",
                "link": "a@href",
                "image": "img@src"
            }
        }
    }
}

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()
    products = data.get("extract", {}).get("products", [])
    print(f"Извлечено {len(products)} товаров")

Параметры:

  • use_antibot — включение стека обхода антибот-защиты
  • tls_profile — TLS-отпечаток браузера (chrome124, firefox и т.д.)
  • use_js_render — рендеринг JavaScript
  • solve_captcha — автоматическое решение CAPTCHA при появлении
  • use_residential — резидентные прокси

Важные нюансы и подводные камни

Хрупкость extract_rules

extract_rules основаны на CSS-селекторах. При изменении вёрстки агрегатора (A/B-тесты, редизайн) селекторы перестают работать, и extract возвращается пустым. Рекомендуется мониторинг: если доля пустых ответов растёт — обновить правила или перейти на extract_schema.

Стоимость solve_captcha

Каждый вызов решения CAPTCHA тарифицируется отдельно. При высокой частоте CAPTCHA расходы растут. Оптимизируйте: используйте резидентные прокси и session_id для многостраничной навигации — это снижает долю запросов с CAPTCHA.

Резидентные прокси обязательны

Датацентровые IP на товарных агрегаторах блокируются очень быстро. Параметр use_residential: true для такого типа источников по сути обязателен.

networkidle vs load

При use_js_render указывайте, когда считать страницу загруженной:

  • load — событие load страницы (быстрее, но контент может ещё подгружаться)
  • networkidle — отсутствие сетевой активности в течение заданного времени (надёжнее для динамического контента, но дольше)

Для агрегаторов с бесконечным скроллом и отложенной подгрузкой часто нужен js_wait_for — селектор элемента, появление которого говорит о готовности нужного блока.

extract_schema для сложных вложенных структур

Если данные имеют сложную вложенную структуру или разметка часто меняется, используйте extract_schema — описание целевой JSON-схемы. Модель извлекает данные без привязки к конкретным селекторам:

{
  "url": "https://example.com/shopping/results?q=monitor",
  "use_js_render": true,
  "solve_captcha": true,
  "extract_schema": {
    "products": {
      "type": "array",
      "items": {
        "title": {"type": "string"},
        "price": {"type": "number"},
        "currency": {"type": "string"},
        "rating": {"type": "number"},
        "link": {"type": "string"}
      }
    }
  }
}

Преимущества: устойчивость к изменениям разметки. Недостатки: выше стоимость и латентность запроса.

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

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

Асинхронный подход

import asyncio
import httpx

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

    async def fetch_one(client: httpx.AsyncClient, url: str):
        async with sem:
            payload = {
                "url": url,
                "use_antibot": True,
                "use_js_render": True,
                "solve_captcha": 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]
        return await asyncio.gather(*tasks)

Ограничьте max_concurrent (10–20), чтобы не превышать лимиты API и не провоцировать блокировки.

Batch-эндпоинт

Многие API поддерживают batch-режим: отправка массива URL в одном запросе, получение job_id, опрос статуса или webhook при готовности, скачивание объединённого результата. Это снижает накладные расходы на соединения и упрощает оркестрацию.

Резюме

  • Товарные агрегаторы защищены фингерпринтингом, TLS-проверками и CAPTCHA — стандартный скрейпинг не работает
  • API для скрейпинга с антибот-режимом: TLS-профили, JS-рендеринг, решение CAPTCHA, резидентные прокси
  • extract_rules — быстрый старт; при нестабильной разметке — extract_schema
  • Учитывайте: хрупкость селекторов, стоимость solve_captcha, обязательность резидентных прокси, выбор networkidle vs load
  • Масштабируйте через асинхронные запросы с ограничением concurrency или batch-эндпоинт

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

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

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