Как парсить Walmart на Python в 2026 году (и не попасть под блокировку)

Последнее обновление: April 28, 2026
Как парсить Walmart на Python в 2026 году (и не попасть под блокировку)

Walmart меняет цены на некоторые товары несколько раз в день. Если вы когда-нибудь пытались отслеживать это программно, то знаете, насколько это мучительно: скрипт спокойно работает 20 минут, а потом тихо начинает возвращать страницы CAPTCHA, замаскированные под обычные ответы 200 OK.

Я потратил много времени на обход антибот-защиты Walmart в рамках нашей работы по извлечению данных в Thunderbit, и хочу поделиться всем, что узнал: какие методы действительно работают в 2025 году, какие тихие сбои отравляют ваши данные и какие честные компромиссы есть между написанием собственного скрейпера, оплатой scraping API и использованием no-code инструмента. В этом руководстве разобраны три метода извлечения данных — парсинг HTML, JSON из __NEXT_DATA__ и перехват внутренних API, — production-уровень обработки ошибок, которую большинство туториалов полностью пропускает, и честная схема выбора подходящего подхода. Здесь найдётся что-то полезное и для тех, кто пишет на Python, и для тех, кому к обеду нужна просто таблица с ценами.

Зачем парсить Walmart на Python?

Walmart — крупнейший в мире ритейлер по выручке: $680,985 млрд в 2025 финансовом году, и он 12 лет подряд удерживает первое место в Fortune Global 500. На сайте размещено примерно 420 миллионов активных карточек товаров, а финансовый директор Walmart говорил о «полумиллиарде SKU» на маркетплейсе. Около 95% этих карточек приходят от сторонних продавцов, а значит каталог очень нестабилен: продавцы меняются, вариации товаров обновляются, а наличие на складе может меняться ежедневно.

walmart_stats_670d06c6bd.png

Именно из-за этой нестабильности парсинг так важен. Квартальный отчёт не покажет того, что видно при ночном сборе данных. Вот самые частые сценарии использования:

СценарийКому нужноЧто извлекают
Мониторинг цен конкурентовE-commerce-операции, инструменты переоценкиЦены, акции, соблюдение MAP
Обогащение каталога товаровКоманды продаж и мерчандайзингаОписания, изображения, характеристики, вариации
Отслеживание наличияЦепочка поставок, дропшипперыСтатус запасов, информация о продавце
Маркетинговые исследования и анализ трендовМаркетинг, product-менеджерыРейтинги, отзывы, ассортимент категории
Генерация лидовОтделы продажНазвания продавцов, количество товаров, категории

Только рынок софта для мониторинга цен конкурентов достиг $1,92 млрд в 2025 году и, по прогнозам, вырастет до $5,09 млрд к 2033 году. Поведение покупателей двигает этот спрос: 94% клиентов сравнивают цены во время онлайн-покупок, а 83% сравнивают предложения на нескольких сайтах.

Python — язык по умолчанию для этой задачи. В отчёте Apify Infrastructure Report 2026 указано, что Python используется в 71,7% всех задач web scraping, а у базовой библиотеки (requests) — около 30 миллионов загрузок в неделю. Если вы парсите в каком-либо масштабе, почти наверняка делаете это на Python.

Почему Walmart — один из самых сложных сайтов для парсинга

Walmart сложен прежде всего потому, что использует два коммерческих anti-bot-продукта подряд: Akamai Bot Manager как edge WAF и слой TLS-фингерпринтинга, а затем PerimeterX (переименованный в HUMAN Security) как JavaScript-слой поведенческой проверки. В Scrape.do эту комбинацию называют «редкой и чрезвычайно трудной для обхода».

walmart_antibot_3d67d0119c.png

ScrapeOps оценивает сложность парсинга Walmart на 9/10, причём только Akamai тоже получает 9/10. По моему опыту, это довольно точная оценка.

Вот с чем вы на самом деле сталкиваетесь:

Akamai Bot Manager проверяет TLS-фингерпринт (хеш JA3/JA4), порядок кадров HTTP/2, порядок и регистр заголовков, а также session cookies (_abck, ak_bmsc). Обычный вызов Python requests выдаёт TLS-фингерпринт, который не создаёт ни один реальный браузер — Akamai помечает его ещё до того, как запрос добирается до серверов Walmart.

PerimeterX/HUMAN срабатывает после Akamai и выполняет JavaScript-фингерпринтинг (px.js), проверяя свойства navigator, рендеринг canvas, WebGL, audio context и поведенческие биометрические сигналы (движение мыши, скорость прокрутки, динамику нажатий). Видимая форма отказа — печально известная проверка «Press & Hold»: нужно удерживать кнопку около 10 секунд, пока собираются поведенческие сигналы. Oxylabs формулирует это прямо: «Walmart использует модель CAPTCHA “Press & Hold”, предоставляемую PerimeterX, и её почти невозможно решить из кода».

