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

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

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

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

  • Рецензент отображаемое имя, показанное в отзыве, например "Optimistic" или "First Time Shopper".
  • Рейтинг звёздный рейтинг так, как его показывает Walmart, например "5 out of 5 stars review".
  • Заголовок короткий заголовок, который рецензент дал своему отзыву.
  • Текст письменный текст отзыва.
  • Дата дата публикации отзыва, если она присутствует на карточке.

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

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

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

Почему здесь важен рендеринг

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

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

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

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

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

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

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

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

bash
node --version

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

npm install crawlbase cheerio

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

Шаг 1: Загрузить отрендеренную страницу товара

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

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

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

const productUrl =
  'https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-14-128GB-Midnight-Prepaid-Smartphone-Locked-to-Straight-Talk/1381920049';

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

crawl(productUrl).then((html) => {
  console.log(html ? html.slice(0, 500) : 'No HTML returned');
});

Две опции ожидания важны для такой цели с клиентским рендерингом. ajax_wait указывает API ждать завершения загрузки асинхронного содержимого, а page_wait выдерживает фиксированное количество миллисекунд после загрузки, чтобы элементы с поздним рендерингом появились до захвата страницы. Пять секунд, разумная стартовая точка; увеличьте значение, если список отзывов возвращается пустым. Запустите скрипт командой node scraper.js и вы должны увидеть реальную разметку товара, а не урезанную оболочку. Это подтверждает, что рендеринг работает, прежде чем вы напишете хоть один селектор.

Crawlbase Walmart Scraper

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

Шаг 2: Разбор каждого отзыва с cheerio

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

javascript
const cheerio = require('cheerio');

function parseReviews(html) {
  const $ = cheerio.load(html);
  const reviews = [];

  $('#item-review-section li.dib').each((_, el) => {
    const card = $(el);
    const rating = card.find('.w_iUH7').text().trim();
    const body = card.find('.lh-copy').text().trim();

    if (!rating && !body) return;

    reviews.push({
      reviewer: card.find('.f7.gray').first().text().trim() || null,
      rating: rating || null,
      title: card.find('.w_kV33.w_Sl3f.w_mvVb.f5.b').text().trim() || null,
      body: body || null,
      date: card.find('.f7.gray.mt1').text().trim() || null,
    });
  });

  return reviews;
}

Несколько деталей делают этот код устойчивым. Селектор контейнера #item-review-section li.dib и внутренние .w_iUH7 (рейтинг) и .lh-copy (текст отзыва) взяты прямо из живой разметки отзывов Walmart. Имя рецензента, заголовок и дата находятся в собственных небольших обёртках, поэтому каждое поле считывается своим селектором. Каждое поле возвращает null при отсутствии элемента, что распространено, поскольку не каждый отзыв содержит отдельный заголовок или видимую дату. Ранний return пропускает любой элемент списка, не имеющий ни рейтинга, ни текста, чтобы макетные заглушки не загрязняли вывод.

Дрейф селекторов

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

Шаг 3: Обработка пагинации отзывов

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

javascript
async function scrapeAllReviews(baseUrl, totalPages) {
  const all = [];
  for (let page = 1; page <= totalPages; page++) {
    const sep = baseUrl.includes('?') ? '&' : '?';
    const url = `${baseUrl}${sep}page=${page}`;
    const html = await crawl(url);
    if (html) all.push(...parseReviews(html));
  }
  return all;
}

Каждая итерация добавляет page=N к URL товара, загружает отрендеренную страницу и разворачивает разобранные отзывы в один общий массив. Держите totalPages небольшим во время тестирования, чтобы не делать лишних запросов, и увеличивайте значение, когда вывод выглядит правильно.

Шаг 4: Экспорт в JSON и CSV

Теперь соедините загрузку, разбор и пагинацию в один выполняемый скрипт, а затем запишите собранные отзывы в JSON-файл и CSV-файл. JSON, естественный формат для передачи в модель тональности; CSV открывается прямо в таблице для быстрого исследования продуктов.

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

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

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

function parseReviews(html) {
  const $ = cheerio.load(html);
  const reviews = [];
  $('#item-review-section li.dib').each((_, el) => {
    const card = $(el);
    const rating = card.find('.w_iUH7').text().trim();
    const body = card.find('.lh-copy').text().trim();
    if (!rating && !body) return;
    reviews.push({
      reviewer: card.find('.f7.gray').first().text().trim() || null,
      rating: rating || null,
      title: card.find('.w_kV33.w_Sl3f.w_mvVb.f5.b').text().trim() || null,
      body: body || null,
      date: card.find('.f7.gray.mt1').text().trim() || null,
    });
  });
  return reviews;
}

async function scrapeAllReviews(baseUrl, totalPages) {
  const all = [];
  for (let page = 1; page <= totalPages; page++) {
    const sep = baseUrl.includes('?') ? '&' : '?';
    const html = await crawl(`${baseUrl}${sep}page=${page}`);
    if (html) all.push(...parseReviews(html));
  }
  return all;
}

