Как собирать данные о товарах с AliExpress для исследований в дропшиппинге

AliExpress скрывает данные о товарах в переменной JavaScript, а не в HTML, который вы видите. Получите этот JSON, и вы получите цены, скидки, страну отправления и количество продаж за один запрос — вот как, с учетом защиты от блокировок.

AliExpress — крупнейшая глобальная торговая площадка и основной источник для исследований в дропшиппинге: история цен и скидок, что действительно продается, страна отправления и как предложения меняются в зависимости от страны. В 2026 году она сильно полагается на рендеринг JavaScript и рандомизированные имена классов, что пугает людей, заставляя их запускать полный браузер. Обычно это не требуется. Данные о товаре уже находятся в исходном коде страницы в переменной JavaScript — извлеките это, и вы получите чистые структурированные данные за один запрос. Это руководство показывает метод скрытого JSON, геоизмерение, которое делает данные AliExpress ценными, и защиту прокси, которая поддерживает работу скрейпера.

Данные находятся в window.runParams, а не в DOM

Откройте страницу категории или результатов поиска и посмотрите исходный код. Все предварительные просмотры товаров хранятся в переменной JavaScript, называемой window.runParams, спрятанной внутри тега <script>. Это современный распространенный шаблон — сервер отправляет данные в виде JSON, а фронтенд рендерит их на стороне клиента. Для скрейпера это подарок: вы полностью обходите хрупкие селекторы CSS, извлекаете тег скрипта с помощью регулярного выражения и анализируете его как словарь. Эта техника называется скрытым сбором веб-данных, и она гораздо более устойчива, чем погоня за именами классов, которые меняются при каждом развертывании.

import re, json, httpx

HEADERS = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
    "accept-language": "en-US,en;q=0.9",
}

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"

def get_run_params(html: str) -> dict:
    # The product data lives in window.runParams = {...};
    m = re.search(r"window\.runParams\s*=\s*(\{.+?\});", html, re.DOTALL)
    if not m:
        raise ValueError("runParams not found - page may be blocked or changed")
    return json.loads(m.group(1))

url = "https://www.aliexpress.com/category/.../catName.html"
r = httpx.get(url, headers=HEADERS, proxy=PROXY, timeout=30)
data = get_run_params(r.text)

Анализ полей, которые важны для исследований

Объект runParams огромен, поэтому извлекайте только те поля, которые действительно используются для исследований в дропшиппинге и ценообразовании: название листинга, оригинальная цена и цена со скидкой, процент скидки, сколько продано и — критически — страна отправления, которая определяет время доставки и доверие покупателей. Вложенность выглядит устрашающе, но она стабильна:

def parse_items(data: dict) -> list[dict]:
    items = data.get("mods", {}).get("itemList", {}).get("content", [])
    out = []
    for it in items:
        prices = it.get("prices", {})
        sale = prices.get("salePrice", {})
        orig = prices.get("originalPrice", {})
        out.append({
            "id": it.get("productId"),
            "title": it.get("title", {}).get("displayTitle"),
            "sale_price": sale.get("minPrice"),
            "orig_price": orig.get("minPrice"),
            "discount_pct": sale.get("discount"),
            "currency": sale.get("currencyCode"),
            "sold": it.get("trade", {}).get("tradeDesc"),   # e.g. "1,000+ sold"
            "store_id": it.get("store", {}).get("storeId"),
        })
    return out

for row in parse_items(data)[:5]:
    print(row["title"][:40], row["sale_price"], f"-{row['discount_pct']}%", row["sold"])

Этот единственный вызов дает вам экономику товара: листинг, показывающий оригинальную цену $65.85, снижающуюся до цены продажи $23.29, это скидка 64% — такой сигнал маржи, который говорит вам, стоит ли товар закупать. Количество "продано" — это ваш прокси спроса; в сочетании по категории он ранжирует победителей, не заставляя вас открывать страницу с отзывами.

Схема конвейера, показывающая запрос страницы AliExpress, извлечение регулярного выражения window.runParams и разобранные поля товара в виде JSON
Данные листинга рендерятся на сервере в переменной JavaScript — для их чтения не требуется безголовый браузер.

Пагинация поиска без перегрузки сайта

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

import asyncio, httpx

ROTATING = "http://USER:PASS@rotating.quantumproxies.io:8000"

async def fetch_page(client, query, page):
    url = f"https://www.aliexpress.com/w/wholesale-{query}.html?page={page}"
    for attempt in range(3):
        r = await client.get(url, headers=HEADERS, timeout=30)
        if r.status_code == 200:
            return parse_items(get_run_params(r.text))
        if r.status_code == 403:                 # blocked: back off, rotate exit
            await asyncio.sleep(2 ** attempt)
    return []

async def scrape_search(query, max_pages=5):
    async with httpx.AsyncClient(proxy=ROTATING) as client:
        sem = asyncio.Semaphore(3)               # gentle concurrency
        async def guarded(p):
            async with sem:
                return await fetch_page(client, query, p)
        pages = await asyncio.gather(*[guarded(p) for p in range(1, max_pages + 1)])
        return [row for page in pages for row in page]

