# Jak zeskrobać dane produktów z AliExpress do badań dropshippingowych

AliExpress ukrywa swoje dane produktowe w zmiennej JavaScript, a nie w widocznym HTML. Pobierz ten JSON, a otrzymasz ceny, rabaty, miejsce wysyłki i liczbę sprzedaży w jednym żądaniu — oto jak to zrobić, z uwzględnieniem zabezpieczeń przed blokadą.

AliExpress to największy globalny rynek i główne źródło badań dropshippingowych: historia cen i rabatów, co faktycznie się sprzedaje, miejsce wysyłki i jak oferty zmieniają się w zależności od kraju. W 2026 roku mocno opiera się na renderowaniu JavaScript i losowych nazwach klas, co odstrasza ludzi do uruchamiania pełnej przeglądarki. Zwykle nie jest to potrzebne. Dane produktowe są już w źródle strony w zmiennej JavaScript — wyciągnij je, a otrzymasz czyste, ustrukturyzowane dane w jednym żądaniu. Ten przewodnik pokazuje metodę ukrytego JSON, wymiar geograficzny, który sprawia, że dane z AliExpress są wartościowe, oraz zabezpieczenia proxy, które utrzymują skrobak przy życiu.

## Dane znajdują się w window.runParams, a nie w DOM

Otwórz stronę kategorii lub wyników wyszukiwania i zobacz źródło. Wszystkie podglądy produktów są przechowywane w zmiennej JavaScript o nazwie `window.runParams`, ukrytej wewnątrz tagu `<script>`. To powszechny nowoczesny wzorzec — serwer przesyła dane jako JSON, a front-end renderuje je po stronie klienta. Dla skrobaka to prezent: pomijasz kruche selektory CSS, wyciągasz tag skryptu za pomocą wyrażenia regularnego i parsujesz go jak słownik. Ta technika nazywa się zeskrobywaniem ukrytych danych internetowych i jest znacznie trwalsza niż ściganie nazw klas, które zmieniają się przy każdej aktualizacji.

```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)
```

## Parsowanie pól istotnych dla badań

Blob `runParams` jest ogromny, więc wyciągnij tylko te pola, które są faktycznie używane w badaniach dropshippingowych i cenowych: tytuł oferty, cena oryginalna vs cena promocyjna, procent rabatu, ile zostało sprzedane i — co najważniejsze — kraj wysyłki, który wpływa na czas dostawy i zaufanie kupującego. Zagnieżdżenie wygląda onieśmielająco, ale jest stabilne:

```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"])
```

To jedno wywołanie daje ci ekonomię produktu: oferta pokazująca oryginalną cenę $65.85 spadającą do ceny promocyjnej $23.29 to 64% rabatu — rodzaj sygnału marży, który mówi ci, czy warto pozyskiwać dany przedmiot. Liczba "sprzedanych" to twój wskaźnik popytu; połączona w kategorii klasyfikuje zwycięzców bez konieczności przeglądania stron z recenzjami.

![Kod w Pythonie pobiera stronę AliExpress, znajduje window.runParams w surowym HTML za pomocą wyrażenia regularnego i wczytuje go przez json.loads, a potem przechodzi po mods.itemList.content; karta pokazuje sparsowane pola produktu: tytuł, cenę promocyjną, procent rabatu i liczbę sprzedanych sztuk, bez udziału przeglądarki bezgłowej.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335163/blog/generated/qp-b9-026-diag1.png)
*Dane oferty są renderowane po stronie serwera do zmiennej JavaScript — nie jest wymagane użycie przeglądarki bezgłowej do ich odczytania.*

## Paginacja wyszukiwania bez przeciążania strony

Strony wyszukiwania używają paginacji o znanej długości, więc efektywnym idiomem jest: zeskrob stronę pierwszą, odczytaj całkowitą liczbę stron z odpowiedzi, a następnie pobierz resztę równocześnie z ograniczeniem. Nie wysyłaj wszystkich stron naraz — AliExpress agresywnie ogranicza stawki i zacznie zwracać 403. Utrzymuj umiarkowaną współbieżność i rotuj IP wyjściowe przy każdym żądaniu:

```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")
```

