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

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

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

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

  • Название наименование товара в листинге, например "Wireless Bluetooth Earbuds Noise Cancelling".
  • Цена текущая цена на карточке, например "$12.96".
  • Рейтинг рейтинг продавца или товара, например "4.9".
  • Заказы количество заказов или продаж, например "600 sold".
  • URL товара ссылка на страницу отдельного товара.

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

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

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

Зачем нужен JS-токен

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

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

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

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

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

Аккаунт Crawlbase и JS-токен. Зарегистрируйтесь, откройте личный кабинет и скопируйте свой JavaScript (JS) токен со страницы документации аккаунта. Обращайтесь с токеном как с паролем: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.

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

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

bash
node --version

mkdir aliexpress-search-scraper && cd aliexpress-search-scraper
npm init -y

npm install crawlbase cheerio

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

Шаг 1: Формирование URL поиска из ключевого слова

AliExpress превращает поиск по ключевому слову в предсказуемый URL. Путь поиска оптовых товаров принимает ключевое слово с пробелами, заменёнными дефисами, что и есть то преобразование, которое использовал унаследованный скрейпер. Оберните это в небольшую вспомогательную функцию, чтобы любое ключевое слово превращалось в корректный URL поиска.

javascript
function searchUrl(keyword, page = 1) {
  const slug = keyword.trim().split(' ').join('-');
  return `https://www.aliexpress.com/w/wholesale-${slug}.html?page=${page}`;
}

console.log(searchUrl('wireless earbuds'));
// https://www.aliexpress.com/w/wholesale-wireless-earbuds.html?page=1

Параметр page, это то, что вы впоследствии будете увеличивать для обхода пагинации. Пока он остаётся равным 1, чтобы сначала заставить работать одну страницу до масштабирования.

Шаг 2: Загрузка отрендеренной страницы поиска

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

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

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;
}

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

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

Crawlbase AliExpress Scraper

AliExpress строит сетку товаров на стороне клиента и перехватывает скрейперный трафик, поэтому вам нужна отрендеренная страница за доверенным IP в одном вызове. Crawling API принимает JS-токен, запускает страницу в настоящем браузере, ротирует жилые IP на стороне сервера и возвращает готовый HTML, поэтому вам не нужно самостоятельно управлять парком headless-браузеров и пулом прокси. Начните с публичной страницы поиска на бесплатном тарифе.

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

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

javascript
const cheerio = require('cheerio');

function parseSearch(html) {
  const $ = cheerio.load(html);
  const items = [];

  $('a.search-card-item').each((_, el) => {
    const card = $(el);
    const title = card.find('[title]').first().attr('title');
    if (!title) return;

    const href = card.attr('href') || '';
    const url = href.startsWith('//') ? `https:${href}` : href;

    items.push({
      title: title.trim(),
      price: card.find('.multi--price-sale--U-S0jtj').text().trim() || null,
      rating: card.find('.multi--starList--Fh2vqvr').attr('aria-label') || null,
      orders: card.find('.multi--trade--Ktbl2jB').text().trim() || null,
      url: url || null,
    });
  });

  return items;
}

