Scraping Shopify products.json: Punkt końcowy, który ujawnia każdy sklep

Zapomnij o analizowaniu HTML. Każdy sklep Shopify dostarcza czysty JSON pod /products.json — pełny katalog, ceny, warianty, stany magazynowe. Oto limity paginacji, triki przyspieszające i jak zamienić to w monitorowanie konkurencji.

Każdy, kto zeskrobywał e-commerce, zna ból: kruche selektory CSS, zagnieżdżone divy, układy, które zmieniają się i wszystko psują z dnia na dzień. Shopify daje ci wyjście. Prawie każdy sklep zbudowany na Shopify ujawnia publiczny /products.json endpoint, który zwraca cały katalog jako czysty, ustrukturyzowany JSON — tytuły, uchwyty, dostawców, tagi, warianty, ceny, flagi stanów magazynowych i obrazy. Bez parsowania HTML, bez przeglądarki bezgłowej. Ten przewodnik obejmuje, jak działa endpoint, jego rzeczywiste limity paginacji, sztuczkę, która dramatycznie przyspiesza przeszukiwanie dużych sklepów, i jak zamienić to wszystko w monitorowanie cen i stanów magazynowych konkurencji.

Endpoint w każdym sklepie Shopify

Dodaj /products.json do głównej domeny dowolnego sklepu Shopify, a otrzymasz listę produktów w formacie JSON. To te same dane, z których korzysta witryna sklepu, ujawnione celowo dla Ajax API. Każdy produkt ma stabilny numeryczny id, handle, vendor, product_type, tags, tablicę variants (każdy z własną ceną, SKU i booleanem available) oraz obrazy. To wszystko, co normalnie zeskrobywałbyś z strony produktu, dostarczone w jednym żądaniu.

import requests

url = "https://store.example.com/products.json"
r = requests.get(url, params={"limit": 250, "page": 1}, timeout=15)
products = r.json()["products"]

print(len(products), products[0]["title"])
for v in products[0]["variants"]:
    print(v["sku"], v["price"], v["available"])

Dwa zastrzeżenia na początek. Shopify ogranicza publiczny endpoint do 250 produktów na stronę — limitu, którego nie można przekroczyć, niezależnie od tego, co przekażesz, więc zignoruj rady, aby ustawić limit=1000000 i pobrać wszystko w jednym wywołaniu. I mniejszość sklepów wyłącza endpoint (czasami niestandardowe budowy go wyłączają), więc sprawdź, czy odpowiedź jest prawidłowa, zanim zbudujesz wokół niego pipeline.

Paginacja do końca

Z powodu limitu 250, pełny katalog oznacza przechodzenie stron, aż trafisz na pustą. Naiwna pętla zwiększa page i zatrzymuje się, gdy strona zwraca pustą odpowiedź. To poprawne i wystarczające dla małych sklepów — sklep z kilkuset produktami to kilka żądań.

def all_products(base):
    page, out = 1, []
    while True:
        r = requests.get(f"{base}/products.json",
                         params={"limit": 250, "page": page}, timeout=15)
        batch = r.json()["products"]
        if not batch:
            break
        out.extend(batch)
        page += 1
    return out
Diagram statystyk pokazujący limity Shopify products.json: limit 250 produktów na stronę, 25x szybsza paginacja z wyszukiwaniem binarnym, 833 strony w sklepie z 25000 produktami
Endpoint jest ograniczony do 250 produktów na stronę — szybkość pochodzi z szybkiego znalezienia ostatniej strony, a nie z większych żądań.

Sztuczka 25x: najpierw znajdź ostatnią stronę

Sekwencyjna paginacja jest wolna w dużych sklepach, ponieważ nie można jej zrównoleglić — nie wiesz, kiedy przestać, więc każda strona czeka na poprzednią. Rozwiązaniem jest wyszukiwanie binarne: przeszukaj numery stron, aby znaleźć ostatnią niepustą stronę, a następnie wyślij wszystkie żądania stron jednocześnie. W publicznym benchmarku przeciwko sklepowi z 25 000 produktów na 833 stronach, to skróciło przeszukiwanie z około 120 sekund do około 12 przy pierwszym uruchomieniu i około 5, gdy numer ostatniej strony był zapisany w pamięci podręcznej — 25-krotne przyspieszenie. Kieruj sondy przez rotujące IP, aby nagły wzrost równoczesnych żądań nie spowodował ograniczenia.

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": PROXY, "https": PROXY}

def last_page(base, hi=1000):
    lo, last = 1, 1
    while lo <= hi:
        mid = (lo + hi) // 2
        r = requests.get(f"{base}/products.json",
                         params={"limit": 250, "page": mid},
                         proxies=proxies, timeout=15)
        if r.json()["products"]:
            last, lo = mid, mid + 1   # go higher
        else:
            hi = mid - 1              # go lower
    return last
# then request pages 1..last_page concurrently

Jak powiedział Rob Pike, wyszukane algorytmy są wolne, gdy n jest małe — dla sklepu z 200 produktami pomiń wyszukiwanie binarne i po prostu iteruj. Opłaca się to przy katalogach liczących tysiące, gdzie sekwencyjna paginacja się dłuży.

Zawęź pobieranie: kolekcje i pojedyncze produkty

Nie zawsze chcesz cały katalog. Shopify ujawnia ten sam JSON na poziomie kolekcji: /collections/&lt;handle&gt;/products.json zwraca tylko produkty w tej kolekcji, paginowane w ten sam sposób. To efektywna ścieżka, gdy śledzisz tylko jedną kategorię — sneakersy, perfumy, jedną markę — zamiast całego sklepu. A żeby sprawdzić jeden produkt, dodaj .json do jego URL: /products/&lt;handle&gt;.json daje pełny zapis tego produktu, w tym każdy wariant i jego flagę magazynową, co jest przydatne do ścisłego monitorowania restocków na konkretnym SKU bez ponownego przeszukiwania katalogu.