results = asyncio.run(scrape_search("wireless earbuds"))
print(len(results), "products")

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

Собирайте данные с AliExpress на более чем 90 миллионах резидентных IP

Гео — это вся суть

AliExpress персонализирует цены, валюту, акции и склад отправления в зависимости от местоположения посетителя — один и тот же товар может показывать карту, локализованную для США, с более быстрой доставкой на IP из США и другую цену и происхождение на европейский IP. Для исследований в дропшиппинге это геоизмерение — это данные: вы хотите знать, что на самом деле видит клиент на вашем целевом рынке. Поэтому целенаправленно устанавливайте страну выхода. Направляйте через IP в каждом рынке, на который вы продаете, и фиксируйте дельты; товар, который дешев и отправляется локально в одном регионе, но медленный и дорогой в другом, — это совершенно другая ставка. Наше руководство по прокси для исследований в дропшиппинге углубляется в превращение этих матриц в решения по закупке.

# One product, three markets - compare price and ship-from per geo
MARKETS = {
    "us": "http://USER:PASS-country-us@gate.quantumproxies.io:8000",
    "de": "http://USER:PASS-country-de@gate.quantumproxies.io:8000",
    "br": "http://USER:PASS-country-br@gate.quantumproxies.io:8000",
}
for market, proxy in MARKETS.items():
    r = httpx.get(product_url, headers=HEADERS, proxy=proxy, timeout=30)
    d = get_run_params(r.text)
    # read price + shipFrom from the product detail runParams for this geo
    print(market, "->", extract_price_and_origin(d))

Отзывы и наличие живут в отдельных запросах

Листинги дают вам цену и спрос, но два высокоценных поля находятся за своими собственными запросами. Отзывы клиентов не находятся в runParams страницы товара — они загружаются с выделенной конечной точки отзывов, с пагинацией, поэтому для сбора оценок и текста отзывов вы следуете этому вызову для каждого товара, а не анализируете основную страницу. Сигналы наличия аналогичны: количество "продано" в листинге — это кумулятивный прокси спроса, в то время как точная доступность по варианту (цвет, размер, склад отправления) поступает из данных SKU в полезной нагрузке деталей товара. Для исследований в дропшиппинге это важно, потому что товар может выглядеть как победитель по цене и продажам, в то время как конкретный вариант, который вы хотите продать, отсутствует на складе, обслуживающем ваш рынок.

Рассматривайте их как второй проход: сначала собирайте листинги, чтобы ранжировать кандидатов по скидке и количеству проданных, затем обогащайте только ваш шорт-лист страницами отзывов и наличием по вариантам. Это сохраняет объем запросов — и риск блокировки — пропорционально тому, насколько серьезно вы относитесь к каждому товару, вместо того чтобы перегружать каждый листинг данными, которые вы не будете использовать.

Когда стоит отказаться от самодельного скрейпера

Метод скрытого JSON устойчив, но AliExpress меняет формы полезной нагрузки, закрывает отзывы за отдельной конечной точкой и усиливает блокировки при большом объеме. Если вы не хотите поддерживать регулярные выражения и логику повторных попыток, Scraper API принимает URL и возвращает разобранный JSON — он обрабатывает рендеринг, ротацию и слой защиты от блокировок, и вы можете гео-нацеливаться с помощью одного параметра. Это прагматичный выбор, когда вы собираете тысячи товаров по рынкам по расписанию. Для общего шаблона чтения данных прямо из клиентских полезных нагрузок, смотрите нашу заметку о почему скрейпер возвращает пустую страницу.

Контрольный список, сопоставляющий препятствия при сборе данных с AliExpress, такие как 403 и гео-цены, с решениями, такими как ротация резидентных IP и гео-нацеливание
Три препятствия, три решения — большинство сбоев скрейперов AliExpress связаны с качеством IP или гео-проблемой.

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

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

Да. Публично доступные данные о листингах — названия, цены, скидки, количество проданных, изображения и страна отправления — подаются в переменную JavaScript window.runParams на страницах категорий, поиска и товаров. Вы извлекаете их с помощью регулярного выражения и анализируете как JSON, не нуждаясь в безголовом браузере для листингов. Уважайте условия и ограничения скорости AliExpress.

Есть ли у AliExpress публичный API?

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

Почему я получаю ошибки 403 при сборе данных с AliExpress?

403 означает, что AliExpress пометил запрос — обычно из-за слишком большого количества обращений с одного IP, диапазона дата-центра или недостаточного набора заголовков. Меняйте резидентные IP на каждый запрос, добавляйте экспоненциальную задержку на 403, отправляйте реалистичный User-Agent и accept-language, и держите параллельность на низком уровне. Если runParams отсутствует в HTML, это блокировка, а не изменение макета.

Как получить цены AliExpress для конкретной страны?

Направляйте запрос через выходной IP в целевой стране. AliExpress использует местоположение для установки валюты, цены, акций и склада отправления, поэтому IP из США и IP из Германии видят разные данные для одного и того же товара. Гео-нацеливайте прокси для каждого рынка и фиксируйте каждую версию, чтобы построить матрицу цен по гео.

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

Получите разобранные данные с AliExpress с помощью Scraper API