Rotująca brama ma tutaj znaczenie: jedno IP pobierające stronę za stroną to najszybszy sposób na uzyskanie blokady, podczas gdy rotacja przy każdym żądaniu przez [pule rezydencyjne](https://quantumproxies.io/residential-proxies) rozkłada obciążenie, dzięki czemu żadne pojedyncze wyjście nie wygląda nienormalnie. Eksponencjalne wycofanie na 403 daje czas na wycofanie się spalonego IP.

[Zeskrobuj AliExpress na ponad 90M rezydencyjnych IP](https://quantumproxies.io/residential-proxies)

## Geografia to cały sens

AliExpress personalizuje ceny, waluty, promocje i magazyny wysyłkowe w zależności od lokalizacji odwiedzającego — ten sam produkt może pokazywać kartę lokalną dla USA z szybszą wysyłką do IP z USA i inną ceną oraz pochodzeniem do europejskiego. Dla badań dropshippingowych ten wymiar geograficzny to dane: chcesz wiedzieć, co faktycznie widzi klient na twoim docelowym rynku. Dlatego ustaw kraj wyjścia celowo. Przekieruj przez IP w każdym rynku, na którym sprzedajesz, i rejestruj różnice; produkt, który jest tani i wysyłany lokalnie w jednym regionie, ale wolny i drogi w innym, to zupełnie inna inwestycja. Nasz przewodnik na temat [proxy do badań dropshippingowych](https://quantumproxies.io/blog/proxies-for-dropshipping-research) zagłębia się w przekształcanie tych macierzy w decyzje dotyczące pozyskiwania.

```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))
```

## Recenzje i stany magazynowe znajdują się w oddzielnych wywołaniach

Oferty dają ci cenę i popyt, ale dwa wartościowe pola znajdują się za własnymi żądaniami. Opinie klientów nie znajdują się w `runParams` strony produktu — ładują się z dedykowanego punktu końcowego opinii, paginowane, więc aby zebrać oceny i tekst recenzji, śledzisz to wywołanie na produkt, zamiast parsować główną stronę. Sygnały magazynowe są podobne: liczba "sprzedanych" na ofercie to kumulatywny wskaźnik popytu, podczas gdy precyzyjna dostępność na wariant (kolor, rozmiar, magazyn wysyłki) pochodzi z danych SKU w ładunku szczegółów produktu. Dla badań dropshippingowych ma to znaczenie, ponieważ produkt może wyglądać na zwycięzcę pod względem ceny i sprzedaży, podczas gdy konkretny wariant, który chcesz sprzedawać, jest niedostępny w magazynie obsługującym twój rynek.

Traktuj te dwa jako drugi etap: najpierw zeskrob oferty, aby sklasyfikować kandydatów według rabatu i liczby sprzedanych, a następnie wzbogacaj tylko swoją krótką listę o strony z recenzjami i stany magazynowe na wariant. To utrzymuje wolumen żądań — i ryzyko blokady — proporcjonalnie do tego, jak poważnie traktujesz każdy produkt, zamiast przeciążać każdą ofertę danymi, których nie użyjesz.

## Kiedy zrezygnować z samodzielnego skrobaka

Metoda ukrytego JSON jest trwała, ale AliExpress zmienia kształty ładunków, blokuje recenzje za oddzielnym punktem końcowym i eskaluje blokady przy dużym wolumenie. Jeśli nie chcesz utrzymywać wyrażeń regularnych i logiki ponawiania, [Scraper API](https://quantumproxies.io/scraper-api) przyjmuje URL i zwraca sparsowany JSON — obsługuje renderowanie, rotację i warstwę antyblokady, a geotargeting odbywa się za pomocą jednego parametru. To pragmatyczny wybór, gdy zbierasz tysiące produktów na rynkach według harmonogramu. Dla ogólnego wzorca odczytywania danych bezpośrednio z ładunków po stronie klienta, zobacz naszą notatkę na temat [dlaczego skrobak zwraca pustą stronę](https://quantumproxies.io/blog/scraper-returns-empty-page-javascript).

![Trzy przeszkody w scrapingu AliExpress, każda z rozwiązaniem: błędy 403 po kilku stronach, rozwiązane rotacją rezydencyjnego IP przy każdym żądaniu; ceny różniące się w zależności od kraju, rozwiązane wyjściem na każdym rynku; brakujące runParams, które samo w sobie jest blokadą. Karta pokazuje odpowiednie ustawienia z kodu w artykule.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335163/blog/generated/qp-b9-026-diag2.png)
*Trzy przeszkody, trzy rozwiązania — większość awarii skrobaków AliExpress to problem z jakością IP lub geolokalizacją.*

## Najczęściej zadawane pytania

### Czy można zeskrobywać dane produktów z AliExpress?

Tak. Publicznie widoczne dane ofert — tytuły, ceny, rabaty, liczby sprzedanych, obrazy i miejsce wysyłki — są serwowane do zmiennej JavaScript `window.runParams` na stronach kategorii, wyszukiwania i produktów. Wyciągasz je za pomocą wyrażenia regularnego i parsujesz jako JSON, bez potrzeby używania przeglądarki bezgłowej dla ofert. Szanuj warunki i limity AliExpress.

### Czy AliExpress ma publiczne API?

AliExpress oferuje API partnerskie i platformy otwartej, ale wymagają one zatwierdzenia, mają ograniczony zasięg i są powiązane z programem. Dla szerokich badań w kategoriach i na rynkach, zeskrobywanie publicznych stron daje więcej pól i pełną kontrolę geograficzną, dlatego większość badaczy dropshippingowych wyciąga JSON ze stron.

### Dlaczego otrzymuję błędy 403 przy zeskrobywaniu AliExpress?

Błąd 403 oznacza, że AliExpress oznaczył żądanie — zwykle z powodu zbyt wielu trafień z jednego IP, zakresu centrum danych lub cienkiego zestawu nagłówków. Rotuj rezydencyjne IP przy każdym żądaniu, dodaj eksponencjalne wycofanie na 403, wyślij realistyczny User-Agent i accept-language, i utrzymuj niską współbieżność. Jeśli runParams brakuje w HTML, to blokada, a nie zmiana układu.

### Jak uzyskać ceny AliExpress dla konkretnego kraju?

Przekieruj żądanie przez IP wyjściowe w docelowym kraju. AliExpress odczytuje lokalizację, aby ustawić walutę, cenę, promocje i magazyn wysyłkowy, więc IP z USA i IP z Niemiec widzą różne dane dla tego samego produktu. Geotargetuj proxy na każdy rynek i rejestruj każdą wersję, aby zbudować macierz cen według geolokalizacji.

Zwycięska metoda jest nudna i trwała: odczytaj JSON, który strona już przesyła, przeglądaj grzecznie, rotuj czyste rezydencyjne IP i geotargetuj każdy rynek, na którym ci zależy. Zrób to, a AliExpress stanie się niezawodnym źródłem cen, sygnałów popytu i ekonomii wysyłki, a nie ścianą 403.

[Uzyskaj sparsowane dane z AliExpress z Scraper API](https://quantumproxies.io/scraper-api)