Несколько деталей обеспечивают надёжность. Название читается из атрибута title карточки, а не из её текста, поскольку AliExpress усекает видимое имя, но сохраняет полную строку в атрибуте. URL товара на AliExpress часто является протокол-относительным (начинается с //), поэтому вспомогательная функция добавляет префикс https: для получения абсолютного адреса, что соответствует устаревшему выводу, где голые ссылки с https: были известной шероховатостью. Каждое поле возвращает null при отсутствии элемента, что характерно, поскольку не каждая карточка показывает рейтинг или количество заказов.

Селекторы дрейфуют

AliExpress хэшируют имена классов (multi--price-sale--U-S0jtj, multi--starList--Fh2vqvr и прочие) и регенерирует эти хэши при деплоях, поэтому они меняются без предупреждения. Относитесь к приведённым выше селекторам как к стартовому шаблону, а не к договору. Когда поле возвращает null, переизучите живую страницу в инструментах разработчика браузера и обновите селектор. Периодическое обслуживание селекторов, норма для любого продакшн-скрейпера, а не признак поломки.

Шаг 4: Сборка воедино

Теперь соедините построитель URL, загрузку и парсинг в один запускаемый скрипт. Сформируйте URL, загрузите отрендеренный HTML, передайте его в парсер и выведите структурированные записи.

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

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

function searchUrl(keyword, page = 1) {
  const slug = keyword.trim().split(' ').join('-');
  return `https://www.aliexpress.com/w/wholesale-${slug}.html?page=${page}`;
}

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 parseSearch(html) {
  const $ = cheerio.load(html);
  const items = [];
  $('a.search-card-item').each((_, el) => {
    const card = $(el);
    const title = card.find('[title]').first().attr('title');
    if (!title) return;
    const href = card.attr('href') || '';
    const url = href.startsWith('//') ? `https:${href}` : href;
    items.push({
      title: title.trim(),
      price: card.find('.multi--price-sale--U-S0jtj').text().trim() || null,
      rating: card.find('.multi--starList--Fh2vqvr').attr('aria-label') || null,
      orders: card.find('.multi--trade--Ktbl2jB').text().trim() || null,
      url: url || null,
    });
  });
  return items;
}

async function main() {
  const html = await crawl(searchUrl('wireless earbuds'));
  if (!html) return;
  const items = parseSearch(html);
  console.log(JSON.stringify(items.slice(0, 3), null, 2));
}

main();

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

Запустите полный скрипт командой node scraper.js и получите чистый массив записей, по одной на товар, готовый для записи в JSON, CSV или базу данных.

json
[
  {
    "title": "Wireless Bluetooth Earbuds Noise Cancelling Touch Control",
    "price": "$12.96",
    "rating": "4.9",
    "orders": "600 sold",
    "url": "https://www.aliexpress.com/item/1005005690275912.html"
  },
  {
    "title": "TWS Gaming Earphones Low Latency Long Battery Life",
    "price": "$8.31",
    "rating": "4.7",
    "orders": "2000 sold",
    "url": "https://www.aliexpress.com/item/1005005123456789.html"
  }
]

Обход страниц результатов

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

javascript
async function scrapePages(keyword, totalPages) {
  const all = [];
  for (let page = 1; page <= totalPages; page++) {
    const html = await crawl(searchUrl(keyword, page));
    if (html) all.push(...parseSearch(html));
  }
  return all;
}

scrapePages('wireless earbuds', 3).then((rows) => {
  console.log(`Collected ${rows.length} products`);
});

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

Экспорт в JSON и CSV

Хранить строки в памяти удобно для демонстрации, но обычно результаты нужны на диске. Встроенный в Node модуль fs записывает JSON в одну строку, а небольшая вспомогательная функция превращает тот же массив в CSV для электронных таблиц или быстрого импорта.

javascript
const fs = require('fs');

function toCsv(rows) {
  const headers = ['title', 'price', 'rating', 'orders', 'url'];
  const escape = (v) => `"${(v ?? '').toString().replace(/"/g, '""')}"`;
  const lines = rows.map((r) => headers.map((h) => escape(r[h])).join(','));
  return [headers.join(','), ...lines].join('\n');
}

scrapePages('wireless earbuds', 3).then((rows) => {
  fs.writeFileSync('aliexpress-products.json', JSON.stringify(rows, null, 2));
  fs.writeFileSync('aliexpress-products.csv', toCsv(rows));
  console.log(`Saved ${rows.length} products to JSON and CSV`);
});

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

Как не попасть в блок

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

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

Общая методология описана в статье как скрейпить сайты без блокировок. Если вы предпочитаете маршрутизировать собственный трафик через ротирующий пул вместо использования управляемого API, Smart AI Proxy предоставляет ту же ротацию жилых IP в качестве подключаемого прокси-эндпоинта; подход с прокси для именно этого сайта рассмотрен в статье о скрейпинге AliExpress с прокси. AliExpress также является частой целью для более широкого веб-скрейпинга e-commerce, где тот же паттерн «загрузка-затем-парсинг» переносится между сайтами, а поля цен, собранные здесь, напрямую питают ценовую разведку.

Законно ли скрейпить AliExpress?

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

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

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

Итоги

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

  • AliExpress строит сетку на стороне клиента. Простой запрос возвращает пустую оболочку, поэтому страницу поиска необходимо отрендерить перед парсингом.
  • Нужны одновременно рендеринг и доверенный IP. Crawling API с JS-токеном обеспечивает и то, и другое в одном вызове; ajax_wait и page_wait управляют временем ожидания сетки товаров.
  • cheerio выполняет извлечение. Выбирайте каждую карточку поиска, затем сопоставляйте название, цену, рейтинг, заказы и URL товара с текущими селекторами и ожидайте дрейфа хэшированных имён классов AliExpress.
  • Масштабирование через цикл по параметру page. Параметр запроса page обходит страницы результатов, и тот же парсер работает на каждой, после чего экспортируйте строки в JSON и CSV.
  • Работайте только с публичными данными. Соблюдайте Условия использования и robots.txt AliExpress, предпочитайте официальный API Alibaba для объёмного или коммерческого использования и никогда не трогайте логины, персональные данные или охраняемые авторским правом материалы для перераспространения.

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

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

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

Нужен ли обычный токен или JS-токен для AliExpress?

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

Как скрейпить несколько страниц результатов поиска AliExpress?

AliExpress предоставляет номер страницы через параметр запроса page на URL поиска оптовых товаров. Увеличивайте его в цикле, загружайте каждую страницу через Crawling API и запускайте один и тот же парсер на каждой странице. Структура карточек идентична на всех страницах, поэтому один парсер собирает все строки, которые затем записываются в JSON или CSV.

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

Почти наверняка разметка AliExpress. Карточки товаров используют хэшированные имена классов вроде multi--price-sale--U-S0jtj, которые сайт регенерирует при деплоях, поэтому селекторы, работавшие в прошлом месяце, могут сломаться. Переизучите живую страницу в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание селекторов, норма для любого продакшн-скрейпера.

Можно ли скрейпить персональные данные покупателей или продавцов с AliExpress?

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

Что лучше: официальный API или скрейпинг сайта?

Если вам нужны объём, гарантированная структура или права на коммерческое повторное использование, используйте официальную открытую платформу или партнёрский API Alibaba. Он создан для этого и держит вас на правильной стороне условий AliExpress. Скрейпинг публичных страниц поиска с подходом, описанным в этом руководстве, подходит для небольших публичных исследований без API-доступа, при условии соблюдения Условий использования, robots.txt и ограничений скорости.

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

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

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

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