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

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

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

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

  • Rank позиция в списке бестселлеров, начиная с 1.
  • Title название товара, например "Apple AirPods with Charging Case (2nd Generation)".
  • Price цена, отображаемая на карточке, например "$69.00".
  • Rating текст звёздного рейтинга, например "4.6 out of 5 Stars".
  • Reviews количество отзывов в виде числа, если доступно.
  • Link URL страницы отдельного товара.

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

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

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

Two ways to parse

Crawling API может возвращать сырой HTML для парсинга с помощью cheerio, или вы можете передать autoparse: 'true' и получить структурированный JSON напрямую. В этом руководстве парсер cheerio написан вручную, чтобы вы контролировали каждое поле и селектор, но опция autoparse доступна, когда вы хотите, чтобы Crawlbase выполнял извлечение за вас.

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

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

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

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

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

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

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

bash
node --version

mkdir walmart-best-sellers && cd walmart-best-sellers
npm init -y

npm install crawlbase cheerio

Две зависимости выполняют основную работу: crawlbase является официальным клиентом Node для Crawling API, а cheerio парсит возвращённый HTML с помощью jQuery-подобного API, что позволяет извлекать отдельные поля по CSS-селектору. Создайте файл с именем walmart-scraper.js в этой папке и добавьте код из шагов ниже.

Шаг 1: Получение отрендеренной страницы бестселлеров

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

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

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

const walmartPageURL =
  'https://www.walmart.com/shop/best-sellers/electronics';

api
  .get(walmartPageURL)
  .then((response) => {
    if (response.statusCode === 200) {
      console.log(response.body.slice(0, 500));
    }
  })
  .catch((error) => console.error('API request error:', error));

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

javascript
// Ask the API to parse the page and return JSON
const options = { autoparse: 'true' };

api
  .get(walmartPageURL, options)
  .then((response) => {
    if (response.statusCode === 200) {
      console.log(JSON.parse(response.body));
    }
  })
  .catch((error) => console.error('API request error:', error));
Crawlbase Walmart Scraper

Этот первый запрос только что вернул полностью отрендеренную страницу Walmart без безголового браузера или прокси с вашей стороны. Crawling API запускает страницу в реальном браузере, ротирует жилые IP-адреса на стороне сервера и обрабатывает CAPTCHA, которые Walmart подбрасывает скраперам, так что вы получаете готовый HTML (или автопарсированный JSON) из одного вызова. Сначала направьте его на страницу бестселлеров электроники на бесплатном тарифе.

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

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

javascript
const cheerio = require('cheerio');

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

  const containers = $(
    '.sans-serif.mid-gray.relative.flex.flex-column.w-100.hide-child-opacity'
  );

  containers.each((index, element) => {
    const card = $(element);
    const product = { rank: index + 1 };

    // Title
    product.title = card
      .find('[data-automation-id="product-title"]')
      .text()
      .trim();

    // Price: split the currency symbol from the number
    const priceString = card
      .find('[data-automation-id="product-price"] .w_iUH7')
      .text()
      .trim();
    const priceMatch = priceString.match(/([^\d]+)([\d,\.]+)/);
    product.price = priceMatch
      ? `${priceMatch[1].trim()}${priceMatch[2]}`
      : '';

    // Rating and review count share one block
    const ratingText = card
      .find('.flex.items-center.mt2 .w_iUH7')
      .text()
      .trim();
    const rating = ratingText.replace(/\d+\s*reviews/i, '').trim();
    product.rating = rating !== '' ? rating : 'Rating not available';

    const reviewsMatch = ratingText.match(/(\d+)\s*reviews/i);
    product.reviews = reviewsMatch ? parseInt(reviewsMatch[1], 10) : 0;

    // Link to the product page
    const href = card.find('a[link-identifier]').attr('href');
    product.link = href
      ? new URL(href, 'https://www.walmart.com').href
      : '';

    if (product.title) products.push(product);
  });

  return products;
}

