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

Данное руководство является картой для всего кластера Walmart. Оно описывает доступные для парсинга поверхности данных, объясняет, почему обычный HTTP-запрос возвращает почти пустой результат, и проводит сквозной пример на JavaScript и Node.js: страница результатов поиска Walmart, разобранная в структурированный JSON с помощью cheerio и полученная через Crawling API. Руководство ограничено публичными данными товаров, указывает на более подробные руководства по ценам, отзывам, лучшим продажам и рекламе, и завершается честным анализом правового аспекта. Прочитайте этот раздел перед тем, как нацелить скрапер на реальные объёмы.

Поверхности данных Walmart, доступные для парсинга

Прежде чем писать код, полезно понять, что доступно. Walmart предоставляет несколько различных публичных поверхностей, и каждая из них является отдельной задачей парсинга со своей разметкой и своими селекторами. Рассматривайте это как карту кластера:

  • Результаты поиска (SERP) представление списка по запросу, например "iphone 14 pro". Каждая карточка содержит название, цену, рейтинг, количество отзывов, сообщение о доставке и флаг спонсирования. Это рабочий пример ниже, а более подробное руководство находится в парсинге результатов поиска Walmart с помощью Python.
  • Страницы товаров полная страница с деталями конкретного товара: подробное описание, характеристики, все изображения, продавец и актуальная цена. Специальное руководство находится в парсинге страницы товара Walmart с помощью Selenium.
  • Цены единственное поле, которое большинство команд хотят получать по расписанию, для мониторинга конкурентов и переоценки. См. как легко парсить цены Walmart.
  • Отзывы публичное распределение рейтингов и тексты отдельных отзывов на странице товара, полезные для анализа настроений и сигналов качества. См. руководство по парсингу отзывов Walmart.
  • Лучшие продажи ранжированные списки категорий Walmart, быстрый способ понять, что пользуется спросом. См. парсинг лучших продаж Walmart.
  • Рекламные объявления платные размещения внутри результатов поиска и категорий, полезные для работы с рекламной аналитикой. См. парсинг рекламных объявлений Walmart.

Техника одинакова для всех: отрендерите страницу, затем извлеките нужные поля с помощью CSS-селекторов. Пример здесь использует результаты поиска, поскольку разметка карточек показывает почти все типы полей Walmart, и если вы можете читать карточку SERP, вы можете читать и остальное.

Что вы создадите

Скрипт Node.js, который принимает публичный URL поиска Walmart, получает отрендеренный HTML через Crawling API и извлекает структурированную запись для каждого товара на странице результатов. В качестве рабочего примера используется запрос "iphone 14 pro", и для каждого товара извлекаются следующие поля:

  • Title название товара, например "Straight Talk Apple iPhone 14 Pro Max, 128GB, Silver".
  • Price указанная цена в виде, например "1,099".
  • Currency символ валюты, например "$".
  • Review star строка с рейтингом, например "4.4 out of 5 Stars. 31 reviews".
  • Reviews count количество отзывов на карточке.
  • Delivery message строка о выполнении заказа, например "Free shipping, arrives in 3+ days".
  • Product badge значок карточки, например "Popular pick", при наличии.
  • Inventory status "In Stock" или "Out of stock".
  • Is sponsored булев флаг для платных размещений.
  • Image URL миниатюры товара.

Почему обычный запрос не работает на Walmart

Если вы запрашиваете URL поиска Walmart с помощью обычного HTTP-клиента, вы получаете ответ, в котором почти всё отсутствует. Против вас работают две силы. Во-первых, Walmart рендерит цены, рейтинги, сообщения о доставке и большинство деталей карточек в браузере с помощью JavaScript, поэтому исходный HTML является тонкой оболочкой до выполнения скриптов страницы. Во-вторых, Walmart быстро выявляет автоматизированный трафик: IP-адреса дата-центров и паттерны запросов, не похожие на настоящий браузер, подвергаются вызовам, ограничению скорости или блокировке ещё до достижения отрендеренного контента.

