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

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

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

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

  • Название полное наименование товара, как указано в объявлении.
  • Цена текущая цена, например "US $3.45".
  • Рейтинг средняя оценка покупателей, например "4.8".
  • Продано количество единиц, указанное в объявлении как проданное.
  • Название магазина магазин-продавец товара.
  • Доставка стоимость или условия доставки, указанные на странице.

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

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

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

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

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

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

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

Базовые знания Python. Вы должны уметь писать и запускать скрипты, а также устанавливать пакеты через pip. Если работа с разбором HTML для вас нова, наш вводный материал как использовать BeautifulSoup в Python охватывает основы селекторов, на которые опирается это руководство.

Python 3.8 или выше. Проверьте версию командой python --version. Если Python не установлен, скачайте его с python.org или через дистрибутив вроде Anaconda.

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

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

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

bash
python --version

python -m venv aliexpress_env
source aliexpress_env/bin/activate

pip install crawlbase beautifulsoup4

В Windows активируйте окружение командой aliexpress_env\Scripts\activate вместо строки с source. Две зависимости выполняют основную работу: crawlbase, официальный клиент Crawling API, а beautifulsoup4 разбирает возвращаемый HTML, позволяя извлекать отдельные поля по CSS-селектору.

Шаг 1: Получить отрендеренную страницу товара

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

python
from crawlbase import CrawlingAPI

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 8000, "country": "US"}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['status_code']}")
    return None

if __name__ == "__main__":
    page_url = "https://www.aliexpress.com/item/1005006597796136.html"
    html = crawl(page_url)
    print(html[:500] if html else "No HTML returned")

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

Crawlbase AliExpress Scraper

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

Шаг 2: Разобрать поля товара с помощью BeautifulSoup

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

python
from bs4 import BeautifulSoup

def text_of(soup, selector):
    el = soup.select_one(selector)
    return el.get_text(strip=True) if el else None

def scrape_product(html):
    soup = BeautifulSoup(html, "html.parser")

    return {
        "title": text_of(soup, "h1[data-pl='product-title']"),
        "price": text_of(soup, ".product-price-current"),
        "rating": text_of(soup, "[data-pl='product-reviewer'] strong"),
        "orders_sold": text_of(soup, "[data-pl='product-reviewer'] span"),
        "store_name": text_of(soup, "a[data-pl='store-name']"),
        "shipping": text_of(soup, ".dynamic-shipping-line strong"),
    }

Вспомогательная функция text_of делает две полезные вещи одновременно: запрашивает один элемент и возвращает None, если элемент отсутствует, вместо того чтобы выбрасывать исключение при вызове .get_text() на несуществующем объекте. Это делает извлечение устойчивым к отсутствию поля в конкретном объявлении, что встречается часто: не каждый товар отображает количество заказов или строку с доставкой. Количество продаж и рейтинг часто находятся в одном блоке с отзывами, поэтому они считываются из соседних элементов внутри него.

Селекторы устаревают

Имена классов и маркеры data-pl на AliExpress меняются без предупреждения и различаются между шаблонами товаров и локалями. Воспринимайте приведённые выше селекторы как отправную точку, а не как контракт. Если поле возвращает None, повторно проверьте живую страницу в инструментах разработчика вашего браузера и обновите селектор. Периодическое обновление селекторов, норма для любого производственного парсера, а не признак поломки.

Шаг 3: Собрать всё вместе

Теперь свяжите получение данных и разбор в один готовый к запуску скрипт. Получите отрендеренный HTML, передайте его парсеру и выведите структурированную запись.

python
import json
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 8000, "country": "US"}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['status_code']}")
    return None

def text_of(soup, selector):
    el = soup.select_one(selector)
    return el.get_text(strip=True) if el else None

def scrape_product(html):
    soup = BeautifulSoup(html, "html.parser")
    return {
        "title": text_of(soup, "h1[data-pl='product-title']"),
        "price": text_of(soup, ".product-price-current"),
        "rating": text_of(soup, "[data-pl='product-reviewer'] strong"),
        "orders_sold": text_of(soup, "[data-pl='product-reviewer'] span"),
        "store_name": text_of(soup, "a[data-pl='store-name']"),
        "shipping": text_of(soup, ".dynamic-shipping-line strong"),
    }