Несколько деталей обеспечивают точность работы с данными страницы. Название товара берётся из атрибута data-automation-id="product-title", а цена находится внутри блока product-price как единая строка вида "current price $69.00", поэтому регулярное выражение отделяет символ валюты от числовой части. Блок с оценкой содержит одновременно звёздный рейтинг и количество отзывов в одной строке текста, поэтому одно регулярное выражение удаляет хвост "N reviews", оставляя рейтинг, а второе извлекает количество отзывов в виде числа. Ссылка читается из атрибута href якоря карточки и приводится к абсолютному URL, чтобы она работала за пределами страницы.

Selectors drift

Имена классов Walmart (w_iUH7, длинный класс контейнера flex flex-column и остальные) генерируются и меняются без предупреждения. Воспринимайте приведённые выше селекторы как начальный шаблон, а не как контракт. Когда поле возвращает пустое значение, повторно проверьте живую страницу с помощью инструментов разработчика в браузере и обновите селектор. Периодическое обслуживание селекторов нормально для любого производственного скрапера, это не признак поломки.

Шаг 3: Сборка полного скрипта с экспортом в JSON и CSV

Теперь соедините получение данных и парсинг в один работающий скрипт, а затем запишите записи на диск как в JSON, так и в CSV. Получение с отключённым autoparse возвращает сырой HTML, который и ожидает парсер cheerio.

javascript
const fs = require('fs');
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 toCsv(rows) {
  const headers = ['rank', 'title', 'price', 'rating', 'reviews', 'link'];
  const escape = (value) =>
    `"${String(value).replace(/"/g, '""')}"`;
  const lines = [headers.join(',')];
  for (const row of rows) {
    lines.push(headers.map((h) => escape(row[h])).join(','));
  }
  return lines.join('\n');
}

async function main() {
  const url = 'https://www.walmart.com/shop/best-sellers/electronics';
  const html = await crawl(url);
  if (!html) return;

  const products = parseBestSellers(html);
  fs.writeFileSync('best-sellers.json', JSON.stringify(products, null, 2));
  fs.writeFileSync('best-sellers.csv', toCsv(products));
  console.log(`Saved ${products.length} products to JSON and CSV`);
}

main();

Вставьте функцию parseBestSellers из шага 2 в тот же файл, чтобы main мог её вызывать. Запустите командой node walmart-scraper.js и получите два файла: best-sellers.json с полными структурированными записями и best-sellers.csv, готовый к открытию в электронной таблице. Вспомогательная функция toCsv заключает каждое поле в кавычки и удваивает любые встроенные кавычки, что важно здесь, поскольку названия товаров длинные и часто содержат запятые.

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

Файл JSON содержит по одному объекту на каждый товар в порядке бестселлеров, каждый с рейтингом, названием, ценой, оценкой, количеством отзывов и ссылкой.

json
[
  {
    "rank": 1,
    "title": "Apple AirPods with Charging Case (2nd Generation)",
    "price": "$69.00",
    "rating": "4.6 out of 5 Stars.",
    "reviews": 23387,
    "link": "https://www.walmart.com/ip/Apple-AirPods-with-Charging-Case-2nd-Generation/604342441"
  },
  {
    "rank": 2,
    "title": "SGIN 15.6inch Laptop 4GB DDR4 128GB SSD Windows 11",
    "price": "$259.99",
    "rating": "4.5 out of 5 Stars.",
    "reviews": 2697,
    "link": "https://www.walmart.com/ip/SGIN-15-6inch-Laptop/1044996074"
  }
]

CSV отражает те же строки с заголовочной строкой, поэтому его можно сразу открыть в Excel, Google Sheets или любом конвейере данных, читающем файлы с разделителями.

csv
rank,title,price,rating,reviews,link
"1","Apple AirPods with Charging Case (2nd Generation)","$69.00","4.6 out of 5 Stars.","23387","https://www.walmart.com/ip/Apple-AirPods-with-Charging-Case-2nd-Generation/604342441"
"2","SGIN 15.6inch Laptop 4GB DDR4 128GB SSD Windows 11","$259.99","4.5 out of 5 Stars.","2697","https://www.walmart.com/ip/SGIN-15-6inch-Laptop/1044996074"