Таким образом, рабочий скрапер Walmart требует в одном запросе двух вещей: браузера, который действительно рендерит страницу, и IP-адреса, который платформа воспринимает как реального посетителя. Вы можете собрать это самостоятельно с помощью headless-браузера плюс пул ротирующих резидентских прокси, но поддержание этой связки в рабочем состоянии составляет основную часть работы. Crawling API объединяет оба компонента в один вызов: вы отправляете URL, он рендерит страницу за надёжным IP и возвращает готовый HTML для парсинга. Более подробно о компромиссах прокси см. в сравнительном анализе прокси для парсинга Walmart.

Normal vs JavaScript requests

Crawlbase предлагает два типа токенов. Обычный токен получает статический HTML; JavaScript-токен сначала рендерит страницу в настоящем браузере. Walmart загружает ключевые поля карточек на стороне клиента, поэтому JavaScript-токен даёт наиболее полную страницу. Обычный токен может вернуть частичный результат с отсутствующими ценами или рейтингами, оставляя вам нечего надёжно парсить. JavaScript-запросы стоят больше кредитов, поэтому используйте их там, где страница действительно нуждается в рендеринге.

Предварительные требования

Перед написанием кода необходимо иметь несколько вещей. Ни одна из них не занимает много времени.

Базовый JavaScript и Node.js. Вы должны уметь писать и запускать Node-скрипты и устанавливать пакеты с помощью npm. Если вы новичок в Node, официальная документация и любой вводный курс доведут вас до уровня, который предполагает этот материал. Более подробное руководство см. в нашей статье о том, как создать веб-скрапер с Node.js.

Node.js 16 или выше. Проверьте свою версию командой node --version. При отсутствии установите с сайта Node.js или через менеджер версий, например nvm.

Аккаунт Crawlbase и токен. Зарегистрируйтесь, откройте панель управления и скопируйте токен со страницы документации аккаунта. При регистрации вы получаете до 20 000 бесплатных запросов без карты, чего вполне достаточно для этого проекта. Обращайтесь с токеном как с паролем: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.

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

Создайте папку проекта, инициализируйте её и установите две библиотеки, необходимые скраперу.

bash
node --version

mkdir walmart-scraper && cd walmart-scraper
npm init -y

npm install crawlbase cheerio

Две зависимости выполняют всю работу: crawlbase является официальным Node-клиентом для Crawling API, а cheerio парсит возвращаемый HTML с jQuery-подобным API, позволяя извлекать отдельные поля по CSS-селектору. Если селекторы для вас новы, краткое введение в XPath и CSS-селекторы станет хорошим дополнением. В устаревшей версии этого проекта также использовался Express для предоставления эндпоинта /scrape, что является хорошим паттерном, если нужно вызывать скрапер по HTTP, но здесь это необязательно и основной скрипт остаётся самодостаточным.

Шаг 1: получение отрендеренной страницы поиска

Начните с получения готовой страницы. Импортируйте класс CrawlingAPI, инициализируйте его с помощью токена и запросите URL поиска. Проверка кода статуса перед парсингом делает сбои заметными, а не скрытыми.

javascript
const { CrawlingAPI } = require('crawlbase');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const response = await api.get(pageUrl);
  if (response.statusCode === 200) {
    return response.body;
  }
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

const searchUrl = 'https://www.walmart.com/search?q=iphone+14+pro';
crawl(searchUrl).then((html) => {
  console.log(html ? html.slice(0, 500) : 'No HTML returned');
});

Запустите скрипт командой node scraper.js и вы должны увидеть реальную разметку Walmart, а не упрощённую оболочку. Это подтверждает, что рендеринг и ротация IP работают ещё до написания единого селектора. Если тело возвращается тонким, страница потребовала JavaScript-запрос: переключитесь на JavaScript-токен, который рендерит страницу в настоящем браузере перед возвратом HTML.