По-настоящему опасное поведение — это тихая блокировка. Walmart возвращает HTTP 200 с телом CAPTCHA вместо 403. ScrapingBee подтверждает: «Walmart возвращает статус 200 OK даже тогда, когда отдаёт страницу CAPTCHA. По одному статус-коду нельзя понять, успешен ли запрос». Ваш скрипт спокойно парсит HTML CAPTCHA как «товар не найден» и идёт дальше. Половина датасета превращается в мусор, а вы об этом даже не знаете.

Затем возникает проблема данных, привязанных к магазину. Цены и наличие на Walmart зависят от локации и управляются cookie, такими как locDataV3 и assortmentStoreId. Без нужных cookie вы получаете «дефолтные национальные» данные, которые могут выглядеть полными, но не совпадают с тем, что видят реальные покупатели. Отсутствие cookie не даёт страницу блокировки — оно даёт неверные данные без видимого сбоя, а это хуже.

Три способа извлечь данные с Walmart и как они сравниваются

Прежде чем переходить к пошаговым инструкциям, вот три основных подхода к извлечению данных. Большинство статей конкурентов описывают только один или два. Я разберу все три, чтобы вы могли выбрать подходящий именно для своей ситуации.

МетодНадёжностьПолнота данныхСложность обхода антиботаБремя поддержки
HTML + BeautifulSoup⚠️ Низкая (селекторы ломаются при каждом деплое)СредняяВысокаяВысокое
JSON из __NEXT_DATA__✅ ХорошаяВысокаяСредне-высокаяСреднее
Перехват внутренних API✅ ЛучшееМаксимальная (вариации, наличие, отзывы)Средне-высокаяНизкое (структурированный JSON)
Thunderbit (no-code)✅ ХорошаяВысокаяНизкая (обрабатывается ИИ)Отсутствует

Парсинг HTML — худший вариант для Walmart: сайт использует Next.js с хешированными CSS-классами, которые меняются при каждом деплое. Метод с JSON из __NEXT_DATA__ — практичный выбор, который используют все серьёзные open-source-скрейперы Walmart 2024–2026 годов. Перехват внутренних API — самый мощный подход, но у него есть нюансы, о которых большинство туториалов умалчивает. А Thunderbit — правильный выбор, когда вам вообще не нужен кастомный пайплайн.

Попробуйте Thunderbit для парсинга Walmart

Настройка Python-среды для парсинга Walmart

Вот что вам понадобится:

  • Сложность: средняя
  • Время на подготовку: около 30 минут на настройку, плюс время на код
  • Что понадобится: Python 3.10+, pip, редактор кода и, для production, прокси-сервис или scraping API

Создайте папку проекта и виртуальное окружение:

mkdir walmart-scraper && cd walmart-scraper
python -m venv venv
source venv/bin/activate  # На Windows: venv\Scripts\activate

Установите нужные библиотеки:

pip install curl_cffi parsel beautifulsoup4 lxml

curl_cffi — это стандарт 2025 года для парсинга сложных целей. Это обёртка над libcurl, которая умеет имитировать точные TLS-фингерпринты браузеров. Bright Data объясняет: «Walmart использует TLS-фингерпринтинг как часть своей системы обнаружения ботов, и даже установка User-Agent, имитирующего реальный браузер, не обойдёт это». Обычные requests или httpx не смогут пройти Akamai независимо от того, какие заголовки вы зададите. Именно curl_cffi с impersonate="chrome124" и даёт разницу.

Ещё вам понадобятся json (встроенный модуль), csv (встроенный модуль), time, random и logging — для production-паттернов, которые мы разберём позже.

Пошагово: парсинг страниц товаров Walmart на Python

Шаг 1: Получите страницу товара Walmart

Первая задача — сделать HTTP-запрос, который не будет немедленно заблокирован. Ниже приведён канонический набор заголовков, который в 2024–2026 годах используют Scrapfly, Scrapingdog, Oxylabs и ScrapeOps:

from curl_cffi import requests

HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/124.0.0.0 Safari/537.36"
    ),
    "Accept": (
        "text/html,application/xhtml+xml,application/xml;q=0.9,"
        "image/avif,image/webp,*/*;q=0.8"
    ),
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Referer": "https://www.google.com/",
}

session = requests.Session(impersonate="chrome124")
url = "https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/1752657021"
response = session.get(url, headers=HEADERS)

Параметр impersonate="chrome124" здесь делает основную работу. Он сообщает curl_cffi, что нужно в точности повторить TLS ClientHello Chrome 124, порядок кадров HTTP/2 и последовательность pseudo-header. Без этого Akamai видит Python-специфичный JA3-хеш и блокирует вас ещё до того, как запрос доходит до уровня приложения Walmart.

