Результаты поиска Walmart это не плоский список. Ближе к верху, и снова чуть ниже по странице, расположены спонсируемые размещения: товары, которые продавец заплатил, чтобы вывести по ключевому слову. Каждое из них несёт тот же публичный сигнал, за который конкурент отдал бы всё: кто делает ставки на «наушники», где они оказываются, что запрашивают и как называют товар. Отслеживаемое во времени, это прямая рекламная и конкурентная аналитика, извлечённая со страницы, которую может загрузить любой.
Это руководство показывает, как парсить спонсируемые объявления Walmart с помощью JavaScript и Node.js. Вы создадите небольшой готовый к запуску парсер, который получает отрисованную страницу поиска Walmart через Crawling API, разбирает каждое спонсируемое размещение с помощью cheerio в аккуратную запись (название, цена, позиция, ссылка), а затем сводит эти записи, чтобы ответить на один вопрос: какие товары рекламируются по заданному ключевому слову. Всё руководство ограничено публичными данными результатов поиска, а раздел о законности ближе к концу это не формальность, поэтому прочитайте его, прежде чем направлять это на любой реальный объём.
Что вы создадите
Скрипт на Node.js, который принимает URL публичного поиска Walmart, получает отрисованный HTML через Crawling API и извлекает структурированную запись для каждого спонсируемого размещения на странице результатов. В качестве сквозного примера мы используем поиск по «headphones» и собираем следующие поля по каждому объявлению:
- Название имя спонсируемого товара, например «Bose QuietComfort 45 Headphones Noise Cancelling Over-Ear Wireless Bluetooth Earphones, Black».
- Цена указанная цена, как показано на карточке, вроде «$329.00».
- Позиция ранг объявления среди спонсируемых размещений на странице, чтобы вы могли отличить ставку в верху поиска от ставки в середине.
- Ссылка URL на отдельную страницу товара, на которую указывает объявление.
Как только каждое объявление становится записью, короткий шаг агрегации группирует их по рекламодателю, чтобы вы видели, кто покупает размещение по ключевому слову и на каких позициях. В этом и состоит выигрыш в рекламной аналитике: те же данные, что Walmart показывает каждому покупателю, реорганизованные для анализа.
Почему обычный запрос не работает с Walmart
Если вы запрашиваете URL поиска Walmart простым HTTP-клиентом, вы не получаете ту чистую страницу результатов, которую видите в браузере. Против вас работают две вещи. Во-первых, Walmart отрисовывает сетку поиска на стороне клиента с помощью JavaScript, поэтому спонсируемых карточек, цен и ссылок на товары нет в исходном HTML, пока не выполнятся скрипты страницы. Во-вторых, Walmart быстро помечает автоматический трафик: IP центров обработки данных и шаблоны запросов, которые не похожи на настоящий браузер, получают проверку или блокировку ещё до того, как доберутся до отрисованного содержимого.
Поэтому рабочему парсеру Walmart нужны две вещи в одном запросе: браузер, который действительно отрисовывает страницу, и IP, который платформа воспринимает как настоящего посетителя. Вы можете собрать это сами с помощью headless-браузера плюс пула ротируемых резидентных прокси, но сшивание всего этого вместе и поддержание в рабочем состоянии и составляет основную часть работы. Crawling API объединяет оба в один вызов: вы отправляете ему URL, он отрисовывает страницу за доверенным IP и возвращает готовый HTML для разбора. Он также предоставляет опцию autoparse, которая возвращает структурированное содержимое страницы в виде JSON, что удобно для первого взгляда, прежде чем вы напишете собственные селекторы.
Walmart примешивает платные размещения в ту же сетку, что и органические результаты, и помечает платные небольшой меткой «Sponsored» внутри карточки. Парсер ниже читает эту метку, чтобы вы могли отделить объявления от органических листингов, а не считать всю сетку рекламой. Если текст метки смещается, именно этот единственный селектор стоит перепроверить первым.
Предварительные требования
Прежде чем писать код, нужно подготовить несколько вещей. Ни одна из них не займёт много времени.
Базовый JavaScript и Node.js. Вы должны уверенно писать и запускать скрипт Node и устанавливать пакеты через npm. Если Node для вас в новинку, наше руководство о том, как создать веб-парсер на Node.js, покрывает основу, которую предполагает этот учебник.
Node.js 16 или выше. Проверьте версию командой node --version. Если её нет, установите с сайта Node.js или через менеджер версий вроде nvm.
Учётная запись и токен Crawlbase. Зарегистрируйтесь, откройте панель управления и скопируйте токен со страницы документации учётной записи. Бесплатный тариф включает до 20 000 запросов без карты, чего достаточно, чтобы пройти этот учебник от начала до конца. Относитесь к токену как к паролю: он аутентифицирует ваши запросы, поэтому держите его вне системы контроля версий.
Настройка проекта
Создайте папку проекта, инициализируйте её и установите две библиотеки, нужные парсеру.
node --version mkdir walmart-ads-scraper && cd walmart-ads-scraper npm init -y npm install crawlbase cheerio
Работу делают две зависимости: crawlbase это официальный клиент Node для Crawling API, а cheerio разбирает возвращённый HTML с API в стиле jQuery, чтобы вы могли извлечь отдельные поля по CSS-селектору. Если селекторы для вас новы, вводный материал по XPath и CSS-селекторам хорошо сочетается с этим руководством.
Шаг 1: получение отрисованной страницы поиска
Начните с получения готовой страницы. Импортируйте класс CrawlingAPI, инициализируйте его своим токеном и запросите URL поиска. Проверка кода состояния перед разбором делает сбои громкими, а не тихими.
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); const walmartPageURL = 'https://www.walmart.com/search?q=headphones'; api .get(walmartPageURL) .then((response) => { if (response.statusCode === 200) { console.log(response.body.slice(0, 500)); } }) .catch((error) => console.error('API request error:', error));
Это запрашивает страницу поиска наушников Walmart через Crawling API и выводит первые 500 символов возвращённого HTML. Запустите её командой node scraper.js, и вы должны увидеть реальную разметку сетки поиска, а не урезанную оболочку или страницу проверки. Это подтверждает, что отрисовка и доверенный IP работают, ещё до того, как вы напишете хоть один селектор. Если вы предпочитаете вообще пропустить написание селекторов для первого прохода, добавьте опцию autoparse, api.get(walmartPageURL, { autoparse: 'true' }), и API вместо этого вернёт основное содержимое страницы в виде JSON.
Тот первый вызов вернул отрисованную сетку Walmart за доверенным IP в одном запросе. Crawling API запускает страницу в настоящем браузере, ротирует резидентные IP на стороне сервера и отдаёт вам готовый HTML (или автоматически разобранный JSON), так что вы избегаете содержания собственного парка headless-браузеров и пула прокси. Сначала направьте его на публичную страницу поиска на бесплатном тарифе до 20 000 запросов.
Шаг 2: разбор спонсируемых размещений с cheerio
Имея на руках отрисованный HTML, загрузите его в cheerio и пройдите сетку результатов. Walmart раскладывает каждый результат в повторяющемся контейнере товара, поэтому вы выбираете каждую карточку, читаете метку «Sponsored» и оставляете только те карточки, которые её несут. Для каждой спонсируемой карточки вы извлекаете название, цену, позицию и ссылку. Защитное чтение каждого поля удерживает одно недостающее значение от обрушения запуска.
const cheerio = require('cheerio'); function parseSponsored(html) { const $ = cheerio.load(html); const ads = []; let position = 0; const containers = $('.sans-serif.mid-gray.relative.flex.flex-column.w-100.hide-child-opacity'); containers.each((index, element) => { const card = $(element); // Only keep cards tagged "Sponsored" const label = card.find('[data-testid^="variant-"] .gray').text().trim(); if (!/sponsored/i.test(label)) return; position += 1; const title = card .find('[data-automation-id="product-title"]') .text() .replace(/\s+/g, ' ') .trim(); const priceString = card .find('[data-automation-id="product-price"] .w_iUH7') .text() .trim(); const priceMatch = priceString.match(/([^\d]+)([\d,\.]+)/); const price = priceMatch ? `${priceMatch[1].trim()}${priceMatch[2]}` : ''; const href = card.find('a[link-identifier]').attr('href') || ''; const link = href && href.startsWith('/') ? `https://www.walmart.com${href}` : href; ads.push({ position, title, price, link }); }); return ads; }
Селекторы здесь взяты прямо из разметки поиска Walmart. Каждый результат находится в длинном контейнере служебных классов .sans-serif.mid-gray.relative.flex.flex-column.w-100.hide-child-opacity; тег «Sponsored» живёт в span [data-testid^="variant-"] .gray; название это [data-automation-id="product-title"]; а строка цены находится внутри [data-automation-id="product-price"] .w_iUH7, которую мы разбиваем regex на символ валюты и числовую часть. Ранний return отбрасывает любую карточку без спонсируемой метки, так что position считает только платные размещения, сначала верх поиска, затем середину. Ссылка считывается из href якоря карточки и делается абсолютной, когда Walmart возвращает относительный путь.
Имена классов Walmart и значения data-testid меняются без уведомления, а длинный контейнер служебных классов выше особенно хрупок, поскольку это сгенерированная стилизация, а не стабильная зацепка. Относитесь к этим селекторам как к стартовому шаблону, а не к контракту. Когда поле возвращается пустым, заново изучите живую страницу в инструментах разработчика браузера и обновите селектор. Периодическое обслуживание селекторов нормально для любого промышленного парсера, а не признак того, что что-то сломано.
Шаг 3: соберите всё вместе и проанализируйте рекламодателей
Теперь свяжите получение и разбор в один готовый к запуску скрипт, затем добавьте шаг анализа. Как только каждая спонсируемая карточка становится записью, группировка по ссылке на страницу товара говорит вам, какие рекламодатели покупают размещение по ключевому слову и где они оказываются.
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; } // parseSponsored from Step 2 goes here function advertiserReport(ads) { return ads.map((ad) => ({ advertiser: ad.title.split(' ').slice(0, 2).join(' '), position: ad.position, price: ad.price, link: ad.link, })); } async function main() { const keyword = 'headphones'; const url = `https://www.walmart.com/search?q=${encodeURIComponent(keyword)}`; const html = await crawl(url); if (!html) return; const ads = parseSponsored(html); console.log(`${ads.length} sponsored placements on "${keyword}"`); console.log(JSON.stringify(advertiserReport(ads), null, 2)); } main();
Шаг advertiserReport намеренно прост: он выводит короткий идентификатор рекламодателя из первых слов каждого названия товара и сохраняет позицию, цену и ссылку рядом с ним. В реальном конвейере вы бы ключевали рекламодателя на чём-то более твёрдом (поле бренда или продавец, разрешённый со страницы товара), но даже эта грубая группировка отвечает на главный вопрос: кто платит за появление по этому ключевому слову и на каком ранге. Прогоняйте несколько ключевых слов по расписанию, и те же записи становятся конкурентным фидом: новые рекламодатели, входящие в термин, движения цен на размещениях и сдвиги ранга во времени.
Как выглядит результат
Запустите полный скрипт командой node scraper.js, и вы получите аккуратный массив спонсируемых размещений, упорядоченный по позиции, готовый к записи в JSON, CSV или базу данных.
[ { "advertiser": "Bose QuietComfort", "position": 1, "price": "$329.00", "link": "https://www.walmart.com/ip/Bose-QuietComfort-45-Headphones/376188834" }, { "advertiser": "COWIN E7", "position": 2, "price": "$35.00", "link": "https://www.walmart.com/ip/COWIN-E7-Active-Noise-Cancelling-Headphones/123456789" }, { "advertiser": "OneOdio Wired", "position": 3, "price": "$31.99", "link": "https://www.walmart.com/ip/OneOdio-Wired-Over-Ear-Headphones/950096760" } ]
Каждая строка это одно спонсируемое размещение: кто рекламируется, где он встал среди платных слотов, что запрашивает и на какую страницу товара указывает объявление. Сохранённое с временной меткой по каждому запуску, это сырьё для рекламной аналитики на уровне ключевого слова.
Масштабирование по ключевым словам и страницам
Одно ключевое слово на одной странице это демонстрация; реальная задача проходит список ключевых слов и пагинацию за каждым. Walmart отдаёт номер страницы через параметр запроса page, так что вы можете строить URL каждой страницы в цикле, получать его через Crawling API, разбирать той же функцией и собирать строки. Поскольку каждая страница результатов разделяет одну и ту же структуру карточек, парсер, который вы уже написали, работает по всем из них без изменений.
async function scrapeKeyword(keyword, totalPages) { const all = []; for (let page = 1; page <= totalPages; page++) { const url = `https://www.walmart.com/search?q=${encodeURIComponent(keyword)}&page=${page}`; const html = await crawl(url); if (html) all.push(...parseSponsored(html)); } return all; } scrapeKeyword('headphones', 3).then((rows) => { console.log(`Collected ${rows.length} sponsored placements`); });
Замените единственное ключевое слово массивом и зациклите ваши целевые термины, чтобы построить конкурентную карту по целой категории. Чтобы обогатить каждое объявление полными деталями (бренд, продавец, рейтинги, полный список характеристик), возьмите link из каждой записи и получите эту отдельную страницу товара через ту же функцию crawl, затем напишите небольшой парсер для макета товара. Паттерн идентичен: отрисовать, затем разобрать. Тот же подход «получить, затем разобрать» переходит прямо в более широкую работу по парсингу электронной коммерции, а подача этих цен в модель естественно подходит для ценовой аналитики.
Как оставаться незаблокированным
Даже когда отрисовка решена, Walmart следит за трафиком, похожим на парсер. Несколько привычек поддерживают запуск здоровым, и они применимы к любой сложной коммерческой цели.
- Регулируйте темп запросов. Молотить страницы в плотном цикле это самый быстрый способ получить троттлинг. Разносите запросы и варьируйте ключевые слова, а не обходите один путь на полной скорости.
- Опирайтесь на ротацию. Пул резидентных IP распределяет запросы по множеству адресов реальных пользователей, так что ни один из них не срабатывает ограничение частоты. Crawling API делает это за вас; если вы строите собственный стек, именно эту часть нужно сделать правильно.
- Читайте коды состояния. Запуск, который начинает возвращать проверки или ошибки, говорит вам, что текущей частоты или уровня IP уже недостаточно. Относитесь к этому как к сигналу сбавить темп, а не как к шуму, который можно игнорировать.
Более широкий план смотрите в материале о том, как парсить сайты, не попадая в блокировки. Если вы предпочитаете направлять собственный трафик через ротируемый пул, а не использовать управляемый API, Smart AI Proxy даёт вам ту же ротацию резидентных IP в виде встраиваемой прокси-точки.
Законно ли парсить рекламные данные Walmart?
Разрешён ли парсинг спонсируемых объявлений Walmart зависит от условий обслуживания Walmart, вашей юрисдикции и того, что вы делаете с данными. Условия использования Walmart ограничивают автоматический доступ, поэтому парсинг может противоречить этим условиям независимо от того, насколько аккуратен ваш инструментарий. Ничего из кода здесь это не меняет; он лишь заставляет работать техническую часть. Прочитайте Условия использования Walmart и его robots.txt и относитесь к обоим как к границе того, что вы собираете.
Несколько правил, которых стоит держаться. Собирайте только публичные данные результатов поиска: спонсируемое название, цену, позицию и ссылку на товар, которые любой видит без учётной записи. Метка «Sponsored» и ранжирование это публичные сигналы, которые Walmart уже показывает каждому покупателю, что и делает рекламную аналитику на этой поверхности защитимой. Помните об авторском праве, когда дело касается изображений товаров и рекламных текстов, которые являются интеллектуальной собственностью продавца и Walmart, поэтому анализируйте их, а не публикуйте повторно как свои собственные. Уважайте заявленные Walmart ожидания по частоте и держите объём запросов достаточно низким, чтобы не нагружать его серверы. Полностью избегайте персональных данных, включая всё, что привязано к идентифицируемым покупателям или продавцам, сверх того, что публично указано на странице результатов. Если вы планируете переиспользовать данные в коммерческих целях, получите разрешение или официальное соглашение, а не считайте, что молчание означает согласие.
Для объёма или коммерческого использования правильный путь это официальный канал: Walmart управляет рекламной платформой Connect с собственной отчётностью для рекламодателей, а программа разработчиков Walmart.io предоставляет санкционированные API. Это правильные инструменты, когда вам нужны большие объёмы, гарантированная структура или коммерческие права. Это руководство намеренно ограничено публичными данными поиска и спонсируемых размещений, потому что это та черта, которая делает работу защитимой. Оно не охватывает ничего за входом в систему, персональные данные покупателей или продавцов, внутренние метрики кампаний вроде расходов или показателя кликабельности другого рекламодателя, или любую попытку обойти аутентификацию. Если вашему проекту нужно больше, чем публичные размещения, официальные рекламные инструменты Walmart или соглашение о данных это верный путь, а не более хитрый парсер.
Ключевые выводы
- Walmart отрисовывает поиск на стороне клиента. Простой запрос возвращает неполную страницу, поэтому вы должны отрисовать её, прежде чем разбирать, что Crawling API делает за доверенным IP в одном вызове.
-
Фильтруйте по метке «Sponsored». Читайте тег
[data-testid^="variant-"] .grayвнутри каждой карточки и оставляйте только платные размещения, так что объявления остаются отдельными от органических результатов. -
Захватывайте название, цену, позицию и ссылку. Зацепки Walmart
product-titleиproduct-priceдают вам поля; подсчёт только спонсируемых карточек даёт вам позицию. - Группируйте по рекламодателю ради аналитики. Сведение записей по товару или бренду отвечает, кто рекламируется по ключевому слову и на каком ранге, отслеживаемое во времени как конкурентный фид.
- Оставайтесь на публичных данных. Уважайте Условия обслуживания Walmart и robots.txt, предпочитайте официальные инструменты Walmart Connect или Walmart.io для объёма или коммерческого использования и никогда не трогайте входы, персональные данные или приватные метрики кампаний другого рекламодателя.
Часто задаваемые вопросы
Что такое спонсируемые товары на Walmart?
Спонсируемые товары это товары, за которые рекламодатель платит, чтобы вывести их выше в результатах поиска Walmart или на страницах категорий. Они находятся в той же сетке, что и органические листинги, но несут небольшую метку «Sponsored» и являются частью рекламной платформы Walmart, где продавцы делают ставки, чтобы поставить свои товары перед покупателями, ищущими по заданному ключевому слову. Поскольку размещение и метка видны каждому покупателю, это публичные сигналы, которые вы можете считать со страницы.
Почему обычный запрос возвращает неполные данные из Walmart?
Потому что Walmart отрисовывает сетку поиска на стороне клиента с помощью JavaScript. Исходный HTML частичен, пока скрипты страницы не выполнятся в браузере, поэтому сырой HTTP-запрос возвращает страницу с отсутствующими или пустыми спонсируемыми карточками, ценами и ссылками, и вдобавок Walmart часто выдаёт проверку автоматическому трафику. Отрисовка страницы через Crawling API за доверенным IP даёт вам полную сетку для разбора.
Мои селекторы возвращают пустые строки. Что изменилось?
Почти наверняка разметка Walmart. Длинный контейнер служебных классов, значения data-testid и класс цены w_iUH7 меняются без уведомления, поэтому селекторы, работавшие в прошлом месяце, могут сломаться. Сгенерированный контейнер служебных классов самый хрупкий из них. Заново изучите живую страницу в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание селекторов нормально для любого промышленного парсера.
Как мне определить, какие товары рекламируются по ключевому слову?
Разбирайте только карточки, несущие метку «Sponsored», захватывайте название, цену, позицию и ссылку на товар каждой из них, затем группируйте записи по рекламодателю. Прогоняйте одно и то же ключевое слово по расписанию и сравнивайте запуски, чтобы видеть новых рекламодателей, входящих в термин, движения цен на размещениях и изменения ранга. Это сведение на уровне ключевого слова и есть результат рекламной аналитики, к которому строится это руководство.
Могу ли я получить расходы или показатель кликабельности другого рекламодателя?
Нет, и это руководство этого не охватывает. Расходы, показы и показатель кликабельности это приватные метрики кампаний, которые живут внутри собственной учётной записи рекламодателя, а не на публичной странице результатов. Парсинг не может до них добраться, а попытка означала бы заход за вход в систему. Единственный санкционированный источник таких данных это ваша собственная отчётность Walmart Connect по кампаниям, которые вы ведёте.
Как часто мне стоит собирать рекламные данные Walmart?
Это зависит от того, как быстро движется ключевое слово. Для конкурентных терминов, где рекламодатели и цены часто меняются, ежедневный или почти ежедневный запуск держит ваш взгляд актуальным; для более медленных категорий еженедельного часто достаточно. Какую бы частоту вы ни выбрали, держите частоту запросов на один IP низкой и полагайтесь на ротацию, чтобы более частое расписание не привело к троттлингу. Следите за кодами состояния и сбавляйте темп, когда начинаете видеть проверки.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
