Каждая публичная страница товара Amazon представляет собой плотную, структурированную запись: название, текущая цена, звёздный рейтинг, количество отзывов, строка наличия и галерея изображений. Именно эти данные лежат в основе отслеживания цен, мониторинга конкурентов, обогащения каталогов и маркетинговых исследований. Проблема в том, что получить их в любом объёме сложнее, чем кажется: Amazon отрисовывает часть страницы в браузере и фильтрует автоматизированный трафик ещё до того, как тот доберётся до содержимого.
Это руководство показывает, как надёжно парсить данные о товарах Amazon с помощью JavaScript и Node.js. Вы создадите небольшой, готовый к запуску скрапер, который получает публичную страницу товара через Crawling API, извлекает название, цену, рейтинг, количество отзывов, наличие и изображения, а затем экспортирует чистую JSON-запись. Рассмотрены два подхода: встроенный автоматический парсер, возвращающий структурированные поля напрямую, и резервный вариант на cheerio, который читает те же поля из необработанного HTML по CSS-селекторам. Всё руководство ограничено публичными данными о товарах; раздел о законности в конце не является шаблонным, поэтому прочитайте его, прежде чем направить скрапер на реальные объёмы.
Что вы создадите
Скрипт на Node.js, который принимает публичный URL товара Amazon, получает страницу через Crawling API и формирует структурированную запись об этом товаре. В качестве рабочего примера мы используем страницу PHILIPS A4216 Wireless Sports Headphones и извлекаем следующие поля:
- Title название товара, например "PHILIPS A4216 Wireless Sports Headphones".
- Price текущая указанная цена, например "$24.99".
- Rating средняя оценка покупателей, например "4.3 out of 5 stars".
- Review count количество оценок, стоящих за этим средним значением.
- Availability строка наличия, например "In Stock" или "Currently unavailable".
- Images главное изображение плюс URL дополнительных изображений галереи.
Почему обычный запрос не работает на Amazon
Если направить чистый HTTP-клиент на URL товара Amazon, чистую страницу, которую вы видите в браузере, вы получите редко. Против вас работают два фактора. Во-первых, Amazon отрисовывает части страницы товара, в том числе некоторые элементы цен и галереи, с помощью JavaScript, поэтому исходный HTML может быть неполным до завершения работы скриптов страницы. Во-вторых, Amazon агрессивно помечает автоматизированный трафик: IP-адреса дата-центров и паттерны запросов, не похожие на реальный браузер, получают CAPTCHA, проверку робота или прямую блокировку задолго до того, как доберутся до данных о товаре.
Таким образом, работающий скрапер Amazon требует двух вещей в одном запросе: страницы, которая действительно отрисовывается, и IP-адреса, который платформа воспринимает как реального посетителя. Можно собрать это самостоятельно с помощью headless-браузера и пула ротируемых резидентных прокси, но поддержка этой инфраструктуры в рабочем состоянии занимает большую часть времени. Crawling API объединяет оба компонента в одном вызове: вы отправляете ему URL товара, он получает страницу через доверенный ротируемый IP и возвращает либо готовый HTML, либо, с одной дополнительной опцией, поля товара, уже разобранные в JSON.
После получения страницы у вас есть выбор. Передайте опцию scraper, и Crawlbase запустит встроенный парсер Amazon на стороне сервера, передав вам структурированные поля без необходимости поддерживать селекторы. Опустите её, и вы получите необработанный HTML для самостоятельного парсинга с помощью cheerio. В этом руководстве показаны оба варианта: автоматический парсер первым, поскольку он наименее хрупкий, затем ручной путь, чтобы вы понимали, что происходит под капотом.
Предварительные требования
Прежде чем писать код, необходимо подготовить несколько вещей. Это не займёт много времени.
Базовые знания JavaScript и Node.js. Вы должны уметь писать и запускать скрипты на Node, а также устанавливать пакеты с помощью npm. Если вы новичок в Node, официальная документация и любой вводный курс доведут вас до уровня, который предполагает этот учебник. Для более детального изучения смотрите наше руководство по созданию веб-скрапера с Node.js.
Node.js версии 16 или выше. Проверьте версию командой node --version. Если Node.js не установлен, установите его с официального сайта или через менеджер версий, например nvm.
Аккаунт Crawlbase и токен. Зарегистрируйтесь, откройте панель управления и скопируйте токен со страницы документации аккаунта. Вы получаете до 20 000 бесплатных запросов без привязки карты, поэтому все примеры этого руководства можно запустить на бесплатном уровне. Относитесь к токену как к паролю: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.
Настройка проекта
Создайте папку проекта, инициализируйте её и установите две библиотеки, необходимые скраперу.
node --version mkdir amazon-scraper && cd amazon-scraper npm init -y npm install crawlbase cheerio
Две зависимости выполняют основную работу: crawlbase, официальный Node-клиент для Crawling API, а cheerio разбирает возвращаемый HTML через jQuery-подобный API, позволяя извлекать поля по CSS-селекторам. Путь с автоматическим парсером требует только crawlbase; резервный вариант также использует cheerio. Если селекторы для вас новы, хорошим дополнением станет материал об XPath и CSS-селекторах.
Шаг 1: Получение страницы товара с автоматическим парсером
Начните с наименее хрупкого подхода. Импортируйте класс CrawlingAPI, инициализируйте его с помощью токена и запросите URL товара с опцией scraper, установленной в amazon-product-details. Это указывает Crawlbase разобрать страницу на стороне сервера и вернуть структурированные поля товара в виде JSON вместо необработанного HTML.
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); const productUrl = 'https://www.amazon.com/dp/B099MPWPRY'; api .get(productUrl, { scraper: 'amazon-product-details' }) .then((response) => { if (response.statusCode === 200) { const data = JSON.parse(response.body); console.log(data.body); } }) .catch((error) => console.error('Request error:', error));
Запустите скрипт командой node scraper.js. Поскольку опция scraper установлена, тело ответа представляет собой JSON, а не HTML, поэтому вы разбираете его с помощью JSON.parse и читаете разобранный товар из data.body. Парсер Amazon Crawlbase возвращает название, цену, валюту, рейтинг, информацию о наличии, URL изображений и многое другое в виде именованных полей, так что писать и поддерживать селекторы не нужно вовсе. Проверка кода статуса перед парсингом делает сбои явными, а не скрытыми.
Единственная опция scraper: 'amazon-product-details', это и есть автоматический парсер, который делает работу за вас. Crawling API отрисовывает страницу Amazon за ротируемым резидентным IP и возвращает название, цену, рейтинг, наличие и изображения в виде готового JSON, так что вам не нужно запускать парк headless-браузеров, пул прокси и массив CSS-селекторов, которые ломаются при каждом редизайне Amazon. Начните с публичной страницы товара на бесплатном уровне.
Шаг 2: Извлечение нужных полей
Автоматический парсер возвращает богатый объект, но большинству задач нужна лишь горстка полей. Сопоставьте разобранный ответ с названием, ценой, рейтингом, количеством отзывов, наличием и изображениями, используя null как значение по умолчанию для отсутствующих полей, чтобы одно пропущенное значение не прерывало выполнение.
function extractProduct(parsed) { return { title: parsed.name || null, price: parsed.price || null, rating: parsed.customerReview || null, reviewCount: parsed.customerReviewCount || null, availability: parsed.inStock ? 'In Stock' : 'Unavailable', mainImage: parsed.mainImage || null, images: parsed.images || [], }; }
Имена полей здесь, name, price, customerReview, mainImage и остальные, это ключи, которые парсер Amazon возвращает внутри data.body. Строка availability выводится из флага наличия парсера, а не копируется дословно, поэтому вы получаете единообразную строку независимо от того, как Amazon сформулировал её на странице. Держите это сопоставление в одной небольшой функции: когда понадобится новое поле, вы добавите одну строку здесь, не затрагивая логику получения данных.
Шаг 3: Парсинг необработанного HTML с помощью cheerio (резервный вариант)
Иногда нужна необработанная страница вместо разобранного объекта: либо чтобы получить поле, которое автоматический парсер не предоставляет, либо чтобы понять, где именно находится каждое значение. Уберите опцию scraper, и Crawling API вернёт отрисованный HTML, который вы загрузите в cheerio и прочитаете по CSS-селекторам. Вот селекторы, которые Amazon использует на стандартной странице товара.
const cheerio = require('cheerio'); function parseHtml(html) { const $ = cheerio.load(html); const images = []; $('#altImages img').each((_, el) => { const src = $(el).attr('src'); if (src) images.push(src); }); return { title: $('#productTitle').text().trim() || null, price: $('.a-price .a-offscreen').first().text().trim() || null, rating: $('#acrPopover').attr('title') || null, reviewCount: $('#acrCustomerReviewText').text().trim() || null, availability: $('#availability').text().trim() || null, mainImage: $('#landingImage').attr('src') || null, images, }; }
Каждое поле сопоставлено с реальным элементом на странице. Название находится в #productTitle; видимая цена, это скрытый текст внутри первого блока .a-price, который Amazon хранит как чистую, отформатированную по валюте строку; рейтинг находится в атрибуте title элемента #acrPopover ("4.3 out of 5 stars"); количество отзывов, это текст #acrCustomerReviewText; строка наличия, в #availability; а миниатюры галереи, это теги img внутри #altImages, с главным изображением в #landingImage. Защитное чтение каждого поля с резервным значением null предотвращает сбой всего парсинга из-за отсутствия одного элемента.
Идентификаторы элементов и имена классов Amazon (#productTitle, .a-price, #acrPopover и другие) меняются в зависимости от макета, региона и категории товара. Рассматривайте приведённые выше селекторы как отправную точку, а не константу. Когда поле возвращает null, повторно проверьте живую страницу в инструментах разработчика браузера и обновите селектор. Именно от этой поддержки и избавляет вас автоматический парсер, поэтому он является основным вариантом выше.
Шаг 4: Сборка и экспорт в JSON
Теперь соедините получение данных, извлечение и экспорт в JSON в один работоспособный скрипт. Эта версия использует автоматический парсер как основной путь и записывает финальную запись в файл, чтобы вы могли передать её в базу данных, движок сравнения или трекер цен.
const fs = require('fs'); const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); function extractProduct(parsed) { return { title: parsed.name || null, price: parsed.price || null, rating: parsed.customerReview || null, reviewCount: parsed.customerReviewCount || null, availability: parsed.inStock ? 'In Stock' : 'Unavailable', mainImage: parsed.mainImage || null, images: parsed.images || [], }; } async function main() { const productUrl = 'https://www.amazon.com/dp/B099MPWPRY'; const response = await api.get(productUrl, { scraper: 'amazon-product-details' }); if (response.statusCode !== 200) { console.error(`Request failed: ${response.statusCode}`); return; } const parsed = JSON.parse(response.body).body; const product = extractProduct(parsed); fs.writeFileSync('product.json', JSON.stringify(product, null, 2)); console.log('Saved product.json'); console.log(product); } main().catch((error) => console.error('Error:', error));
Запустите полный скрипт командой node scraper.js. Он получает страницу, сопоставляет разобранные поля с помощью extractProduct, записывает аккуратный файл product.json и выводит запись в консоль. Чтобы вместо этого использовать резервный вариант на cheerio, уберите опцию scraper из вызова api.get и передайте response.body напрямую в функцию parseHtml из шага 3.
Как выглядит результат
Экспортированный файл product.json, это одна чистая запись, которую можно сохранить, сравнить с предыдущим запуском или загрузить в трекер.
{ "title": "PHILIPS A4216 Wireless Sports Headphones", "price": "$24.99", "rating": "4.3 out of 5 stars", "reviewCount": "2,184 ratings", "availability": "In Stock", "mainImage": "https://m.media-amazon.com/images/I/61abc123.jpg", "images": [ "https://m.media-amazon.com/images/I/41def456.jpg", "https://m.media-amazon.com/images/I/51ghi789.jpg" ] }
Масштабирование на множество товаров
Один товар, это демонстрация; реальная задача предполагает работу со списком. Поскольку каждая стандартная страница товара использует тот же парсер и те же селекторы, вы собираете набор URL товаров (или Amazon ASIN, которые напрямую соответствуют URL вида /dp/<ASIN>) и проходите по ним в цикле, используя ту же самую логику extractProduct для каждого.
async function scrapeMany(asins) { const records = []; for (const asin of asins) { const url = `https://www.amazon.com/dp/${asin}`; const response = await api.get(url, { scraper: 'amazon-product-details' }); if (response.statusCode === 200) { const parsed = JSON.parse(response.body).body; records.push(extractProduct(parsed)); } } return records; } scrapeMany(['B099MPWPRY', 'B08PZHYWJS']).then((rows) => { console.log(`Collected ${rows.length} products`); });
Чтобы сначала найти URL, спарсите страницу поиска или категории Amazon на предмет ссылок на товары и передайте их в этот цикл. Шаг со страницей поиска, это отдельная тема, рассмотренная в нашем руководстве о том, как парсить страницы поиска Amazon с помощью Crawling API. Если вы хотите полностью обойтись без селекторов и логики цен, наше руководство о том, как парсить цены с Amazon с помощью AI, демонстрирует подход на основе модели для тех же данных.
Как избежать блокировки
Crawling API берёт на себя отрисовку и ротацию IP, однако несколько привычек помогают поддерживать крупные запуски в здоровом состоянии, и они применимы к любому коммерческому ресурсу с защитой.
- Задавайте темп запросов. Обращение к Amazon в плотном цикле, самый быстрый способ попасть под ограничение. Распределяйте запросы и добавляйте небольшую задержку между товарами вместо сканирования на полной скорости.
- Опирайтесь на ротацию. Пул резидентных IP распределяет запросы по многим реальным пользовательским адресам, чтобы ни один из них не превысил лимит частоты. Crawling API делает это за вас; если вы строите собственную инфраструктуру, Smart AI Proxy предоставляет ту же ротацию как конечную точку-замену.
- Следите за кодами статуса. Запуск, начавший возвращать проверки или ответы не 200, сигнализирует о том, что текущая частота или IP-уровень больше недостаточны. Это сигнал к снижению активности, а не шум, который можно игнорировать.
Ознакомьтесь с более широким руководством о том, как парсить сайты без блокировки. Amazon также является частой целью в рамках более широкого парсинга e-commerce, где этот же паттерн получения и извлечения применяется на других торговых площадках.
Законно ли парсить Amazon?
Допустимость парсинга Amazon зависит от Условий использования Amazon, вашей юрисдикции и того, что вы делаете с данными. Условия Amazon ограничивают автоматизированный доступ, поэтому парсинг может противоречить этим условиям независимо от тщательности вашего инструментария. Ни один из кодов здесь не изменяет этого; он лишь обеспечивает техническую реализацию. Прочитайте Условия использования Amazon и его файл robots.txt и считайте оба документа границами того, что вы собираете.
Несколько правил, которых стоит придерживаться. Собирайте только публичные данные о товарах: название, цену, рейтинг, количество отзывов, наличие и изображения, которые может видеть любой без учётной записи. Уважайте заявленные Amazon ожидания по частоте запросов и поддерживайте объём запросов достаточно низким, чтобы не нагружать серверы. Не парсите ничего за авторизацией и не собирайте персональные данные о рецензентах, выходящие за рамки публичного текста отзыва, уже показанного на странице. Защищённые авторским правом материалы, включая изображения товаров, принадлежат их владельцам: ссылайтесь на них, но не распространяйте их как собственные. Если вы планируете коммерческое использование данных, получите разрешение или соглашение об использовании данных, а не считайте молчание согласием.
Для санкционированного крупномасштабного доступа Amazon предлагает официальные каналы, такие как Product Advertising API для партнёров и Selling Partner API для продавцов; они являются правильными инструментами, когда вам нужны гарантированная структура, объём или коммерческие права. Это руководство намеренно ограничено публичными страницами товаров, поскольку это граница, которая делает работу защитимой. Оно не охватывает ничего за авторизацией, данных покупателей или продавцов, а также любых попыток обойти аутентификацию. Если ваш проект требует большего, чем публичные данные о товарах, официальные API Amazon или лицензионное соглашение, правильный путь, а не более умный скрапер.
Ключевые выводы
- Обычные запросы блокируются. Amazon отрисовывает части страницы на стороне клиента и фильтрует автоматизированный трафик, поэтому вам нужны отрисовка и доверенный IP вместе, это предоставляет Crawling API в одном вызове.
-
Автоматический парсер, наименее хрупкий путь. Передача
scraper: 'amazon-product-details'возвращает название, цену, рейтинг, наличие и изображения в виде структурированного JSON без необходимости поддерживать селекторы. -
cheerio, резервный вариант. Уберите опцию scraper, чтобы получить необработанный HTML, затем самостоятельно читайте
#productTitle,.a-price,#acrPopover,#availabilityи элементы изображений, когда нужно поле, которое парсер не предоставляет. -
Масштабируйтесь, перебирая URL или ASIN в цикле. Та же функция
extractProductработает со списком, а скрапер страницы поиска предоставляет ей URL для начала работы. - Оставайтесь в рамках публичных данных. Соблюдайте Условия использования и robots.txt Amazon, предпочитайте официальный Product Advertising или Selling Partner API для объёмного или коммерческого использования и никогда не затрагивайте авторизованные зоны или персональные данные рецензентов.
Часто задаваемые вопросы
Почему обычный запрос не работает на Amazon?
Amazon отрисовывает части страницы товара с помощью JavaScript и агрессивно помечает автоматизированный трафик, поэтому чистый HTTP-клиент часто получает неполную страницу, CAPTCHA или блокировку вместо данных о товаре. Чтобы надёжно получить полную страницу, необходимо отрисовать её за доверенным ротируемым IP, именно это обеспечивает Crawling API.
Использовать автоматический парсер или cheerio?
По умолчанию используйте автоматический парсер (scraper: 'amazon-product-details'): он возвращает структурированные поля и не требует поддерживать селекторы при изменении макета Amazon. Обращайтесь к резервному варианту на cheerio только тогда, когда нужно конкретное поле, которое парсер не предоставляет, или когда вы хотите точно понять, где в необработанном HTML находится то или иное значение.
Какие поля товара можно извлечь?
Со стандартной публичной страницы товара можно получить название, текущую цену, средний рейтинг, количество отзывов, наличие, а также URL главного и галерейных изображений. Автоматический парсер также возвращает дополнительные поля, например валюту, имя продавца и родительский ASIN. Всё это можно собрать в структурированном JSON или CSV для отслеживания цен, движков сравнения или конкурентного исследования.
Мои селекторы постоянно возвращают null. В чём причина?
Обычно это означает, что разметка Amazon изменилась. Идентификаторы элементов и имена классов (#productTitle, .a-price, #acrPopover и другие) отличаются в зависимости от макета, региона и категории, поэтому селектор, работавший в прошлом месяце, может перестать работать. Повторно проверьте живую страницу в инструментах разработчика браузера и обновите селектор, или переключитесь на автоматический парсер, который поглощает эти изменения за вас.
Как избежать блокировки при парсинге Amazon?
Поддерживайте низкую частоту запросов на IP, добавляйте задержку между товарами и маршрутизируйте через ротируемые резидентные IP, чтобы ни один адрес не превысил лимит. Crawling API управляет ротацией и доверенным пулом IP за вас; если вы строите собственную инфраструктуру, это та часть, в которую стоит инвестировать. Следите за кодами статуса и снижайте активность при появлении проверок.
Можно ли парсить персональные данные рецензентов или продавцов?
Нет, и это руководство не охватывает данную тему. Ограничьтесь публичными полями товара, показанными на странице. Данные аккаунта, всё, что находится за авторизацией, и персональные данные о рецензентах или продавцах, выходящие за рамки публичного текста отзыва, выходят за рамки этого руководства и противоречат условиям Amazon. Для санкционированного доступа правильный путь, официальный API Amazon или соглашение об использовании данных.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