def main():
    page_url = "https://www.aliexpress.com/item/1005006597796136.html"
    html = crawl(page_url)
    if not html:
        return
    data = scrape_product(html)
    print(json.dumps(data, indent=2))

if __name__ == "__main__":
    main()

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

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

json
{
  "title": "Wireless Bluetooth Earbuds Noise Cancelling Touch Control",
  "price": "US $12.74",
  "rating": "4.7",
  "orders_sold": "3,210 sold",
  "store_name": "TechGear Official Store",
  "shipping": "Free shipping"
}

Масштабирование на множество товаров

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

python
import time
import random

products = [
    "https://www.aliexpress.com/item/1005006597796136.html",
    "https://www.aliexpress.com/item/1005005899876543.html",
]

results = []
for url in products:
    html = crawl(url)
    if html:
        results.append(scrape_product(html))
    time.sleep(random.uniform(2, 5))

with open("products.json", "w") as f:
    json.dump(results, f, indent=2)

Рандомизированный sleep между запросами распределяет трафик вместо отправки по предсказуемому ритму. Для сбора URL товаров в масштабе парсите страницы поиска и категорий AliExpress с тем же паттерном «получить, разобрать», собирайте ссылки на товары, а затем посещайте каждую. Соблюдайте разумный объём и учитывайте лимиты скорости, описанные ниже.

Как оставаться незаблокированным

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

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

Более широкий план действий описан в как парсить сайты без блокировок и подробнее в как обходить CAPTCHA при парсинге. Есть также специальный материал об использовании прокси для парсинга AliExpress для тех, кто хочет узнать больше о прокси-стороне. Если вы предпочитаете маршрутизировать собственный трафик через ротирующий пул вместо управляемого API, Smart AI Proxy (также называемый AI Proxy) предоставляет ту же ротацию резидентских IP в виде drop-in прокси-эндпоинта.

Законен ли парсинг AliExpress?

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

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

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

Итоги

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

  • AliExpress рендерится на стороне клиента. Обычный запрос возвращает практически пустой скелет, поэтому перед разбором необходимо отрендерить страницу.
  • Нужны одновременно рендеринг и доверенный IP. Crawling API с JS-токеном делает и то, и другое в одном вызове; ajax_wait, page_wait и country управляют ожиданием и регионом рендеринга.
  • BeautifulSoup выполняет извлечение. Сопоставьте название, цену, рейтинг, количество продаж, название магазина и доставку с текущими селекторами и ожидайте их устаревания.
  • Масштабируйтесь через цикл по URL с соблюдением темпа. Тот же парсер работает для каждого товара, поэтому реальная задача, это просто список ссылок на товары плюс рандомизированные задержки и ротация.
  • Оставайтесь в рамках публичных данных. Соблюдайте условия использования AliExpress и robots.txt, для лицензированных или массовых данных используйте официальный API, и никогда не касайтесь логинов, данных заказов или персональной информации.

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

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

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

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

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

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

Скорее всего, разметка AliExpress. Имена классов и маркеры data-pl меняются без предупреждения и различаются между шаблонами товаров и локалями, поэтому работавшие в прошлом месяце селекторы могут сломаться. Повторно проверьте живую страницу товара в инструментах разработчика браузера и обновите селекторы. Периодическое обновление селекторов, норма для любого производственного парсера.

Как обеспечить согласованность цен и доставки между запусками?

Фиксируйте регион с помощью параметра country в каждом запросе. AliExpress варьирует цену, валюту и доставку в зависимости от местоположения, поэтому запуск без фиксации региона с ротацией по странам даёт несравнимые записи. Постоянная настройка страны также позволяет избежать циклов геоперенаправления при несоответствии IP.

Как избежать блокировок при парсинге AliExpress?

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

Можно ли использовать спарсенные цены AliExpress для ценообразования своих товаров?

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

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

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

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

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