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.

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)

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:

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.

Schemat przepływu pokazujący żądanie strony AliExpress, wyciąganie za pomocą wyrażenia regularnego window.runParams i sparsowane pola produktów jako JSON
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:

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

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

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 zagłębia się w przekształcanie tych macierzy w decyzje dotyczące pozyskiwania.

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

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 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ę.

Lista kontrolna mapująca przeszkody w zeskrobywaniu AliExpress, takie jak 403 i ceny geograficzne, na rozwiązania takie jak rotacja rezydencyjna i geotargeting
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