Сбор данных с маркетплейсов в масштабе: руководство для B2B
Как настроить производственный скрейпинг страниц товаров на крупных маркетплейсах: обход Cloudflare, TLS-отпечатки, CAPTCHA, extract_rules vs extract_schema, резидентные и датацентровые прокси.
Команда InfraProxy
20 февраля 2026 г.
Почему крупные маркетплейсы сложно скрейпить
Крупные маркетплейсы — одни из самых защищённых объектов для веб-скрейпинга. Данные о ценах, наличии, рейтингах и отзывах критичны для конкурентной разведки, мониторинга рынка и ценовой оптимизации, однако получить их в автоматизированном режиме без специальной инфраструктуры практически невозможно.
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-рендеринг.
Стек обхода антиботов
Типичный стек для скрейпинга маркетплейсов включает:
- Резидентные прокси — IP домашних провайдеров с высокой репутацией, меньше подвержены блокировкам
- TLS-профили браузера — отпечаток Chrome или Firefox вместо OpenSSL
- Решение CAPTCHA — интеграция с сервисами автоматического решения или headless-браузер, проходящий проверки
- 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-эндпоинты
При объёмах в тысячи страниц последовательные запросы неэффективны. Используйте:
- Асинхронный эндпоинт — отправка URL, получение
job_id, опрос статуса до готовности, скачивание результата - 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 предоставляет серверные и резидентные прокси для российского бизнеса. Договор, постоплата, техподдержка.
Читайте также
Настройка прокси для мониторинга цен конкурентов
Пошаговое руководство по настройке прокси для мониторинга цен: ротация IP, geo-targeting, sticky-сессии, обход антибот-защит. Код на Python и bash.
РуководстваКак настроить прокси для RAG-пайплайна
Практическое руководство по настройке прокси для RAG-пайплайна: архитектура, код на Python, sticky-сессии, расписание обходов. InfraProxy, SOCKS5, 100 000+ IP.
РуководстваNo-code веб-скрейпинг: извлечение данных без программирования
Как настроить сбор данных в 2026 году без написания кода: API для скрейпинга, extract_rules, автоматизация через n8n и Make.com, батчевая обработка 100+ страниц.