Crawlbase Walmart Scraper

Этот первый вызов только что отрендерил страницу поиска Walmart за надёжным IP без необходимости трогать браузер или прокси с вашей стороны. Crawling API запускает страницу в настоящем браузере, ротирует резидентские IP на стороне сервера и возвращает готовый HTML, поэтому вам не нужно самостоятельно запускать парк headless-браузеров и пул прокси. Сначала попробуйте на публичной поисковой странице в рамках бесплатного тарифа.

Шаг 2: парсинг каждого товара с помощью cheerio

Имея отрендеренный HTML, загрузите его в cheerio и пройдитесь по карточкам результатов. Walmart размещает каждый результат поиска в повторяющемся блоке list-view, поэтому вы выбираете каждую карточку, а затем читаете поля внутри неё. Приведённые ниже селекторы взяты прямо из живого SERP Walmart. Защитное чтение каждого поля не позволяет одному отсутствующему значению прервать прогон.

javascript
const cheerio = require('cheerio');

function parseProductsFromHTML(html) {
  const $ = cheerio.load(html);
  const products = [];

  $('div[role="group"] div[data-testid="list-view"]').each((_, element) => {
    const el = $(element);
    const title = el.find('[data-automation-id="product-title"]').text();
    if (!title) return;

    products.push({
      title,
      image: el.find('[data-testid="productTileImage"]').attr('src'),
      price: el.find('[data-automation-id="product-price"] .lh-copy span.f2').text(),
      currency: el.find('[data-automation-id="product-price"] .f6.f5-l:first').text(),
      reviewsCount: el.find('[aria-hidden=true].f7').text(),
      reviewStar: el.find('.flex.items-center.mt2 .w_iUH7').text(),
      deliveryMessage: el.find('[data-automation-id="fulfillment-badge"]').text().trim(),
      productBadge: el.find('.tag-leading-badge').text(),
      inventoryStatus: el.find('[data-automation-id="inventory-status"]').text() || 'In Stock',
      isSponsored: el.find('.lh-title > .gray.f7').text() ? true : false,
    });
  });

  return { products, productsCount: products.length };
}

Это проходит по каждой list-view карточке на странице и читает каждое поле по его селектору: title, image, price, currency, reviewsCount, reviewStar, deliveryMessage, productBadge, inventoryStatus и флаг isSponsored. Статус наличия по умолчанию устанавливается в "In Stock" при отсутствии маркера об отсутствии товара, а isSponsored преобразуется в булево значение проверкой наличия небольшой метки о спонсировании внутри карточки. Этот же цикл можно адаптировать для изоляции платных размещений в рекламной аналитике, поскольку флаг спонсирования уже включён в запись.

Selectors drift

Имена классов Walmart и маркеры data-testid меняются без предупреждения, и они различаются между страницами поиска, товаров и категорий. Считайте приведённые выше селекторы стартовым шаблоном, а не контрактом. Когда поле возвращается пустым, заново проверьте живую страницу в инструментах разработчика браузера и обновите селектор. Периодическое обслуживание селекторов является нормальным для любого производственного скрапера, а не признаком поломки.

Шаг 3: сборка

Теперь свяжите запрос и парсинг в один работоспособный скрипт. Получите отрендеренный HTML, передайте его парсеру и выведите структурированные записи в формате JSON.

javascript
const { CrawlingAPI } = require('crawlbase');
const cheerio = require('cheerio');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const response = await api.get(pageUrl);
  if (response.statusCode === 200) return response.body;
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

