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

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

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

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

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

```python
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@residentialpremium.quantumproxies.io:8080"

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` огромен, поэтому извлекайте только те поля, которые действительно используются для исследований в дропшиппинге и ценообразовании: название листинга, оригинальная цена и цена со скидкой, процент скидки, сколько продано и — критически — страна отправления, которая определяет время доставки и доверие покупателей. Вложенность выглядит устрашающе, но она стабильна:

```python
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% — такой сигнал маржи, который говорит вам, стоит ли товар закупать. Количество "продано" — это ваш прокси спроса; в сочетании по категории он ранжирует победителей, не заставляя вас открывать страницу с отзывами.

![Код на Python загружает страницу AliExpress, находит window.runParams в сыром HTML регулярным выражением, загружает его через json.loads, затем обходит mods.itemList.content; карточка показывает разобранные поля товара: название, цена со скидкой, процент скидки и число продаж, без участия безголового браузера.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335163/blog/generated/qp-b9-026-diag1.png)
*Данные листинга рендерятся на сервере в переменной JavaScript — для их чтения не требуется безголовый браузер.*

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

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

```python
import asyncio, httpx

ROTATING = "http://USER:PASS@residentialpremium.quantumproxies.io:8080"

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, получающий страницу за страницей, — это самый быстрый способ получить блокировку, тогда как ротация на каждый запрос через [резидентный пул](https://quantumproxies.io/residential-proxies) распределяет нагрузку так, чтобы ни один выход не выглядел аномальным. Экспоненциальная задержка на 403 дает сгоревшему IP время на замену.

[Собирайте данные с AliExpress на более чем 90 миллионах резидентных IP](https://quantumproxies.io/residential-proxies)

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

AliExpress персонализирует цены, валюту, акции и склад отправления в зависимости от местоположения посетителя — один и тот же товар может показывать карту, локализованную для США, с более быстрой доставкой на IP из США и другую цену и происхождение на европейский IP. Для исследований в дропшиппинге это геоизмерение — это данные: вы хотите знать, что на самом деле видит клиент на вашем целевом рынке. Поэтому целенаправленно устанавливайте страну выхода. Направляйте через IP в каждом рынке, на который вы продаете, и фиксируйте дельты; товар, который дешев и отправляется локально в одном регионе, но медленный и дорогой в другом, — это совершенно другая ставка. Наше руководство по [прокси для исследований в дропшиппинге](https://quantumproxies.io/blog/proxies-for-dropshipping-research) углубляется в превращение этих матриц в решения по закупке.

```python
# One product, three markets - compare price and ship-from per geo
MARKETS = {
    "us": "http://USER-country-us:PASS@residentialpremium.quantumproxies.io:8080",
    "de": "http://USER-country-de:PASS@residentialpremium.quantumproxies.io:8080",
    "br": "http://USER-country-br:PASS@residentialpremium.quantumproxies.io:8080",
}
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](https://quantumproxies.io/scraper-api) принимает URL и возвращает разобранный JSON — он обрабатывает рендеринг, ротацию и слой защиты от блокировок, и вы можете гео-нацеливаться с помощью одного параметра. Это прагматичный выбор, когда вы собираете тысячи товаров по рынкам по расписанию. Для общего шаблона чтения данных прямо из клиентских полезных нагрузок, смотрите нашу заметку о [почему скрейпер возвращает пустую страницу](https://quantumproxies.io/blog/scraper-returns-empty-page-javascript).

![Три препятствия при скрейпинге AliExpress, каждое со своим решением: ошибки 403 через несколько страниц решаются ротацией резидентного IP на каждый запрос; цены, отличающиеся по странам, решаются выходом на каждом рынке; отсутствующий runParams и есть сама блокировка. Карточка показывает соответствующие настройки из кода статьи.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335163/blog/generated/qp-b9-026-diag2.png)
*Три препятствия, три решения — большинство сбоев скрейперов 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](https://quantumproxies.io/scraper-api)
