Витрина Samsung является одним из наиболее понятных публичных каталогов потребительской электроники в интернете. Каждый листинг смартфона содержит название модели, цену, оценки покупателей и краткий список характеристик, всё это доступно любому, кто открывает страницу. Это делает её полезным источником для отслеживания цен, конкурентных исследований и анализа трендов: публичный каталог рассказывает, что продаёт Samsung, по какой цене и как покупатели оценивают продукты.
В этом руководстве показано, как парсить продукты Samsung с помощью Node.js, используя Crawling API Crawlbase для загрузки отрендеренной страницы и cheerio для извлечения каждого поля из HTML. Всё руководство ограничено публичными данными каталога: название продукта, модель, цена, рейтинг, количество отзывов, ключевые характеристики и URL продукта, которые витрина показывает каждому посетителю. Ничего здесь не затрагивает аккаунты, заказы или что-либо за пределами публичной части.
Что вы создадите
Небольшой Node.js-скрипт, который запрашивает страницу листинга Samsung, получает полностью отрендеренный HTML, проходит по каждой карточке продукта и записывает чистую запись для каждого телефона в JSON. Каждая запись содержит:
- Название продукта. Линейка модели, как показано на карточке, например Galaxy S24 Ultra.
- Модель и вариант. Варианты хранилища и конфигурации, указанные для данного продукта.
- Цена. Цена каталога, которую витрина отображает для листинга.
- Рейтинг. Средняя оценка покупателей.
- Количество отзывов. На скольких оценках основывается этот рейтинг.
- Ключевые характеристики. Краткий список характеристик на карточке, например размер дисплея, камера и аккумулятор.
- URL продукта. Ссылка на полную страницу продукта.
Почему обычный запрос не работает на Samsung
Если направить обычный HTTP-клиент на URL листинга Samsung, редко получаешь тот каталог, который видишь в браузере. Витрина рендерит большую часть своего контента на стороне клиента: сетка продуктов, цены и рейтинги загружаются через JavaScript после получения исходного HTML. Обычный запрос возвращает оболочку страницы с пустыми слотами данных, поэтому cheerio не находит ничего для разбора.
Кроме того, крупные розничные сайты следят за автоматизированным трафиком. IP-адреса дата-центров и паттерны запросов, не характерные для реального браузера, получают вызов или ограничение скорости ещё до достижения полезной разметки. Поэтому работающий скрапер Samsung требует двух вещей в одном запросе: браузера, который реально рендерит страницу, и IP-адреса, который витрина воспринимает как адрес реального посетителя. Можно собрать это самостоятельно с помощью headless-браузера, например Puppeteer, плюс пула ротирующихся жилых прокси, однако объединение всего этого и поддержание в рабочем состоянии составляет большую часть усилий. Crawling API объединяет оба компонента в одном вызове: вы передаёте URL, он рендерит страницу за доверенным IP и возвращает готовый HTML для разбора.
Crawlbase предлагает два типа токенов. Обычный токен загружает статичный HTML; JavaScript (JS) токен сначала рендерит страницу в настоящем браузере. Каталог Samsung использует клиентский рендеринг, поэтому здесь нужен JS-токен. Если поля возвращаются пустыми с обычным токеном, переключитесь на JS-токен, и отрендеренная разметка будет содержать их.
Предварительные требования
Перед написанием кода нужно подготовить несколько вещей. Ни одна из них не займёт много времени.
Node.js 18 или новее. Проверьте версию командой node --version. Если Node.js не установлен, установите текущую LTS-версию с nodejs.org. Node позволяет запускать JavaScript вне браузера и предоставляет npm для установки пакетов.
Базовые знания JavaScript. Вы должны уметь писать скрипт, запускать его из терминала и устанавливать пакеты с помощью npm. Рабочее знание промисов и цепочек then сделает код более читаемым.
Аккаунт Crawlbase и токен. Зарегистрируйтесь, откройте дашборд и скопируйте токен со страницы документации аккаунта. Используйте JavaScript (JS) токен для витрины Samsung. Обращайтесь с токеном как с паролем: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.
Настройка проекта
Создайте папку, инициализируйте проект и установите две зависимости, необходимые для скрапера.
mkdir scrape-samsung-products && cd scrape-samsung-products npm init -y npm install crawlbase cheerio
Две зависимости выполняют основную работу: crawlbase является официальным клиентом для Crawling API, а cheerio является быстрым лёгким парсером, предоставляющим jQuery-подобные селекторы для возвращаемого HTML без необходимости в браузере. Создайте файл index.js в папке, туда пойдёт код ниже.
Шаг 1: Загрузка отрендеренной страницы
Начните с получения готового каталога. Импортируйте CrawlingAPI из пакета crawlbase, инициализируйте с помощью JS-токена и запросите URL листинга Samsung. Два параметра ожидания важны здесь: ajax_wait указывает API дождаться завершения загрузки асинхронного контента, а page_wait выдерживает фиксированное количество миллисекунд после загрузки, чтобы поздно отрисовываемая сетка появилась перед сохранением страницы. Проверка кода статуса перед разбором делает сбои заметными, а не молчаливыми.
const { CrawlingAPI } = require("crawlbase"); const api = new CrawlingAPI({ token: "YOUR_CRAWLBASE_JS_TOKEN" }); const samsungProductsURL = "https://www.samsung.com/levant/smartphones/all-smartphones/"; api .get(samsungProductsURL, { ajax_wait: true, page_wait: 10000 }) .then((response) => { if (response.statusCode === 200) { console.log(response.body.slice(0, 500)); } else { throw new Error(`Failed to fetch HTML. Status: ${response.statusCode}`); } }) .catch(console.error);
Запустите командой node index.js и вы должны увидеть реальную разметку каталога, а не урезанную оболочку. Десять секунд page_wait являются щедрым значением для столь тяжёлой сетки; уменьшите его, когда убедитесь, что продукты присутствуют. Этот вывод подтверждает работоспособность рендеринга ещё до написания единственного селектора. Если хотите узнать подробнее, почему страницы с клиентским рендерингом требуют этого шага, смотрите руководство по краулингу JavaScript-сайтов.
Единственный вызов api.get, который вы только что выполнили, сделал сразу два дела: листинг Samsung требует отрендеренной страницы за доверенным IP, и Crawling API принимает ваш токен, запускает страницу в настоящем браузере, ротирует жилые IP на стороне сервера и передаёт готовый HTML. Управлять парком headless-браузеров и пулом прокси самостоятельно не нужно. Начните с публичного листинга на бесплатном тарифе.
Шаг 2: Разбор полей продукта с помощью cheerio
Имея отрендеренный HTML, загрузите его в cheerio и обойдите сетку продуктов. Паттерн такой: найдите повторяющуюся карточку продукта, затем для каждой карточки извлеките нужные поля по CSS-селектору. Витрина Samsung размещает каждую карточку предсказуемо, поэтому можно сопоставить название продукта, цвет, варианты, рейтинг, характеристики и URL с отдельными селекторами. Приведённые ниже селекторы взяты прямо из разметки живого каталога.
const cheerio = require("cheerio"); function scrapeProducts(html) { const $ = cheerio.load(html); const products = []; $(".js-pfv2-content-wrap .js-pfv2-product-card").each((_, element) => { const card = $(element); const name = card .find(".pd03-product-card__product-name-text") .text() .trim(); const color = card .find(".option-selector-v2__color-name-text-in") .text() .trim(); const variants = card .find(".option-selector-v2__size-text") .map((_, el) => $(el).text().trim()) .get(); const rating = card .find(".rating__point span:last-child") .text() .trim(); const reviewCount = card .find(".rating__count") .text() .replace(/[^0-9]/g, ""); const specifications = card .find(".pd03-product-card__spec-list .pd03-product-card__spec-item") .map((_, el) => $(el).text().trim()) .get(); const url = card .find(".pd03-product-card__product-image-link") .attr("href"); products.push({ name, model: [color, ...variants].filter(Boolean).join(", "), rating, reviewCount, specifications: specifications.join(", "), url: url && (url.startsWith("http") ? url : `https://www.samsung.com${url}`), }); }); return products; }
Каждое поле сопоставляется с селектором, который вы можете проверить самостоятельно: щёлкните правой кнопкой на элементе живого листинга Samsung, выберите «Просмотреть код» и считайте класс с выделенного узла. .text() читает видимую метку; .attr("href") читает ссылку. Пара .map().get() превращает набор совпавших элементов (варианты и пункты характеристик) в обычный массив. Поскольку href на витрине иногда бывают относительными, код добавляет домен, когда URL не начинается с http. Подробнее о построении надёжных селекторов смотрите в руководстве по XPath и CSS-селекторам.
Шаг 3: Сборка полного скрипта
Теперь соедините загрузку и парсер: запросите страницу, передайте тело в scrapeProducts, выведите результат и запишите в JSON-файл. Это полный скрипт, готовый к копированию.
const { CrawlingAPI } = require("crawlbase"); const cheerio = require("cheerio"); const fs = require("fs"); const api = new CrawlingAPI({ token: "YOUR_CRAWLBASE_JS_TOKEN" }); const samsungProductsURL = "https://www.samsung.com/levant/smartphones/all-smartphones/"; function scrapeProducts(html) { const $ = cheerio.load(html); const products = []; const totalResults = $(".js-pfv2-result-total-count").text().trim(); $(".js-pfv2-content-wrap .js-pfv2-product-card").each((_, element) => { const card = $(element); const color = card .find(".option-selector-v2__color-name-text-in") .text() .trim(); const variants = card .find(".option-selector-v2__size-text") .map((_, el) => $(el).text().trim()) .get(); const url = card .find(".pd03-product-card__product-image-link") .attr("href"); products.push({ name: card.find(".pd03-product-card__product-name-text").text().trim(), model: [color, ...variants].filter(Boolean).join(", "), rating: card.find(".rating__point span:last-child").text().trim(), reviewCount: card.find(".rating__count").text().replace(/[^0-9]/g, ""), specifications: card .find(".pd03-product-card__spec-list .pd03-product-card__spec-item") .map((_, el) => $(el).text().trim()) .get() .join(", "), url: url && (url.startsWith("http") ? url : `https://www.samsung.com${url}`), }); }); return { totalResults, products }; } api .get(samsungProductsURL, { ajax_wait: true, page_wait: 10000 }) .then((response) => { if (response.statusCode !== 200) { throw new Error(`Failed to fetch HTML. Status: ${response.statusCode}`); } const data = scrapeProducts(response.body); console.log(data); fs.writeFileSync("samsung-scraped.json", JSON.stringify(data, null, 2)); }) .catch(console.error);
Снова запустите node index.js. Скрипт загружает отрендеренный каталог, разбирает каждую карточку продукта, выводит результат и сохраняет его в samsung-scraped.json. Поле totalResults фиксирует счётчик, который показывает витрина, что позволяет сверить, сколько продуктов указала страница против количества разобранных карточек.
Как выглядит результат
Каждая запись представляет один телефон с полями, сопоставленными с понятными ключами. Усечённый пример JSON-файла:
{ "totalResults": "42 results", "products": [ { "name": "Galaxy S24 Ultra", "model": "Titanium Yellow, 256 GB, 512 GB, 1 TB", "rating": "4.3", "reviewCount": "128", "specifications": "Industry-leading hardware meets world-changing AI, Made with titanium. Built to last, 200MP high-resolution photography", "url": "https://www.samsung.com/levant/smartphones/galaxy-s24-ultra/" }, { "name": "Galaxy A04s", "model": "Black, 64 GB, 128 GB", "rating": "5.0", "reviewCount": "17", "specifications": "6.5\" Infinity-V Display, 50MP Camera, 5000mAh Battery", "url": "https://www.samsung.com/levant/smartphones/galaxy-a/galaxy-a04s-black-64gb-sm-a047fzkgmeb/" } ] }
Отсюда JSON сразу передаётся в базу данных или ноутбук. Если предпочитаете плоский файл для электронной таблицы, преобразуйте массив в строки и запишите CSV; набор полей остаётся тем же.
Масштабирование по категориям и страницам
Одна страница каталога является строительным блоком; реальная задача охватывает несколько. Samsung публикует отдельные URL листингов по регионам и категориям (все смартфоны, складные телефоны, планшеты и т.д.), а длинные списки разбиваются на страницы или загружают больше карточек при прокрутке. Для масштабирования ведите список URL листингов и запускайте те же загрузку и разбор для каждого, затем объединяйте результаты.
const listingURLs = [ "https://www.samsung.com/levant/smartphones/all-smartphones/", "https://www.samsung.com/levant/smartphones/galaxy-z/", ]; async function scrapeAll(urls) { const all = []; for (const url of urls) { const response = await api.get(url, { ajax_wait: true, page_wait: 10000 }); if (response.statusCode === 200) { all.push(...scrapeProducts(response.body).products); } await new Promise((r) => setTimeout(r, 2000)); } return all; }
Короткий setTimeout между запросами задаёт темп запуска, чтобы не перегружать витрину. Поскольку каждый листинг использует одинаковый макет карточек, единственный парсер scrapeProducts работает для всех них. Если категория использует бесконечную прокрутку вместо отдельных страниц, Crawling API может прокрутить страницу перед захватом, чтобы дополнительные карточки попали в разбираемый HTML.
Как оставаться незаблокированным
Crawling API берёт на себя сложную часть защиты от блокировок: он рендерит каждую страницу в настоящем браузере и маршрутизирует запрос через ротирующиеся жилые IP, поэтому ваш трафик выглядит как обычные посетители, а не один атакующий адрес. Поддерживайте разумную частоту собственных запросов, задавайте темп пакетам с короткой задержкой, как показано выше, и следите за кодами статусов, чтобы снизить нагрузку при появлении вызовов. Если вы строите собственный стек с Puppeteer, ротация прокси и работоспособность IP являются аспектами, в которые стоит вложиться. Для более детального рассмотрения читайте руководство по скрапингу без блокировок.
Законно ли парсить Samsung?
Парсинг публичных данных каталога несёт значительно меньший риск, чем парсинг контента за авторизацией, однако ответ всё равно зависит от того, что вы собираете, как используете и каковы правила сайта. Данное руководство намеренно ограничено публичной информацией о продуктах: название модели, цена, рейтинг, количество отзывов, ключевые характеристики и URL продукта, которые витрина Samsung показывает каждому посетителю без аккаунта. Это данные, которые видит покупатель, и их сбор для отслеживания цен или исследований является обоснованным случаем.
Перед запуском в промышленных объёмах ознакомьтесь с условиями использования Samsung и проверьте файл robots.txt, чтобы узнать, какие пути сайт просит краулеры оставить в покое, и соблюдайте эти требования. Поддерживайте умеренную частоту запросов, чтобы не создавать нагрузку на серверы. Данное руководство не охватывает ничего за авторизацией, личных или аккаунтных данных, истории заказов или защищённых авторским правом медиа, таких как фотографии продуктов, которые вы собираетесь перераспространять. Это выходит за рамки данного руководства, и обращение к ним нарушает условия Samsung.
Для коммерческого или крупнообъёмного использования предпочтительны официальные каналы. Если нужны массовые данные каталога или цен для перепродажи или распространения, партнёрские и разработческие программы Samsung являются правильным путём, а получение разрешения или фида данных чище, чем парсинг в промышленных масштабах. Когда публичный каталог является единственным источником нужных данных, ограничивайте работу этими публичными данными, соблюдайте заявленные правила сайта и консультируйтесь с юристом, если ваш случай является коммерческим или неоднозначным.
Ключевые выводы
- Сначала рендеринг, потом разбор. Каталог Samsung загружается на стороне клиента, поэтому обычный запрос возвращает пустую оболочку; Crawling API с JS-токеном сначала рендерит сетку.
-
Один вызов покрывает рендеринг и доверенный IP.
api.getсajax_waitиpage_waitждёт поздно загружаемую сетку и маршрутизирует через жилые IP на стороне сервера. - cheerio выполняет извлечение. Сопоставьте название, модель, рейтинг, количество отзывов, характеристики и URL с селекторами карточек витрины и ожидайте смещения этих классов со временем.
- Масштабируйте циклом по URL листингов с паузами. Тот же парсер работает для каждой категории, поэтому реальная задача, это список ссылок на листинги плюс короткая задержка между запросами.
-
Оставайтесь в рамках публичных данных. Собирайте только поля каталога, видимые всем, соблюдайте Условия использования Samsung и файл
robots.txtи предпочитайте официальные каналы для коммерческих или крупнообъёмных нужд.
Часто задаваемые вопросы
Почему обычный запрос не возвращает продукты с Samsung?
Потому что витрина рендерит сетку продуктов на стороне клиента с помощью JavaScript. Обычный HTTP-запрос возвращает оболочку страницы с пустыми слотами каталога, поскольку продукты, цены и рейтинги заполняются только после выполнения скриптов страницы в браузере. JS-токен Crawling API сначала рендерит страницу, поэтому карточки присутствуют при разборе cheerio.
Нужен ли обычный токен или JS-токен для Samsung?
Используйте JS-токен. Обычный токен загружает статичный HTML, который на витрине Samsung оставляет сетку продуктов пустой. JS-токен рендерит страницу в настоящем браузере перед передачей HTML, поэтому название, модель, цена, рейтинг, количество отзывов, характеристики и URL присутствуют при разборе.
Какие данные можно парсить со страницы листинга Samsung?
Публичные поля каталога: название продукта, варианты модели, цена, средний рейтинг, количество отзывов, ключевые пункты характеристик каждой карточки и URL продукта. Данное руководство ограничено этими публичными данными. Оно не охватывает информацию об аккаунте, историю заказов или что-либо за авторизацией.
Мои cheerio-селекторы возвращают пустые строки. Что изменилось?
Скорее всего, разметка Samsung. Имена классов, такие как js-pfv2-product-card, pd03-product-card__product-name-text и rating__point, меняются без предупреждения, поэтому работавшие в прошлом месяце селекторы могут сломаться. Повторно проверьте живой листинг в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание является нормой для любого промышленного скрапера.
Можно ли парсить много страниц Samsung без блокировки?
Да, в разумных пределах. Crawling API ротирует жилые IP и рендерит каждую страницу в настоящем браузере, поэтому отдельные запросы выглядят как настоящие посещения. Поддерживайте низкую частоту запросов на IP, добавляйте короткую задержку между запросами, как показано в разделе о масштабировании, и варьируйте цели вместо циклического обхода одного пути. Следите за кодами статусов и снижайте нагрузку при появлении вызовов.
Предлагает ли Samsung официальный способ получения данных о продуктах?
Для коммерческого или крупнообъёмного использования партнёрские и разработческие программы Samsung являются правильным каналом, и запрос разрешения или фида данных чище, чем парсинг в промышленных масштабах. Прибегайте к парсингу только тогда, когда публичный каталог является единственным источником нужных публичных полей, и ограничивайте работу этими публичными данными.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