function parseProductsFromHTML(html) {
  const $ = cheerio.load(html);
  const products = [];
  $('div[role="group"] div[data-testid="list-view"]').each((_, element) => {
    const el = $(element);
    const title = el.find('[data-automation-id="product-title"]').text();
    if (!title) return;
    products.push({
      title,
      image: el.find('[data-testid="productTileImage"]').attr('src'),
      price: el.find('[data-automation-id="product-price"] .lh-copy span.f2').text(),
      currency: el.find('[data-automation-id="product-price"] .f6.f5-l:first').text(),
      reviewsCount: el.find('[aria-hidden=true].f7').text(),
      reviewStar: el.find('.flex.items-center.mt2 .w_iUH7').text(),
      deliveryMessage: el.find('[data-automation-id="fulfillment-badge"]').text().trim(),
      productBadge: el.find('.tag-leading-badge').text(),
      inventoryStatus: el.find('[data-automation-id="inventory-status"]').text() || 'In Stock',
      isSponsored: el.find('.lh-title > .gray.f7').text() ? true : false,
    });
  });
  return { products, productsCount: products.length };
}

async function main() {
  const searchUrl = 'https://www.walmart.com/search?q=iphone+14+pro';
  const html = await crawl(searchUrl);
  if (!html) return;
  const data = parseProductsFromHTML(html);
  console.log(JSON.stringify(data, null, 2));
}

main();

После предоставления URL скрипт рендерит страницу через Crawling API, парсит каждую карточку товара и возвращает чистый объект со списком товаров и счётчиком. Это весь цикл, от URL до структурированных данных, в одном файле.

Как выглядят результаты

Запустите полный скрипт командой node scraper.js и получите чистый объект: массив products, по одной записи на карточку, плюс productsCount. Он готов для записи в JSON, CSV или базу данных.

json
{
  "products": [
    {
      "title": "Straight Talk Apple iPhone 14 Pro Max, 128GB, Silver- Prepaid Smartphone",
      "image": "https://i5.walmartimages.com/seo/Straight-Talk-Apple-iPhone-14-Pro-Max.jpeg",
      "price": "1,099",
      "currency": "$",
      "reviewsCount": "31",
      "reviewStar": "4.4 out of 5 Stars. 31 reviews",
      "deliveryMessage": "Free shipping, arrives in 3+ days",
      "productBadge": "Popular pick",
      "inventoryStatus": "In Stock",
      "isSponsored": true
    },
    {
      "title": "Restored Apple iPhone 14 Pro 128GB Deep Purple (Unlocked) Used Excellent",
      "image": "https://i5.walmartimages.com/asr/1385d15c-17b0-4392-8fc1-414cae1a51ed.jpeg",
      "price": "899",
      "currency": "$",
      "reviewsCount": "5",
      "reviewStar": "4.2 out of 5 Stars. 5 reviews",
      "deliveryMessage": "Free shipping, arrives in 3+ days",
      "productBadge": "",
      "inventoryStatus": "In Stock",
      "isSponsored": false
    }
  ],
  "productsCount": 2
}

Масштабирование на несколько страниц результатов

Одна страница результатов является демонстрацией; реальная задача обходит пагинацию. Walmart структурирует URL поиска с параметром page, поэтому вы можете строить URL каждой страницы в цикле, получать его через Crawling API, парсить той же функцией и собирать строки. Типичная последовательность выглядит так:

  • https://www.walmart.com/search?q=iphone+14+pro
  • https://www.walmart.com/search?q=iphone+14+pro&page=2
  • https://www.walmart.com/search?q=iphone+14+pro&page=3
javascript
async function scrapePages(query, totalPages) {
  const all = [];
  for (let page = 1; page <= totalPages; page++) {
    const url =
      `https://www.walmart.com/search?q=${encodeURIComponent(query)}&page=${page}`;
    const html = await crawl(url);
    if (html) all.push(...parseProductsFromHTML(html).products);
  }
  return all;
}

scrapePages('iphone 14 pro', 3).then((rows) => {
  console.log(`Collected ${rows.length} products`);
});