Как выглядит заблокированный ответ: если в заголовке HTML ответа вы видите "Robot or human?" или если ответ перенаправляет на walmart.com/blocked, вас поймали. Сложность в том, что Walmart часто возвращает статус 200 вместе с телом CAPTCHA, поэтому проверять только response.ok недостаточно.

Для любого production-сценария или повторяющегося использования вам понадобятся residential proxies. Datacenter-IP мгновенно сжигаются системой репутации IP у Akamai. Полную стратегию обработки ошибок и прокси я разберу в разделе о production ниже.

Шаг 2: Извлеките данные товара из JSON в __NEXT_DATA__

Walmart.com — это приложение Next.js, а серверный HTML встраивает полный hydration payload в один тег <script id="__NEXT_DATA__" type="application/json">. Это настоящая золотая жила.

Руководство Scrapfly 2026 года подтверждает: «В 2026 году Walmart использует Next.js со структурированным JSON в тегах скрипта __NEXT_DATA__, поэтому извлечение скрытых данных надёжнее, чем традиционный парсинг CSS-селекторами». Все известные open-source-скрейперы Walmart — Scrapfly, Oxylabs, python-scrapy-playbook — используют именно этот метод.

Вот как это извлечь:

import json
from parsel import Selector

sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})

Большинство туториалов останавливаются здесь. Ниже приведена полная карта JSON-путей для полей, которые действительно важны — проверенная на живых страницах Walmart в 2024–2026 годах:

Поле данныхJSON-путь (внутри initialData)ТипПримечания
Название товараdata > product > nameString
Брендdata > product > brandString
Текущая цена (число)data > product > priceInfo > currentPrice > priceFloatМожет отличаться в зависимости от cookie магазина
Текущая цена (строка)data > product > priceInfo > currentPrice > priceStringStringФормат, например "$9.99"
Краткое описаниеdata > product > shortDescriptionHTML StringДля текста парсите через BeautifulSoup
Длинное описаниеdata > idml > longDescriptionHTML StringНаходится в idml, а НЕ внутри product — именно здесь многие старые туториалы ошибаются
Все изображенияdata > product > imageInfo > allImagesArrayСписок объектов {id, url}
Средний рейтингdata > product > averageRatingFloatКлюч — averageRating, а не устаревший rating
Количество отзывовdata > product > numberOfReviewsInteger
Вариацииdata > product > variantCriteriaArrayГруппы опций (размер, цвет)
Наличиеdata > product > availabilityStatusStringIN_STOCK, OUT_OF_STOCK, LIMITED_STOCK
Продавецdata > product > sellerDisplayNameString
Производительdata > product > manufacturerNameString

Путь longDescription — это ловушка, в которую попадает очень много людей. Пост ScrapeHero за 2023 год помещал его в product.longDescription, но источники 2024+ стабильно относят его к соседнему ключу idml. Всегда сначала читайте idml.longDescription, а для старых страниц используйте fallback на product.longDescription.

Вот безопасный шаблон извлечения через цепочки .get():

def extract_product(data):
    product = data["props"]["pageProps"]["initialData"]["data"]["product"]
    idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})

    price_info = product.get("priceInfo", {})
    current_price = price_info.get("currentPrice", {})
    image_info = product.get("imageInfo", {})

    return {
        "name": product.get("name"),
        "brand": product.get("brand"),
        "price": current_price.get("price"),
        "price_string": current_price.get("priceString"),
        "short_desc": product.get("shortDescription"),
        "long_desc": idml.get("longDescription", product.get("longDescription")),
        "images": [img.get("url") for img in image_info.get("allImages", [])],
        "rating": product.get("averageRating"),
        "review_count": product.get("numberOfReviews"),
        "variants": product.get("variantCriteria"),
        "availability": product.get("availabilityStatus"),
        "seller": product.get("sellerDisplayName"),
        "manufacturer": product.get("manufacturerName"),
    }

Для тех, кто вообще не хочет заниматься навигацией по JSON-путям, ИИ Thunderbit автоматически распознаёт и структурирует эти поля — вручную сопоставлять пути не нужно. Вы нажимаете «AI Suggest Fields», он читает страницу, и вы получаете таблицу. Но если вы строите кастомный пайплайн, карта выше — ваш ориентир.

Шаг 3: Перехватите внутренние API-эндпоинты Walmart для более богатых данных

Ни одна статья конкурентов не объясняет этот метод нормально. Это самый мощный путь извлечения — и самый сложный.