Масштабирование по категориям

Одна категория, это демонстрация; в реальной задаче обходится несколько отделов бестселлеров. Walmart предоставляет каждый из них по пути /shop/best-sellers/, поэтому можно составить список слагов категорий, получить каждый через Crawling API, распарсить с помощью той же функции и пометить каждую строку категорией перед экспортом. Поскольку все страницы бестселлеров имеют одинаковую структуру карточек, уже написанный парсер работает для всех из них без изменений.

javascript
async function scrapeCategories(categories) {
  const all = [];
  for (const category of categories) {
    const url = `https://www.walmart.com/shop/best-sellers/${category}`;
    const html = await crawl(url);
    if (!html) continue;
    const rows = parseBestSellers(html).map((p) => ({ category, ...p }));
    all.push(...rows);
  }
  return all;
}

scrapeCategories(['electronics', 'toys', 'home']).then((rows) => {
  console.log(`Collected ${rows.length} products across categories`);
});

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

Как оставаться незаблокированным

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

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

Для получения более широкого руководства смотрите статью о том, как скрапить сайты без блокировок. Если вам также нужен ранжированный список бестселлеров с другой торговой площадки, тот же паттерн «получить, затем распарсить» переносится на Amazon в руководстве о том, как скрапить бестселлеры Amazon.

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

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

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

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

Итоги

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

  • Walmart рендерит листинги на стороне клиента и активно блокирует. Простой запрос возвращает пустую оболочку или CAPTCHA, поэтому необходимо отрендерить страницу за доверенным IP перед её парсингом.
  • Crawling API делает оба шага в одном вызове. Он рендерит страницу, ротирует жилые IP и обрабатывает CAPTCHA; передайте autoparse: 'true' для JSON или возьмите сырой HTML и распарсите его самостоятельно.
  • cheerio извлекает поля. Выберите каждый контейнер товара, затем прочитайте название, цену, оценку, отзывы и ссылку, получив рейтинг из индекса цикла, и ожидайте, что сгенерированные имена классов будут меняться.
  • Экспортируйте в JSON и CSV. Записывайте структурированные записи в оба формата, заключая поля CSV в кавычки, чтобы длинные названия товаров с запятыми оставались целыми.
  • Оставайтесь в рамках публичных данных. Соблюдайте ToS и robots.txt Walmart, регулируйте темп запросов и отдавайте предпочтение Walmart Developer Portal или партнёрской программе для большого объёма или коммерческого использования.

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

Что такое бестселлеры Walmart?

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

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

Потому что Walmart рендерит свою сетку товаров на стороне клиента с помощью JavaScript и проверяет автоматизированный трафик с помощью CAPTCHA. Обычный HTTP-запрос с IP-адреса датацентра обычно возвращает пустую оболочку или страницу блокировки вместо карточек товаров. Чтобы получить полную страницу, нужно отрендерить её за доверенным IP, что и делает для вас Crawling API.

Использовать autoparse или написать собственный парсер cheerio?

Используйте autoparse, когда вам нужен быстрый структурированный JSON и стандартные поля покрывают ваши потребности; передайте autoparse: 'true' и API вернёт парсированные данные. Напишите собственный парсер cheerio, когда вам нужен полный контроль над извлекаемыми полями и селекторами, как в этом руководстве, чтобы формировать записи и добавлять такие поля, как рейтинг, точно так, как вы хотите.

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

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

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

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

Как избежать блокировки при скрапинге Walmart?

Держите низкий темп запросов для каждого IP, добавляйте задержки между получением категорий и направляйте запросы через ротируемые жилые IP, чтобы ни один адрес не превысил ограничение скорости или не получил CAPTCHA. Crawling API управляет ротацией, доверенным пулом IP и обработкой CAPTCHA за вас; если вы строите собственную инфраструктуру, именно эту часть стоит вложить усилия. Следите за кодами статусов и отступайте, когда начинаете видеть запросы на проверку.

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

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

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

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