Отсюда можно масштабироваться до тысяч поисковых страниц и сохранять результаты в базу данных или облако. Чтобы обогатить каждую строку полными деталями (подробным описанием, всеми изображениями, полным разбором отзывов), возьмите ссылку на товар, получите эту страницу через ту же функцию crawl и напишите небольшой парсер для разметки товара. Паттерн идентичен: рендеринг, затем парсинг. Руководство по странице товара и руководство по отзывам начинаются именно с этого.

Поддержание доступности

Даже при наличии обработки рендеринга Walmart следит за трафиком, похожим на работу скраперов. Существует реальный риск блокировок, если работать без большого ротирующего пула IP, а создание такого пула самостоятельно требует много времени и затрат. Несколько привычек поддерживают прогон в рабочем состоянии и применимы к любой сложной коммерческой цели.

  • Задавайте темп запросов. Обработка страниц в плотном цикле является самым быстрым способом попасть под ограничение. Распределяйте запросы и варьируйте запросы, а не обходите один путь на полной скорости.
  • Используйте ротацию. Пул резидентских IP распределяет запросы по множеству реальных пользовательских адресов, поэтому ни один из них не превышает ограничение скорости. Crawling API обрабатывает это за вас; если вы создаёте собственный стек, именно это нужно сделать правильно.
  • Читайте коды статусов. Прогон, который начинает возвращать вызовы или ошибки, сигнализирует, что текущая скорость или уровень IP больше не подходят. Воспринимайте это как сигнал к снижению нагрузки, а не как помеху.

Более широкое руководство по работе без блокировок см. в статье как парсить сайты, не попадая в блокировку. Если вы предпочитаете маршрутизировать трафик через ротирующий пул вместо использования управляемого API, Smart AI Proxy предоставляет ту же ротацию резидентских IP в виде эндпоинта. Walmart также является частой целью в более широком веб-скрапинге электронной коммерции, где тот же паттерн рендеринга и парсинга применим к разным сайтам, а полученные фиды цен напрямую используются в работе по анализу цен.

Законно ли парсить Walmart?

Допустимость парсинга Walmart зависит от условий использования Walmart, вашей юрисдикции и того, что вы делаете с данными. Условия использования Walmart ограничивают автоматизированный доступ, поэтому парсинг может противоречить этим условиям вне зависимости от тщательности вашего инструментария. Ни один из кодов здесь не меняет этого; он лишь обеспечивает работоспособность технической части. Прочитайте Условия использования Walmart и его robots.txt и рассматривайте оба документа как границу того, что можно собирать.

Несколько правил, которых стоит придерживаться. Собирайте только публичные данные товаров: название, цену, рейтинг, количество отзывов, сообщение о доставке, значок, статус наличия и флаг спонсирования, которые доступны любому без аккаунта. Соблюдайте ожидания Walmart относительно скорости запросов и поддерживайте объём достаточно низким, чтобы не перегружать серверы. Избегайте персональных данных, включая всё, связанное с идентифицируемыми рецензентами помимо публичного текста отзыва, и не распространяйте защищённые авторским правом материалы, например изображения товаров, как если бы они были вашими.

Для объёмного или коммерческого использования предпочтительнее официальный канал. Walmart управляет платформой для разработчиков, а также аффилиатными и маркетплейс API, которые являются правильными инструментами, когда нужны большие объёмы, гарантированная структура или коммерческие права. Данное руководство намеренно ограничено публичными страницами поиска и товаров, поскольку именно эта граница делает работу защищённой. Оно не охватывает ничего за логином, данные аккаунтов покупателей или продавцов, историю заказов, личные сообщения или любые попытки обойти аутентификацию. Если вашему проекту нужно больше, чем публичные листинги товаров, официальные API Walmart или соглашение о данных являются правильным путём, а не более умный скрапер.