Połączenie obu sposobów zmniejsza wolumen żądań — i przepustowość. Odkryj katalog raz za pomocą pełnego endpointu, zapisz uchwyty, które cię interesują, a następnie regularnie sprawdzaj pojedyncze produkty lub kolekcje. Ten wzorzec to różnica między monitorem, który skaluje się do setek sklepów, a takim, który cicho przepala twój budżet na proxy, ponownie pobierając katalogi, które się nie zmieniły.

Zamień to w monitorowanie konkurencji

Prawdziwa wartość to nie jednorazowy zrzut katalogu — to różnica w czasie. Zrób zrzut products.json konkurenta zgodnie z harmonogramem, kluczując po id wariantu, i porównaj uruchomienia, aby wychwycić zmiany cen, nowe produkty i restocki w momencie, gdy się pojawią. Ponieważ available i price znajdują się na każdym wariancie, otrzymujesz sygnały o stanie magazynowym i cenach bez dotykania strony produktu.

def snapshot(base):
    rows = {}
    for p in all_products(base):
        for v in p["variants"]:
            rows[v["id"]] = {
                "product": p["title"],
                "sku": v["sku"],
                "price": v["price"],
                "available": v["available"],
            }
    return rows

# diff today's snapshot against yesterday's to flag price + stock moves
def changes(old, new):
    for vid, cur in new.items():
        prev = old.get(vid)
        if prev and (prev["price"] != cur["price"] or prev["available"] != cur["available"]):
            yield cur["sku"], prev, cur

To jest podstawa monitorowania cen konkurencji i badań dropshippingowych — oba opierają się na tym samym wzorcu zrzutu i różnicy w wielu sklepach jednocześnie.

Zdobądź szybkie proxy z centrum danych do scraping Shopify

Diagram przepływu dla pipeline Shopify products.json: endpoint do bramy proxy rotacyjnej do parsowania JSON wariantów do różnicowania zrzutów dla monitorowania
Zrób zrzut zgodnie z harmonogramem, różnicuj warianty, a będziesz mieć na żywo alerty o cenach i restockach w każdym sklepie, który śledzisz.

Jakie proxy są ci naprawdę potrzebne

Endpoint products.json to publiczny JSON, a nie zabezpieczony przepływ zakupowy, więc jest wyrozumiały — ale zeskrob setki sklepów lub bombarduj jeden zgodnie z harmonogramem, a napotkasz limity szybkości na IP. Ekonomicznym rozwiązaniem są szybkie proxy z centrum danych z rotacją: tanie, szybkie i wystarczające, aby rozłożyć żądania na IP, więc żadne pojedyncze nie zostanie ograniczone. Zarezerwuj IP rezydencyjne dla sklepów, które blokują zakresy centrum danych całkowicie. Jeśli sklep wyłączył products.json i ukrywa swój katalog za renderowanymi stronami lub ochroną przed botami, Scraper API, który renderuje i rotuje za ciebie, jest czystszym rozwiązaniem. Nasz przewodnik, kiedy proxy z centrum danych wygrywają obejmuje tę decyzję.

Często zadawane pytania

Jak uzyskać wszystkie produkty ze sklepu Shopify jako JSON?

Zażądaj /products.json na domenie sklepu z ?limit=250&page=N i zwiększaj page, aż strona zwróci pustą tablicę produktów. Każda odpowiedź zawiera do 250 produktów z ich wariantami, cenami, SKU i flagami stanów magazynowych. Dla dużych katalogów, wyszukaj binarnie ostatnią stronę i pobierz strony równocześnie.

Jaki jest limit na Shopify products.json?

Publiczny endpoint ogranicza do 250 produktów na stronę — to najwyższa wartość, jaką akceptuje limit. Przekazanie większej liczby nie zwróci więcej; nadal przechodzisz przez katalog. To twardy limit Shopify, więc zaplanuj paginację zamiast próbować pobrać wszystko w jednym żądaniu.

Czy scraping Shopify products.json jest legalny?

Endpoint serwuje publicznie dostępne dane o produktach bez logowania, a sądy w USA generalnie uznają scraping danych publicznych. To powiedziawszy, szanuj warunki korzystania ze sklepu, unikaj danych osobowych i nie przeciążaj serwera. To ogólne informacje, a nie porada prawna — sprawdź szczegóły dla swojego przypadku użycia i jurysdykcji.

Dlaczego products.json zwraca 404 lub pustą odpowiedź?

Albo sklep nie jest na Shopify, albo sprzedawca wyłączył endpoint na niestandardowej budowie. Niektóre sklepy również ograniczają powtarzające się żądania z jednego IP, co może wyglądać jak błąd. Potwierdź, że sklep jest na Shopify, rotuj swoje IP i dodaj opóźnienie między żądaniami, zanim założysz, że endpoint zniknął.

Endpoint products.json zmienia scraping Shopify z zadania polegającego na manipulacji selektorami w czysty pobór JSON: pełny katalog, ceny i stany magazynowe w jednym URL, 250 na stronę, szybki do przeszukiwania z wyszukiwaniem binarnym i trywialny do różnicowania w monitorowanie konkurencji. Odkryj raz, sprawdzaj kolekcje i produkty, które mają znaczenie, rozłóż żądania na rotujące IP z centrum danych, a będziesz mógł śledzić setki sklepów zgodnie z harmonogramem bez ani jednego zablokowanego uruchomienia — bez parsera HTML, bez przeglądarki bezgłowej, bez kruchych selektorów do pilnowania.

Zacznij zeskrobywać Shopify z QuantumProxies