Фронтенд Walmart обращается к federated GraphQL-бэкенду на базе Apollo Gateway. Эндпоинты находятся под www.walmart.com/orchestra/*:

  • /orchestra/pdp/graphql/... — гидрация карточки товара + переключение вариаций
  • /orchestra/snb/graphql/... — постраничная выдача search-n-browse
  • /orchestra/reviews/graphql/... — постраничные отзывы

Они возвращают чистый, структурированный JSON с данными, которые __NEXT_DATA__ иногда урезает: цены на уровне вариаций, актуальное количество на складе, полную пагинацию отзывов.

Нюанс, который обходят стороной в блогах: Walmart использует Apollo persisted queries. В теле запроса передаётся только SHA-256-хеш (persistedQuery.sha256Hash), а не текст запроса. Если сервер не знает этот хеш, вы получаете PersistedQueryNotFound. Walmart меняет эти хеши при каждом деплое. Именно поэтому ни один из известных open-source-скрейперов Walmart не публикует код для /orchestra/, который можно просто скопировать и вставить.

Практическая и честная версия этого метода — работа через DevTools:

  1. Откройте страницу товара Walmart в Chrome
  2. Откройте DevTools → вкладка Network, фильтр «Fetch/XHR»
  3. Обычным образом взаимодействуйте со страницей: переключайте вариации, прокручивайте к отзывам, меняйте магазин
  4. Ищите запросы к эндпоинтам /orchestra/*, которые возвращают JSON с данными товара
  5. Нажмите правой кнопкой по запросу → «Copy as cURL»
  6. Преобразуйте cURL в Python с помощью curl_cffi

Вот как выглядит повторно проигранный API-вызов:

import json
from curl_cffi import requests

session = requests.Session(impersonate="chrome124")

# Сначала прогрейте сессию, открыв страницу товара
session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)

# Затем воспроизведите внутренний API-вызов (скопированный из DevTools)
api_url = "https://www.walmart.com/orchestra/pdp/graphql"
api_headers = {
    **HEADERS,
    "accept": "application/json",
    "content-type": "application/json",
    "referer": "https://www.walmart.com/ip/some-product/1234567",
    "wm_qos.correlation_id": "your-copied-correlation-id",
}
payload = {
    # Вставьте точное тело запроса из DevTools
    "variables": {"productId": "1234567"},
    "extensions": {
        "persistedQuery": {
            "version": 1,
            "sha256Hash": "the-hash-you-copied"
        }
    }
}

api_response = session.post(api_url, headers=api_headers, json=payload)
api_data = api_response.json()

Этап прогрева сессии критически важен. Cookie PerimeterX (_px3, _pxhd, ACID) должны быть установлены первым HTML-запросом до того, как API-вызов сможет успешно выполниться. Без них вы получите 412 или 403.

Когда использовать этот метод: когда вам нужны данные, которых нет в __NEXT_DATA__, — глубокие цены по вариациям, постраничные отзывы beyond first batch или актуальные остатки в реальном времени. Для большинства задач __NEXT_DATA__ достаточно и он гораздо проще.

Парсинг результатов поиска Walmart и нескольких страниц

Результаты поиска следуют схожему шаблону __NEXT_DATA__, но с другим JSON-путём:

search_url = "https://www.walmart.com/search?q=laptops&page=1"
response = session.get(search_url, headers=HEADERS)

sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)

search_result = data["props"]["pageProps"]["initialData"]["searchResult"]
items = search_result["itemStacks"][0]["items"]

# Исключаем спонсируемые товары
organic_items = [i for i in items if i.get("__typename") == "Product"]

for item in organic_items:
    print(item.get("name"), item.get("priceInfo", {}).get("currentPrice", {}).get("price"))

Пагинация работает простым увеличением параметра page: &page=1, &page=2 и т. д. Но вот undocumented-ограничение: Walmart ограничивает результаты поиска 25 страницами, независимо от фактического общего количества. Scrapfly подтверждает: «Walmart устанавливает максимальное количество доступных страниц результатов на 25, независимо от общего числа страниц».

Обходные пути для более глубокого покрытия:

  • Чередование сортировки: запускайте тот же запрос с &sort=price_low, а затем с &sort=price_high, чтобы получить покрытие примерно до 50 страниц
  • Разбиение по ценовому диапазону: добавляйте &min_price=X&max_price=Y, чтобы разбить каталог на более узкие окна
  • Разбиение по категориям: ищите внутри конкретных категорий, а не по всему сайту

Обратите внимание, что itemStacks — это массив. В своём репозитории Scrapfly жёстко использует [0], но на страницах категорий и browse иногда бывает несколько стеков («Top picks», «More results»). Надёжный шаблон перебирает все стеки:

for stack in search_result.get("itemStacks", []):
    for item in stack.get("items", []):
        if item.get("__typename") == "Product":
            # обработка item
            pass

Также важно: в robots.txt Walmart запрещает /search. Страницы карточек товара (/ip/...) и большинство страниц категорий (/cp/...) не запрещены. Если вас волнует compliance, начните с страниц товаров и дерева категорий, а не с поиска.

Не дайте тихим блокировкам испортить ваши данные: production-уровень обработки ошибок

Большинство туториалов разваливается именно здесь. В них показывают, как получить одну страницу, распарсить один товар и на этом закончить. В production вы получаете тысячи страниц, а Walmart активно пытается вас остановить. Разница между демо-скрейпером и скрейпером, который реально работает, — в том, как он переживает ошибки.

Обнаруживайте тихие блокировки до того, как они испортят данные

Самая важная функция в Walmart-скрейпере — детектор блокировки. По общему мнению поставщиков, включая ScrapingBee, Scrapingdog, Oxylabs и Decodo, нужны четыре независимые проверки:

BLOCK_MARKERS = (
    "Robot or human",
    "Press &amp; Hold",
    "Press & Hold",
    "px-captcha",
    "perimeterx",
)

def is_walmart_blocked(response) -> bool:
    # 1. Редирект на отдельный endpoint блокировки
    if "/blocked" in str(response.url):
        return True
    # 2. Жёсткие статусы
    if response.status_code in (403, 412, 428, 429, 503):
        return True
    # 3. 200 OK с телом CAPTCHA (случай тихой блокировки)
    body = response.text or ""
    if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
        return True
    # 4. Проверка длины ответа — реальные PDP обычно 300–900 КБ
    if len(response.content) < 50_000 and "/ip/" in str(response.url):
        return True
    return False

Четвёртая проверка — по длине ответа — ловит случаи, когда Walmart возвращает урезанную страницу без явных маркеров CAPTCHA, но и без нужных данных товара.

Логика повторов с экспоненциальной задержкой и jitter

Если запрос не удался, не стоит сразу же долбить Walmart повторно. Стандартный подход — экспоненциальный backoff с jitter, чтобы развести повторы по времени:

import time
import random
import logging
from curl_cffi import requests as cffi_requests

log = logging.getLogger("walmart")

def fetch_with_retry(session, url, max_retries=5, base_delay=2, max_delay=60):
    for attempt in range(max_retries):
        try:
            response = session.get(url, headers=HEADERS, timeout=15)

            if response.status_code in (429, 503):
                raise Exception(f"Throttled: {response.status_code}")

            if is_walmart_blocked(response):
                raise Exception("Silent block detected")

            return response

        except Exception as e:
            if attempt == max_retries - 1:
                raise

            wait = min(max_delay, base_delay * (2 ** attempt)) + random.uniform(0, 3)
            log.warning(f"Attempt {attempt + 1} failed: {e}. Retrying in {wait:.1f}s")
            time.sleep(wait)

    return None

Jitter (random.uniform(0, 3)) — это не косметика. Он рассинхронизирует воркеры, чтобы целый парк скрейперов не повторял запросы в одну и ту же секунду и не попадал в velocity-детекторы Akamai.

Rate limiting

И Thunderbit, и Scrape.do сходятся на случайной задержке 3–6 секунд на каждый запрос для Walmart: «снижайте частоту запросов, ожидая 3–6 секунд между загрузками страниц и рандомизируя задержки».

import time
import random

def rate_limited_fetch(session, url):
    response = fetch_with_retry(session, url)
    time.sleep(random.uniform(3.0, 6.0))
    return response

При больших объёмах стоит использовать aiolimiter для асинхронного rate limiting:

from aiolimiter import AsyncLimiter
limiter = AsyncLimiter(max_rate=10, time_period=60)  # 10 запросов в минуту

Валидация данных

Даже если ответ не заблокирован, распарсенные данные могут оказаться неверными (не тот магазин, деградировавший payload). Проверяйте их перед записью в выходной файл:

def validate_product(product):
    """Возвращает True, если данные товара выглядят корректными."""
    if not product.get("name"):
        return False

    price = (product.get("priceInfo") or {}).get("currentPrice", {}).get("price")
    if not isinstance(price, (int, float)) or price <= 0:
        return False

    if product.get("availabilityStatus") not in ("IN_STOCK", "OUT_OF_STOCK", "LIMITED_STOCK"):
        return False

    return True

Логирование сессий

Отслеживайте процент успешных запросов по каждой сессии. Когда он падает ниже 80% в течение 10 минут, что-то изменилось: либо ваш IP уже сгорел, либо cookie истекли, либо Walmart выкатил новое антибот-правило.

class ScrapeMetrics:
    def __init__(self):
        self.total = 0
        self.success = 0
        self.blocks = 0
        self.errors = 0

    def record(self, result):
        self.total += 1
        if result == "success":
            self.success += 1
        elif result == "blocked":
            self.blocks += 1
        else:
            self.errors += 1

    @property
    def success_rate(self):
        return (self.success / self.total * 100) if self.total > 0 else 0

    def check_health(self):
        if self.total > 20 and self.success_rate < 80:
            log.critical(f"Success rate dropped to {self.success_rate:.1f}% — consider rotating proxies or pausing")

Не слишком красиво. Но именно это помогает держать данные чистыми.

DIY Python vs scraping API vs no-code: как выбрать правильный способ парсить Walmart

Многие разработчики сразу бросаются писать кастомный скрейпер, не спрашивая себя, действительно ли это правильный выбор. ScrapeOps оценивает Walmart на 9/10 по сложности. Пользователи на форумах называют его «по сути 9/10» и задаются вопросом, «не будет ли dedicated web scraping API излишним». Ответ зависит от объёма, бюджета и инженерных ресурсов.

ФакторDIY Python (requests + proxies)Scraping API (Oxylabs, Bright Data и др.)No-Code инструмент (Thunderbit)
Время до первой строкиЧасы15–60 мин~2 мин
Время до production40–80 ч4–16 ч~30 мин
Обход антиботаВы управляете сами (сложно)Берёт на себя провайдерОбрабатывается автоматически
Стоимость на малом масштабе (<1 тыс. страниц/мес.)Низкая (прокси стоят ~$4–8/ГБ)Стартовые тарифы $40–$49/мес.Бесплатно–$15/мес.
Стоимость на масштабе (100 тыс.+ страниц/мес.)Ниже на запросВыше на запросЗависит
КастомизацияПолный контрольПараметры APIОграничена UI/полями
Поддержка4–8 ч/мес.Почти нольНет (ИИ адаптируется)
Лучше всего дляРазработчики, строящие кастомные пайплайныСредний production-скрейпингБизнес-пользователи, быстрые разовые выгрузки

Когда DIY Python имеет смысл

DIY выигрывает, когда у вас уже есть контракт на прокси, нужен строгий контроль над заголовками, привязкой к zip code или cohort продавцов, вы индексируете миллионы страниц в месяц, где per-record API-расходы накапливаются, или вам нужны on-premise/комплаенс-гарантии. Компромисс — реальное инженерное время: production-ready Scrapy spider с пагинацией, retry, ротацией прокси, TLS-имитацией и несколькими схемами страниц занимает 40–80 часов работы опытного Python-разработчика, плюс 4–8 часов поддержки в месяц по мере того, как Walmart меняет фингерпринты.

Когда scraping API экономит время

Scraping API берут на себя антибот-слой, чтобы вам не пришлось это делать. Бенчмарки ScrapeOps показывают 99% успеха у Zyte API и 98% у Scrape.do на Walmart. Стартовые тарифы у таких сервисов, как ScraperAPI, Oxylabs и Scrapingdog, находятся в районе $40–$49 в месяц. Если вы команда из 2–5 инженеров и объём парсинга — от 10 тыс. до 1 млн страниц в месяц, API почти всегда будет правильным выбором. Вы меняете per-request стоимость на отсутствие поддержки.

Когда no-code — правильный выбор

Thunderbit подходит для совсем другого профиля. Если вы PM, аналитик или e-commerce-оператор и вам нужны данные о товарах Walmart в таблице уже сегодня после обеда, а не в следующем спринте, no-code инструмент — честный ответ.

Процесс простой: установите расширение Thunderbit для Chrome, откройте страницу товара или поиска Walmart, нажмите «AI Suggest Fields», и ИИ Thunderbit прочитает страницу и предложит столбцы (название товара, цена, рейтинг и т. д.). Нажмите «Scrape», и данные появятся в таблице. Экспортируйте в Excel, Google Sheets, Airtable или Notion — всё бесплатно, без paywall.

Thunderbit обрабатывает антибот в облаке, так что вам не нужно возиться с CAPTCHA, прокси или TLS-фингерпринтингом. ИИ автоматически подстраивается под изменения макета, поэтому поддержка не требуется. Для тех, кто вообще не хочет работать с JSON-путями, это путь наименьшего сопротивления.

Честные ограничения: Thunderbit не рассчитан на 100 тыс.+ страниц в день. Бюджеты кредитов и cloud-лимиты делают высокообъёмный ingest экономически невыгодным по сравнению с raw API. Также вы не сможете жёстко зафиксировать конкретный zip code или ASN, если инструмент этого не поддерживает. Для постоянных высокообъёмных пайплайнов DIY или scraping API всё ещё остаются лучшим выбором.

Грубая оценка цены: 1000 строк товаров Walmart в Thunderbit стоят примерно 2000 кредитов (~$0,60–$1,10 на тарифах Starter/Pro). Это сопоставимо с Walmart API у Oxylabs и дешевле большинства любительских scraping API при низких объёмах. Актуальные цены Thunderbit смотрите на сайте.

Извлекайте данные о товарах Walmart с помощью ИИ Get Started Free

Экспорт ваших данных, собранных с Walmart

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

CSV — самый универсальный формат, который аналитики реально открывают:

import csv

def export_csv(products, filename="walmart_products.csv"):
    fieldnames = ["name", "price", "availability", "rating", "review_count", "seller", "url"]
    with open(filename, "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_MINIMAL)
        writer.writeheader()
        for p in products:
            writer.writerow({k: p.get(k) for k in fieldnames})

Используйте кодировку utf-8-sig для совместимости с Excel. BOM-маркер предотвращает искажение специальных символов в Excel.

JSONL — production-формат для scraping-пайплайнов:

import json
import gzip

def export_jsonl(products, filename="walmart_products.jsonl.gz"):
    with gzip.open(filename, "at", encoding="utf-8") as f:
        for p in products:
            f.write(json.dumps(p, ensure_ascii=False) + "\n")

JSONL устойчив к сбоям (прерванная запись теряет только последнюю строку), потоково обрабатывается с постоянным потреблением памяти и сохраняет вложенные данные вроде вариаций и отзывов.

Excel — для одноразовой передачи аналитикам:

from openpyxl import Workbook

def export_excel(products, filename="walmart_products.xlsx"):
    wb = Workbook(write_only=True)
    ws = wb.create_sheet("Products")
    ws.append(["Название", "Цена", "Наличие", "Рейтинг", "Отзывы", "Продавец"])
    for p in products:
        ws.append([p.get("name"), p.get("price"), p.get("availability"),
                    p.get("rating"), p.get("review_count"), p.get("seller")])
    wb.save(filename)

Для пользователей без Python Thunderbit закрывает и историю экспорта: в один клик можно выгрузить в Google Sheets, Airtable, Notion, Excel, CSV и JSON — всё бесплатно на базовом тарифе. Для непрерывного мониторинга функция scheduled scraper в Thunderbit может запускать повторяющиеся извлечения автоматически.

Один нюанс по расписанию: не используйте GitHub Actions для парсинга Walmart. Раннеры GitHub Actions сидят на диапазонах IP Azure, которые антибот Walmart блокирует мгновенно. Используйте APScheduler на VPS или направляйте весь трафик через residential proxies.

Юридические и этические рекомендации по парсингу Walmart

Пользователи на форумах прямо формулируют этот страх: «Я готов играть в кошки-мышки с разработчиками, но не хочу связываться с их юристами».

Условия использования Walmart прямо запрещают использовать «любого робота, spider… или иное ручное или автоматическое устройство для извлечения, индексирования, “scrape”, “data mine” или иного сбора любых материалов» без «явного предварительного письменного согласия».

robots.txt Walmart запрещает /search, /account, /api/ и десятки внутренних эндпоинтов. Страницы карточек товара (/ip/...) и отзывы (/reviews/product/) не запрещены.

Прецедент hiQ против LinkedIn (9-й округ, 2022) установил, что парсинг общедоступных данных, скорее всего, не нарушает федеральный CFAA. Но позже тот же суд постановил, что hiQ нарушила пользовательское соглашение LinkedIn и вынес против неё согласованное решение на $500,000. Более свежие решения 2024 года (Meta v. Bright Data, X Corp. v. Bright Data) ещё больше сузили CFAA и создали аргументы на основе preemption copyright, но эти решения завязаны на конкретную формулировку ToU, которая не переносится напрямую на Walmart.

Практические рекомендации: не перегружайте серверы. Соблюдайте лимиты. Не парсите персональные или пользовательские данные. Используйте данные ответственно. Парсинг публичных страниц товаров Walmart с умеренной скоростью для личного исследования — это совсем иной риск-профиль, чем коммерческий массовый сбор данных вопреки условиям Walmart. Если вы строите продукт на данных Walmart, поговорите с юристом и изучите официальные affiliate и seller API Walmart.

Дисклеймер: это образовательная информация, а не юридическая консультация.

Выводы и ключевые итоги

Парсинг Walmart на Python — это задача уровня 9/10 по сложности из-за двойного стека антибот-защиты Akamai + PerimeterX. Не невозможная — но требует правильных инструментов и паттернов.

Ключевые выводы:

  • Извлечение JSON из __NEXT_DATA__ — самый практичный выбор для большинства сценариев. Именно его используют все серьёзные open-source-скрейперы Walmart 2024–2026 годов. Базовый путь для PDP — props.pageProps.initialData.data.product, а для поиска и browse — searchResult.itemStacks.
  • curl_cffi с impersonate="chrome124" обязателен. Обычные requests или httpx не пройдут TLS-фингерпринтинг Akamai, независимо от заголовков.
  • Тихие блокировки — главная опасность. Walmart возвращает 200 OK вместе с CAPTCHA-страницами. Проверяйте содержимое ответа, а не только статус-код.
  • Production-скрейперу нужно больше, чем код на happy path. Экспоненциальный backoff с jitter, детект блокировки по четырём сигналам, rate limiting на 3–6 секунд на запрос, валидация данных и мониторинг здоровья сессии — всё это обязательно.
  • Перехват внутренних API через /orchestra/* мощный, но хрупкий. Используйте его как упражнение через DevTools для конкретных задач, а не как основной метод извлечения.
  • Walmart ограничивает поиск 25 страницами. Расширяйте покрытие через чередование сортировки и разбиение по ценовым диапазонам.
  • Выбирайте подход честно: DIY Python — для разработчиков с кастомными требованиями и большим объёмом. Scraping API — для команд среднего масштаба без выделенного scraping engineer. Thunderbit — для бизнес-пользователей, которым нужны данные в Google Sheets уже сегодня после обеда.

Если хотите попробовать no-code-путь, у расширения Thunderbit для Chrome есть бесплатный тариф — можно собрать несколько страниц Walmart и посмотреть результат своими глазами. Если идёте по пути Python, паттерны кода из этой статьи уже проверены в production. В любом случае теперь у вас есть карта защит Walmart и три пути через них.

Больше о техниках web scraping читайте в наших гайдах: как выполнять web scraping на Python, лучшие инструменты для автоматического web scraping и как парсить сайт, не попадая под блокировку. Также можно посмотреть уроки на канале Thunderbit на YouTube.

Часто задаваемые вопросы

Законно ли парсить данные о товарах Walmart?

Условия использования Walmart запрещают автоматизированный парсинг без письменного согласия. Решение 9-го округа по делу hiQ v. LinkedIn (2022) установило, что федеральный CFAA, скорее всего, не применяется к парсингу публичных страниц, но само дело завершилось решением о нарушении договора на $500,000 против скрейпера. Парсинг публичных страниц товаров с умеренной скоростью для личного исследования — это совсем другой риск-профиль, чем коммерческое извлечение данных. Если вы строите бизнес на данных Walmart, проконсультируйтесь с юристом.

Почему мой Walmart-скрейпер постоянно блокируется?

Самые частые причины: использование обычных requests или httpx (они выдают Python-специфичный TLS-фингерпринт, который Akamai мгновенно отмечает), неправильные или неполные заголовки, отсутствие ротации прокси, скорость запросов быстрее 3–6 секунд на страницу и отсутствие session cookies (_px3, _abck, locDataV3). Перейдите на curl_cffi с impersonate="chrome124", используйте residential proxies и внедрите детект блокировки и retry-паттерны, описанные в этой статье.

Какие данные можно парсить с Walmart на Python?

Названия товаров, цены (текущие и rollback), изображения, краткие и длинные описания, рейтинги, количество отзывов, статус наличия на складе, названия продавцов, информацию о производителе, варианты товара (размер, цвет) и категорийное размещение. При использовании метода __NEXT_DATA__ всё это доступно как структурированный JSON. Перехват внутренних API дополнительно может вернуть цены на уровне вариаций, актуальные остатки и постраничные данные отзывов.

Нужны ли прокси для парсинга Walmart?

Да, для любого production или повторяющегося использования. Антибот-системы Walmart последовательно блокируют обычные запросы — даже при идеальных заголовках нерезидентный IP будет отмечен системой репутации IP у Akamai. Нужны residential или mobile proxies. Datacenter-IP сгорают почти сразу. Ориентируйтесь примерно на $3–$17 за 1000 страниц в зависимости от провайдера прокси и тарифа.

Можно ли парсить Walmart без кода?

Да. Thunderbit — это AI-расширение для Chrome, которое парсит Walmart в два клика: «AI Suggest Fields» автоматически определяет столбцы с данными о товарах, а затем «Scrape» извлекает данные. Оно обрабатывает антибот-проверки в облаке и экспортирует данные прямо в Excel, Google Sheets, Airtable или Notion — всё бесплатно. Инструмент лучше всего подходит аналитикам, PM и бизнес-пользователям, которым нужны данные быстро и без построения кастомного пайплайна. Для высокообъёмного или сильно кастомизированного парсинга Python или scraping API всё ещё лучше подходят.

Попробуйте Thunderbit для AI-парсинга Walmart Get Started Free

Узнать больше

Shuai Guan
Shuai Guan
Генеральный директор Thunderbit | Эксперт по автоматизации данных с помощью ИИ Shuai Guan — генеральный директор Thunderbit и выпускник инженерного факультета Мичиганского университета. Опираясь почти на десятилетний опыт в сфере технологий и SaaS-архитектуры, он специализируется на том, чтобы превращать сложные модели ИИ в практичные no-code инструменты для извлечения данных. В этом блоге он делится честными, проверенными в деле инсайтами о веб-скрейпинге и стратегиях автоматизации, чтобы помочь вам выстраивать более умные, data-driven рабочие процессы. Когда он не занимается оптимизацией потоков данных, тот же внимательный подход к деталям он переносит в своё увлечение фотографией.
Содержание

Собирай страницу, просто задав вопрос

Скажи, что тебе нужно, простыми словами. А ещё лучше — ничего не говори.

Попробовать Thunderbit бесплатно
Извлекай данные с помощью ИИ
Легко передавай данные в Google Sheets, Airtable или Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week