Итоги

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

  • У Walmart есть несколько публичных поверхностей. Поиск, страницы товаров, цены, отзывы, лучшие продажи и рекламные объявления парсятся одинаково: рендеринг, затем чтение полей по селектору, и для каждого есть своё более подробное руководство в этом кластере.
  • Обычный запрос возвращает оболочку. Walmart рендерит карточки на стороне клиента и реагирует на ботов, поэтому необходимо рендерить страницу за надёжным IP перед парсингом.
  • Crawling API делает оба в одном вызове. Он рендерит страницу и ротирует резидентские IP на стороне сервера, поэтому вам не нужно запускать парк headless-браузеров и пул прокси; JavaScript-запросы стоят больше кредитов, поэтому используйте их там, где страница нуждается в рендеринге.
  • cheerio выполняет извлечение. Выбирайте каждую list-view карточку, затем сопоставляйте название, цену, валюту, рейтинг, доставку, значок, наличие и флаг спонсирования с текущими селекторами, ожидая их изменения.
  • Оставайтесь в рамках публичных данных. Соблюдайте ToS и robots.txt Walmart, задавайте темп запросов, предпочитайте официальные API для объёмного или коммерческого использования и никогда не трогайте логины, данные аккаунтов или персональную информацию.

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

Почему обычный запрос возвращает неполные данные с Walmart?

Потому что Walmart рендерит цены, рейтинги, сообщения о доставке и большинство деталей карточек на стороне клиента с помощью JavaScript. Исходный HTML является тонкой оболочкой до выполнения скриптов страницы в браузере, поэтому необработанный HTTP-запрос возвращает ключевые поля отсутствующими или пустыми. Для получения полной страницы необходимо сначала отрендерить её, что и обеспечивает Crawling API, а JavaScript-токен принудительно запускает полный рендеринг в браузере, когда страница нуждается в нём.

Нужен ли обычный токен или JavaScript-токен для Walmart?

Начните с обычного токена и проверьте тело. Если цены, рейтинги или другие поля карточек возвращаются пустыми, переключитесь на JavaScript-токен, который рендерит страницу в настоящем браузере перед возвратом HTML. JavaScript-запросы стоят больше кредитов, поэтому используйте обычный токен там, где он достаточен, и оставляйте JavaScript-токен для страниц, которые действительно нуждаются в рендеринге.

Как парсить следующие страницы результатов поиска Walmart?

Walmart структурирует URL поиска с параметром page, поэтому добавление &page=2, &page=3 и так далее позволяет обходить страницы результатов. Стройте URL каждой страницы в цикле, получайте его через Crawling API и запускайте тот же парсер на каждой странице. Поскольку все страницы результатов имеют одинаковую структуру карточек, уже написанный парсер работает на всех без изменений.

Мои селекторы возвращают пустые строки. Что изменилось?

Скорее всего, разметка Walmart. Имена классов и маркеры data-testid меняются без предупреждения, и они различаются между страницами поиска, товаров и категорий, поэтому селекторы, работавшие в прошлом месяце, могут сломаться. Заново проверьте живую страницу в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание селекторов является нормальным для любого производственного скрапера.

Можно ли парсить персональные данные покупателей или продавцов с Walmart?

Нет, и данное руководство не охватывает это. Данные аккаунтов, история заказов и личные сообщения находятся за логином, поэтому они не являются публичными данными. Публичный текст отзывов виден на странице товара, но всё равно следует избегать его привязки к идентифицируемым лицам. Парсинг контента за логином, персональных данных или обход аутентификации для их получения выходит за рамки этого руководства и противоречит условиям Walmart.

Где найти информацию о ценах, отзывах, лучших продажах или рекламе?

Данное руководство охватывает результаты поиска от начала до конца; в кластере есть специальное руководство для каждой другой поверхности. См. парсинг цен Walmart, руководство по парсингу отзывов, лучшие продажи и рекламные объявления. Каждое использует тот же подход рендеринга и парсинга на другой странице Walmart.

Начать создавать

Обходите любой сайт в масштабе, без борьбы с инфраструктурой.

Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

Самообслуживание · Звонок отдела продаж не требуется · Доступны корпоративные объёмы краулинга