function toCsv(rows) {
  const headers = ['reviewer', 'rating', 'title', 'body', 'date'];
  const escape = (v) => `"${(v ?? '').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 productUrl =
    'https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-14-128GB-Midnight-Prepaid-Smartphone-Locked-to-Straight-Talk/1381920049';
  const reviews = await scrapeAllReviews(productUrl, 3);
  fs.writeFileSync('walmart_reviews.json', JSON.stringify(reviews, null, 2));
  fs.writeFileSync('walmart_reviews.csv', toCsv(reviews));
  console.log(`Saved ${reviews.length} reviews to JSON and CSV`);
}

main();

Запустите полный скрипт командой node scraper.js. Он обходит три страницы отзывов, собирает все отзывы в один массив и записывает walmart_reviews.json и walmart_reviews.csv в папку проекта. Экранирование CSV заключает каждое значение в кавычки и удваивает все внутренние кавычки, чтобы тексты отзывов с запятыми или кавычками не нарушали структуру столбцов.

Как выглядит вывод

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

json
[
  {
    "reviewer": "Optimistic",
    "rating": "5 out of 5 stars review",
    "title": "Great camera and speed",
    "body": "Pictures are coming out great and the speed is what I've been needing",
    "date": "October 2, 2023"
  },
  {
    "reviewer": "First Time Shopper",
    "rating": "5 out of 5 stars review",
    "title": "Awesome phone",
    "body": "Bought this last month and it's been awesome. The camera quality is perfect especially with the action mode.",
    "date": "September 18, 2023"
  }
]

CSV отражает те же поля со строкой заголовков, поэтому маркетинговая или продуктовая команда может открыть его в таблице, отсортировать по рейтингу и просмотреть сначала самые низкие оценки. Имея данные под рукой, вы можете выполнить оценку тональности, подсчитать распределение рейтингов или отслеживать, как обратная связь меняется от релиза к релизу. Что касается аналитической стороны, наш гайд о том, как скрапить отзывы покупателей, рассказывает о превращении сырого текста отзывов в структурированные выводы, и тот же конвейер применим к отзывам Amazon, если вы сравниваете два маркетплейса.

Как не попасть под блокировку

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

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

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

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

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

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

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

Итоги

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

  • Walmart рендерит отзывы на стороне клиента. Обычный запрос возвращает неполную страницу, поэтому её необходимо отрендерить перед разбором.
  • Нужны рендеринг и надёжный IP вместе. Crawling API делает оба в одном вызове; ajax_wait и page_wait управляют тем, как долго он ждёт загрузки списка отзывов.
  • cheerio выполняет извлечение. Выбирайте каждую карточку #item-review-section li.dib, затем сопоставляйте рецензента, рейтинг, заголовок, текст и дату с текущими селекторами и ожидайте дрейфа этих селекторов.
  • Масштабируйтесь через цикл по страницам, экспортируйте в JSON и CSV. Параметр page обходит страницы отзывов, тот же парсер работает на каждой странице, а оба файла подходят для анализа тональности и исследования продуктов.
  • Оставайтесь на публичном тексте отзывов. Уважайте ToS Walmart и robots.txt, никогда не профилируйте отдельных рецензентов и держитесь подальше от всего, что скрыто за логином.

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

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

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

Какие поля можно извлечь из отзыва Walmart?

Отображаемое имя рецензента, звёздный рейтинг (Walmart формулирует его как "5 out of 5 stars review"), короткий заголовок отзыва, текст и дату публикации, если она присутствует на карточке. Скрапер в этом руководстве извлекает все пять полей из карточек отзывов #item-review-section li.dib, используя селекторы .w_iUH7 и .lh-copy, а также классы-обёртки для имени, заголовка и даты.

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

Walmart разбивает отзывы на страницы с помощью параметра запроса page в URL товара. Функция scrapeAllReviews в этом руководстве перебирает страницы с 1 до заданного количества, добавляет page=N к URL, загружает каждую отрендеренную страницу через Crawling API и запускает тот же парсер на каждой странице перед объединением результатов в один массив.

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

Почти наверняка разметка Walmart. Её генерируемые имена классов (w_iUH7, lh-copy, dib и обёртки вокруг имени, заголовка и даты) меняются без предупреждения и могут отличаться в зависимости от макета товара, поэтому селекторы, работавшие в прошлом месяце, могут сломаться. Повторно проверьте живую страницу отзывов в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание селекторов, нормальная практика для любого рабочего скрапера.

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

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

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

Да. После того как отзывы окажутся в JSON или CSV, вы можете выполнить анализ тональности для классификации каждого как положительного, отрицательного или нейтрального, подсчитать распределение рейтингов, выявить наиболее хвалимые и наиболее критикуемые функции и отслеживать, как обратная связь меняется со временем. Именно этот агрегированный взгляд делает данные об отзывах полезными для исследования продуктов и конкурентного бенчмаркинга.

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

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

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

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