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

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/<handle>/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/<handle>.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

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.