Endpoint Shopify /products.json je v e-commerce světě jedním z nejstřeženějších „tajemství“ — jenže ve skutečnosti už dávno žádným tajemstvím není. Stačí ho přidat za URL libovolného Shopify obchodu a zpět dostanete strukturovaná JSON data. Žádné API klíče, žádné přihlašování, žádné složité proklikávání HTML.
Pracuji v týmu , takže dost přemýšlím o tom, jak lidé získávají data z webu. A scrapovat shopify pomocí pythonu se řeší pořád dokola — obchodní týmy sledují ceny konkurence, ecommerce operace porovnávají produktové katalogy, nákupčí hledají nové dodavatele. S na Shopify a s podílem platformy zhruba je objem produktových dat, která lze scrapovat, opravdu obrovský.
Tento průvodce pokrývá celý proces: co endpoint vrací, jak stránkovat tisíce produktů, jak zvládnout rate limit bez blokace a jak převést vnořený JSON ze Shopify do přehledného CSV nebo Excel souboru pomocí pandas. Podíváme se i na endpointy, o kterých většina lidí vůbec nemluví (/collections.json, /meta.json), a ukážu také no-code alternativu pro ty, kdo se chtějí Pythonu vyhnout úplně.
Co je endpoint Shopify /products.json a proč je scraping tak jednoduchý
Každý Shopify obchod má veřejný endpoint na adrese {store-url}/products.json, který vrací strukturovaná produktová data. Žádné API klíče. Žádný OAuth. Žádná autentizace. Stačí přidat /products.json k URL obchodu a dostanete JSON pole všech produktů v katalogu.
Vyzkoušejte si to hned teď: otevřete nebo v prohlížeči. Uvidíte čistý, dobře uspořádaný JSON s názvy produktů, cenami, variantami, obrázky, tagy — prostě všechno.
Porovnejte to s alternativou: parsováním HTML Shopify témat, která jsou hluboko zanořená, mezi obchody nekonzistentní a mění se pokaždé, když obchodník upraví šablonu. Tohle je to, s čím byste museli pracovat:
HTML přístup (bolestivý):
1<div class="product-card__info">
2 <h3 class="product-card__title">
3 <a href="/products/classic-blue-jeans">Classic Blue Jeans</a>
4 </h3>
5 <span class="price price--on-sale" data-product-price>$149.00</span>
6</div>
JSON přístup (čistý):
1{
2 "title": "Classic Blue Jeans",
3 "handle": "classic-blue-jeans",
4 "vendor": "Hiut Denim",
5 "variants": [{"price": "149.00", "sku": "HD-BLU-32", "available": true}]
6}
JSON vyhrává v konzistenci, spolehlivosti i snadnosti zpracování. Endpoint navíc podporuje dva důležité parametry dotazu — ?limit= (až 250 produktů na stránku, výchozí hodnota je 30) a ?page= pro stránkování — které budeme v ukázkách níže používat často.
Důležité rozlišení: jde o veřejný storefront endpoint, ne o . Admin API vyžaduje přístupové tokeny majitele obchodu a poskytuje data o objednávkách, stavu zásob i zákaznících. Veřejný endpoint /products.json je jen pro čtení a může k němu přistoupit kdokoli. Rozdíl vysvětlím podrobněji dál, protože kolem toho na fórech panuje spousta zmatků.
Pozor: ne každý Shopify obchod tento endpoint vystavuje. Podle mých testů vrací přibližně 71 % obchodů platný JSON (allbirds.com, gymshark.com, colourpop.com, kyliecosmetics.com fungují), zatímco některé vlastní konfigurace vrací 404 (hiutdenim.co.uk, bombas.com). Rychlá kontrola je jednoduchá: navštivte {store-url}/products.json v prohlížeči a podívejte se, co dostanete.
Proč scrapovat Shopify pomocí Pythonu? Hlavní byznysové scénáře
Proč se tím vůbec zabývat? Kvůli návratnosti investice. dnes používá automatizované sledování cen pro konkurenční inteligenci, zatímco v roce 2020 to bylo jen 34 %. A výzkumy ukazují, že . Ta data tedy mají reálnou hodnotu.
Tady jsou nejběžnější scénáře, se kterými se setkávám:
This paragraph contains content that cannot be parsed and has been skipped.
Python je pro tenhle typ práce přirozená volba. používá Python jako hlavní jazyk a ekosystém — requests pro HTTP, pandas pro práci s daty, httpx pro asynchronní volání — takže se dá dostat od „mám URL“ k „mám tabulku“ za méně než 80 řádků kódu.
Kompletní přehled polí products.json: vysvětlení každého pole
Většina jiných návodů ukáže title, id a handle a tím skončí. JSON odpověď ze Shopify ale obsahuje přes 40 polí napříč produkty, variantami, obrázky a možnostmi. Když víte, co je k dispozici ještě před psaním scrapingového kódu, ušetří vám to pozdější předělávání.
Tento přehled jsem sestavil z živých odpovědí /products.json načtených 16. dubna 2026. Struktura je konzistentní u všech obchodů, které endpoint vystavují.
Pole na úrovni produktu
| Pole | Datový typ | Příklad hodnoty | Byznysové využití |
|---|---|---|---|
id | Integer | 123456789 | Jedinečný identifikátor produktu pro deduplikaci |
title | String | "Classic Blue Jeans" | Název produktu pro katalogy a srovnání |
handle | String | "classic-blue-jeans" | URL slug — odkazy na produkt vytvoříte jako {store}/products/{handle} |
body_html | String (HTML) nebo null | Our best-selling... | Popis produktu pro analýzu obsahu a SEO průzkum |
vendor | String | "Hiut Denim" | Název značky/dodavatele pro lead gen nebo sourcing |
product_type | String | "Jeans" | Kategorizace pro analýzu trhu |
created_at | ISO DateTime | "2024-01-15T10:30:00-05:00" | Sledujte, kdy byl produkt přidán (detekce novinek) |
updated_at | ISO DateTime | "2025-03-01T08:00:00-05:00" | Zjišťování nedávných změn v katalogu |
published_at | ISO DateTime | "2024-01-16T00:00:00-05:00" | Zjistíte, kdy byl produkt zveřejněn ve storefrontu |
tags | Pole řetězců | ["organic", "women", "straight-leg"] | Analýza klíčových slov/tagů pro SEO, kategorizaci a trendy |
variants | Pole objektů | (viz pole variant níže) | Cena, SKU, dostupnost podle varianty |
images | Pole objektů | (viz pole obrázků níže) | URL obrázků produktů pro katalogy a vizuální analýzu |
options | Pole objektů | [{"name": "Size", "values": ["S","M","L"]}] | Pochopení konfigurace produktu (velikost, barva, materiál) |
Pole na úrovni varianty (vnořená pod každým produktem)
| Pole | Datový typ | Příklad | Využití |
|---|---|---|---|
id | Integer | 987654321 | Jedinečný identifikátor varianty |
title | String | "32 / Blue" | Zobrazovaný název varianty |
sku | String | "HD-BLU-32" | Párování SKU ve skladových systémech |
price | String | "185.00" | Sledování cen (pozor: je to řetězec, pro výpočty ho převeďte na float) |
compare_at_price | String nebo null | "200.00" | Původní cena — zásadní pro sledování slev |
available | Boolean | true | Dostupnost zásob (jediný veřejně dostupný ukazatel stavu skladu) |
weight | Float | 1.2 | Analýza dopravy a logistiky |
option1, option2, option3 | String | "32", "Blue", null | Jednotlivé hodnoty možností |
created_at, updated_at | ISO DateTime | — | Sledování změn na úrovni varianty |
Pole na úrovni obrázku
| Pole | Datový typ | Příklad | Využití |
|---|---|---|---|
id | Integer | 111222333 | Jedinečný identifikátor obrázku |
src | String (URL) | "https://cdn.shopify.com/..." | Přímý odkaz ke stažení obrázku |
alt | String nebo null | "Front view of jeans" | Alt text obrázku pro analýzu přístupnosti |
position | Integer | 1 | Pořadí obrázků |
width, height | Integer | 2048, 2048 | Rozměry obrázku |
Co ve veřejném endpointu není
Důležité upozornění: inventory_quantity ve veřejných odpovědích /products.json není k dispozici. Toto pole bylo z veřejných JSON endpointů odstraněno v prosinci 2017 z bezpečnostních důvodů. Jediný ukazatel skladu, který získáte, je boolean available u každé varianty (true nebo false). Pokud potřebujete skutečné počty skladových zásob, musíte použít autentizované Admin API s přístupem majitele obchodu.
Než začnete psát scrapingový kód, projděte si tuhle tabulku a rozhodněte se, která pole jsou pro váš případ použití důležitá. Pokud sledujete ceny, potřebujete variants[].price, variants[].compare_at_price a variants[].available. Pokud generujete leady, zaměřte se na vendor, product_type a tags. Správné filtrování výrazně zpřehlední váš CSV soubor.
Kromě products.json: kolekce, meta a další Shopify endpointy
Žádný konkurenční návod tyto endpointy nezmiňuje. Přitom jsou pro seriózní konkurenční analýzu zásadní.
/collections.json — všechny kategorie obchodu
Vrací všechny kolekce (kategorie) v obchodě včetně názvů, handle, popisů a počtu produktů. Ověřil jsem to na zoologistperfumes.com, allbirds.com i gymshark.com — všechny vracely platný JSON.
1{
2 "collections": [
3 {
4 "id": 308387348539,
5 "title": "Attars",
6 "handle": "attars",
7 "published_at": "2026-03-29T12:20:32-04:00",
8 "products_count": 1,
9 "image": { "src": "https://cdn.shopify.com/..." }
10 }
11 ]
12}
Chceš pochopit, jak konkurent organizuje svůj katalog? Tohle je ten správný endpoint.
/collections/{handle}/products.json — produkty podle kategorie
Vrací produkty filtrováné podle konkrétní kolekce. Má stejnou JSON strukturu jako /products.json, ale je omezený na jednu kategorii. To je klíčové pro scraping na úrovni kategorií — třeba když chceš sledovat jen kolekci konkurenta „Sale“ nebo „New Arrivals“.
/meta.json — metadata obchodu
Vrací název obchodu, popis, měnu, zemi a — a to je ta užitečná část — published_products_count. Díky tomuto číslu si můžete přesně předem spočítat, kolik stránek stránkování budete potřebovat: ceil(published_products_count / 250). Žádné slepé přidávání stránek, dokud nedostanete prázdnou odpověď.
Který endpoint byste měli použít?
| Co chcete získat | Endpoint | Je potřeba autentizace? |
|---|---|---|
| Všechny produkty (veřejné) | /products.json | Ne |
| Produkty v konkrétní kategorii | /collections/{handle}/products.json | Ne |
| Metadata obchodu + počet produktů | /meta.json | Ne |
| Všechny kolekce (kategorie) | /collections.json | Ne |
| Data o objednávkách/prodejích (jen vlastní obchod) | Admin API /orders.json | Ano (API klíč) |
| Množství zásob (jen vlastní obchod) | Admin API /inventory_levels.json | Ano |
Opakující se otázka z fór — „Můžu scrapovat, kolik kusů konkurent prodal?“ — má krátkou odpověď: ne. Ne z veřejných endpointů. Data o prodejích a množství zásob vyžadují autentizované Admin API, což znamená, že potřebujete přístup majitele obchodu. Veřejné endpointy poskytují jen data produktového katalogu.

Jak scrapovat Shopify pomocí Pythonu: krok za krokem
- Obtížnost: Začátečník
- Časová náročnost: přibližně 15 minut (nastavení + první scrape)
- Co budete potřebovat: Python 3.11+,
pip, terminál a URL Shopify obchodu, který chcete scrapovat
Krok 1: Nainstalujte Python a potřebné knihovny
Ujistěte se, že máte nainstalovaný Python 3.11 nebo novější (pandas 3.0.x to vyžaduje). Poté nainstalujte dvě knihovny, které budeme potřebovat:
1pip install requests pandas
Pro export do Excelu budete chtít také:
1pip install openpyxl
Na začátek skriptu přidejte tyto importy:
1import requests
2import pandas as pd
3import time
4import random
5import json
Při spuštění skriptu by se neměly objevit žádné chyby importu. Pokud pandas hlásí chybu verze, aktualizujte Python na 3.12.
Krok 2: Načtěte produktová data z /products.json
Tady je základní funkce, která vezme URL obchodu, zavolá endpoint a vrátí zpracovaný JSON:
1def fetch_products_page(store_url, page=1, limit=250):
2 """Načte jednu stránku produktů ze Shopify obchodu."""
3 url = f"{store_url.rstrip('/')}/products.json"
4 params = {"limit": limit, "page": page}
5 headers = {
6 "User-Agent": "Mozilla/5.0 (compatible; ProductResearch/1.0)"
7 }
8 response = requests.get(url, params=params, headers=headers, timeout=30)
9 response.raise_for_status()
10 return response.json().get("products", [])
Důležité detaily:
limit=250je maximum, které Shopify na jednu stránku dovoluje. Výchozí hodnota je 30, takže explicitním nastavením snížíte počet požadavků až 8×.- Hlavička
User-Agent: Vždy nastavte realistickou hodnotu. Požadavky bez User-Agentu častěji spouští anti-bot ochranu Shopify. timeout=30: Nenechte jeden požadavek viset donekonečna.
Otestujte to na známém obchodě:
1products = fetch_products_page("https://allbirds.com")
2print(f"Fetched {len(products)} products")
3print(f"First product: {products[0]['title']}")
Měli byste vidět něco jako: Fetched 250 products a název prvního produktu.
Krok 3: Ošetřete stránkování a scrapujte všechny produkty
Jeden požadavek vrátí maximálně 250 produktů. Většina obchodů má víc (Allbirds má přes 1 420). Musíte tedy procházet stránky, dokud nedostanete prázdnou odpověď.
1def scrape_all_products(store_url, delay=1.0):
2 """Scrapuje všechny produkty ze Shopify obchodu s ohledem na stránkování."""
3 all_products = []
4 page = 1
5 while True:
6 print(f"Načítám stránku {page}...")
7 products = fetch_products_page(store_url, page=page, limit=250)
8 if not products:
9 print(f"Další produkty už nejsou. Celkem: {len(all_products)}")
10 break
11 all_products.extend(products)
12 print(f" Získáno {len(products)} produktů (celkem zatím: {len(all_products)})")
13 page += 1
14 # Buďte ohleduplní: mezi požadavky čekejte
15 time.sleep(delay + random.uniform(0, 0.5))
16 return all_products
Když products vrátí prázdný seznam, jste na konci.
time.sleep() s náhodným rozptylem vás udrží pod neformálním limitem Shopify (~2 požadavky za sekundu).
Tip: Pokud nejdřív načtete /meta.json, budete už znát celkový počet produktů a můžete přesně spočítat, kolik stránek potřebujete: pages = ceil(product_count / 250). Vyhnete se tak „jednomu zbytečnému prázdnému požadavku na konci“.
Krok 4: Vyberte a zpracujte pole, která potřebujete
Teď, když máte všechny produkty jako Python seznam slovníků, vytáhněte jen ta pole, která vás zajímají. Tady je příklad, který pro sledování cen bere nejběžnější položky:
1def extract_product_data(products):
2 """Vytáhne klíčová pole z produktů a rozbalí varianty."""
3 rows = []
4 for product in products:
5 for variant in product.get("variants", []):
6 rows.append({
7 "product_id": product["id"],
8 "title": product["title"],
9 "handle": product["handle"],
10 "vendor": product.get("vendor", ""),
11 "product_type": product.get("product_type", ""),
12 "tags": ", ".join(product.get("tags", [])),
13 "created_at": product.get("created_at", ""),
14 "variant_id": variant["id"],
15 "variant_title": variant.get("title", ""),
16 "sku": variant.get("sku", ""),
17 "price": variant.get("price", ""),
18 "compare_at_price": variant.get("compare_at_price", ""),
19 "available": variant.get("available", ""),
20 "image_url": product["images"][0]["src"] if product.get("images") else ""
21 })
22 return rows
Vznikne tak jeden řádek na variantu — což je nejpraktičtější formát pro porovnávání cen, protože jeden produkt jako „Classic Blue Jeans“ může mít 12 variant (6 velikostí × 2 barvy), z nichž každá má vlastní cenu a dostupnost.
Export scrapovaných Shopify dat do CSV a Excelu pomocí pandas
Většina jiných návodů na Shopify scraping uloží syrový JSON do souboru a tím skončí. Pro vývojáře je to v pořádku. Pro ecommerce analytika, který potřebuje do pátku tabulku, je to nepoužitelné.
Problém je v tom, že JSON ze Shopify je vnořený. Jeden produkt může obsahovat desítky variant, z nichž každá má vlastní cenu, SKU a dostupnost. Převést to na řádky a sloupce vyžaduje trochu práce s pandas.
Jak převést vnořený JSON do přehledné tabulky
Podle toho, k čemu data potřebujete, existují dva přístupy:
Varianta A: jeden řádek na variantu (nejlepší pro sledování cen a zásob)
1# Použití funkce extract_product_data z kroku 4
2products = scrape_all_products("https://allbirds.com")
3rows = extract_product_data(products)
4df = pd.DataFrame(rows)
5print(f"DataFrame shape: {df.shape}")
6print(df.head())
Výsledkem je plochá tabulka, kde každý řádek představuje jedinečnou kombinaci produktu a varianty. Obchod s 500 produkty a průměrně 4 variantami na produkt vytvoří DataFrame s přibližně 2 000 řádky.
Varianta B: jeden řádek na souhrn produktu (nejlepší pro přehled katalogu)
1def summarize_products(products):
2 """Jeden řádek na produkt s minimální a maximální cenou napříč variantami."""
3 rows = []
4 for product in products:
5 prices = [float(v["price"]) for v in product.get("variants", []) if v.get("price")]
6 rows.append({
7 "product_id": product["id"],
8 "title": product["title"],
9 "vendor": product.get("vendor", ""),
10 "product_type": product.get("product_type", ""),
11 "variant_count": len(product.get("variants", [])),
12 "min_price": min(prices) if prices else None,
13 "max_price": max(prices) if prices else None,
14 "any_available": any(v.get("available", False) for v in product.get("variants", [])),
15 "tags": ", ".join(product.get("tags", []))
16 })
17 return rows
Export do CSV, Excelu a Google Sheets
1# Export do CSV (použijte utf-8-sig, aby Excel správně zobrazil speciální znaky)
2df.to_csv("shopify_products.csv", index=False, encoding="utf-8-sig")
3# Export do Excelu (vyžaduje openpyxl)
4df.to_excel("shopify_products.xlsx", index=False, engine="openpyxl")
5print("Exportováno do shopify_products.csv a shopify_products.xlsx")
Pro Google Sheets můžete použít knihovnu gspread se service accountem, ale upřímně — pro většinu případů je rychlejší a jednodušší exportovat do CSV a nahrát soubor do Google Drive.
Scraping připravený pro produkci: rate limity, retry a ochrana proti blokaci
Základní skript funguje dobře pro menší obchody. Ale scrapování obchodu s více než 5 000 produkty nebo více obchodů za sebou? Tam se věci začnou lámat.
Jak fungují rate limity a blokace u Shopify
Veřejné JSON endpointy Shopify nemají formálně zdokumentované rate limity (na rozdíl od leaky bucket modelu u Admin API), ale empirické testování ukazuje:
- Bezpečná rychlost: zhruba 2 požadavky za sekundu na obchod
- Měkký strop: asi 40 požadavků za minutu, než se spustí throttling
- HTTP 429: „Too Many Requests“ — standardní odpověď při překročení limitu
- HTTP 430: kód specifický pro Shopify, který značí bezpečnostní blokaci (nejen rate limit)
- HTTP 403 nebo CAPTCHA redirect: některé obchody mají navíc ochranu Cloudflare
Požadavky z cloudové infrastruktury sdílené s ostatními (AWS Lambda, Google Cloud Run) jsou k blokaci náchylnější, protože tyto IP rozsahy mají vyšší míru zneužití.
Techniky pro spolehlivý scraping Shopify
Tady je postup od „funguje na mém notebooku“ až po „funguje v produkci“:
| Úroveň | Technika | Spolehlivost |
|---|---|---|
| Základní | requests.get() + ?page= | Padá na velkých katalozích, může být blokováno |
| Střední | requests.Session() + ?limit=250 + time.sleep(1) + retry na 429 | Funguje pro většinu obchodů |
| Pokročilá | Asynchronní httpx + rotace User-Agentů + exponenciální backoff | Produkční úroveň, škáluje na 10K+ produktů |
Střední úroveň (doporučeno pro většinu uživatelů):
1import requests
2from requests.adapters import HTTPAdapter
3from urllib3.util.retry import Retry
4> This paragraph contains content that cannot be parsed and has been skipped.
5Nastavení `Retry` automaticky řeší odpovědi 429 pomocí exponenciálního backoffu. `backoff_factor=1` znamená sekvenci čekání 0,5 s → 1 s → 2 s → 4 s → 8 s mezi pokusy. Opakované použití session (`requests.Session()`) navíc poskytuje connection pooling, takže se snižuje režie při více požadavcích na stejnou doménu.
6**Rotace User-Agentů**: Pokud scrapujete více obchodů, střídejte 3–5 realistických browser User-Agent řetězců. Nejde o klamání — jde o to, abyste nevypadali jako bot, který posílá pokaždé stejné hlavičky.
7<iframe width="560" height="315" src="https://www.youtube.com/embed/p3Z-qtUp4p8" title="Web Scraping Project: Save Shopify Products to Database" frameBorder="0" allowfullscreen></iframe>
8## Kompletní funkční Python skript pro scraping Shopify s exportem do CSV
9Tady je kompletní skript připravený ke zkopírování a spuštění, který spojuje vše výše uvedené. Má zhruba 75 řádků skutečného kódu (plus komentáře) a testoval jsem ho na Allbirds (1 420 produktů), ColourPop (2 000+ produktů) i Zoologist Perfumes (menší katalog).
10```python
11import requests
12import pandas as pd
13import time
14import random
15from requests.adapters import HTTPAdapter
16from urllib3.util.retry import Retry
17> This paragraph contains content that cannot be parsed and has been skipped.
18def scrape_shopify(store_url, delay=1.0):
19 """Scrapuje všechny produkty z Shopify obchodu přes /products.json."""
20 session = create_session()
21 all_products = []
22 page = 1
23 base_url = f"{store_url.rstrip('/')}/products.json"
24> This paragraph contains content that cannot be parsed and has been skipped.
25 if not products:
26 break
27 all_products.extend(products)
28 print(f"{len(products)} produktů (celkem: {len(all_products)})")
29 page += 1
30 time.sleep(delay + random.uniform(0, 0.5))
31 return all_products
32> This paragraph contains content that cannot be parsed and has been skipped.
33if __name__ == "__main__":
34 STORE_URL = "https://allbirds.com" # Změňte na cílový obchod
35 OUTPUT_CSV = "shopify_products.csv"
36 OUTPUT_EXCEL = "shopify_products.xlsx"
37 print(f"Scraping {STORE_URL}...")
38 products = scrape_shopify(STORE_URL)
39 print(f"\nCelkem scrapovaných produktů: {len(products)}")
40 print("Převádím na řádky na úrovni variant...")
41 rows = flatten_to_variants(products)
42 df = pd.DataFrame(rows)
43 print(f"DataFrame: {df.shape[0]} řádků × {df.shape[1]} sloupců")
44 df.to_csv(OUTPUT_CSV, index=False, encoding="utf-8-sig")
45 df.to_excel(OUTPUT_EXCEL, index=False, engine="openpyxl")
46 print(f"\nExportováno do {OUTPUT_CSV} a {OUTPUT_EXCEL}")
Spusťte ho příkazem python scrape_shopify.py. U Allbirds to trvá asi 45 sekund a vytvoří CSV s přibližně 5 000+ řádky (jeden řádek na variantu). Výstup v terminálu může vypadat zhruba takto:
1Scraping https://allbirds.com...
2 Stránka 1... 250 produktů (celkem: 250)
3 Stránka 2... 250 produktů (celkem: 500)
4 ...
5 Stránka 6... 170 produktů (celkem: 1420)
6Celkem scrapovaných produktů: 1420
7Převádím na řádky na úrovni variant...
8DataFrame: 5680 řádků × 14 sloupců
9Exportováno do shopify_products.csv a shopify_products.xlsx
Přeskočte Python: scrapujte Shopify ve 2 kliknutích s Thunderbit (no-code alternativa)
Ne každý chce instalovat Python, ladit chyby importů nebo udržovat vlastní scrapingový skript. Pro obchodníka, který potřebuje zítra ráno ceny konkurence, je Python často zbytečně složitý.
Proto jsme vytvořili — AI web scraper, který běží jako rozšíření pro Chrome. Žádný kód, žádné API klíče, žádné nastavování prostředí.
Jak Thunderbit scrapuje Shopify obchody
Thunderbit má připravenou šablonu Shopify Scraper, která je přednastavená pro produktové stránky Shopify. Nainstalujete , otevřete Shopify obchod a kliknete na „Scrape“. Šablona automaticky vytáhne názvy produktů, popisy, ceny, detaily variant, obrázky i informace o dodavateli.
U obchodů, kde šablona nesedí úplně přesně (vlastní šablony, nezvyklé rozložení), funkce AI Suggest Fields stránku přečte a sama navrhne názvy sloupců. Ty můžeš upravit — přejmenovat sloupce, přidat pole nebo zadat instrukce jako „vytáhni jen produkty s nastaveným compare_at_price“.
Několik funkcí, které přímo odpovídají tomu, co dělá Python skript:
- Scraping podstránek: Automaticky navštíví každou detailní stránku produktu a obohatí tabulku o kompletní popisy, recenze nebo detaily variant — přesně to, co náš Python skript dělá procházením stránek, ale bez kódu.
- Automatické stránkování: Zvládne klikací stránkování i infinite scroll bez konfigurace.
- Plánované scrapování: Nastavíš opakované úlohy (např. „každé pondělí v 9:00“) pro průběžné sledování cen — bez cron jobu a bez serveru.
- Export zdarma do CSV, Excelu, Google Sheets, Airtable nebo Notion napříč všemi plány.
Python skript vs. Thunderbit: upřímné srovnání
| Faktor | Python skript | Thunderbit (no-code) |
|---|---|---|
| Čas na nastavení | 15–60 min (prostředí + kód) | ~2 min (instalace rozšíření pro Chrome) |
| Nutnost programování | Ano (Python) | Ne |
| Přizpůsobení | Neomezené | Návrhy polí pomocí AI + vlastní prompty |
| Řešení stránkování | Je potřeba naprogramovat ručně | Automatické |
| Formáty exportu | Musíte si napsat sami (CSV/Excel) | CSV, Excel, Google Sheets, Airtable, Notion (zdarma) |
| Plánované běhy | Cron job + hosting | Vestavěný plánovač |
| Ošetření rate limitů | Retry/backoff musíte napsat sami | Řešeno automaticky |
| Nejlepší pro | Vývojáře, velké datové pipeline | Byznys uživatele, rychlé extrakce, opakované monitorování |
Python použijte tehdy, když potřebujete plnou kontrolu nebo data napojujete do většího pipeline. Thunderbit použijte tehdy, když potřebujete data rychle a nechcete udržovat kód. Pokud vás zajímá podrobněji , napsali jsme na to samostatný článek.

Tipy a osvědčené postupy pro scraping Shopify obchodů
Tyto zásady platí bez ohledu na nástroj, který používáte:
- Vždy používejte
?limit=250, abyste minimalizovali počet požadavků. Výchozí hodnota 30 na stránku znamená pro stejná data 8× více požadavků. - Respektujte obchod: Mezi požadavky dejte pauzu 1–2 sekundy. Řídit server sérií rychlých requestů je špatná praxe a zvyšuje riziko blokace.
- Nejdřív zkontrolujte
robots.txt: Výchozírobots.txtShopify/products.jsonneblokuje. Některé obchody ale přidávají vlastní pravidla, takže před větším scrapingem ověřte situaci. - Nejdřív si ukládejte syrový JSON lokálně, teprve potom ho zpracujte. Když se vám později změní parsovací logika, nebudete muset scrapovat znovu. Jednoduché
json.dump(all_products, open("raw_data.json", "w"))před převodem vám ušetří spoustu starostí. - Deduplikujte podle
product.id: Hraniční případy stránkování mohou na rozhraní stránek vrátit duplicitní produkty. Rychlédf.drop_duplicates(subset=["product_id", "variant_id"])to vyčistí. - Před výpočty převeďte
pricena float. Shopify vrací ceny jako řetězce ("185.00"), ne jako čísla. - Sledujte změny endpointu: I když je
/products.jsonroky stabilní, Shopify by ho teoreticky mohl omezit. Pokud scraper náhle vrací 404, nejdřív obchod zkontrolujte ručně.
Další tipy pro stavbu robustních scraperů najdete v našem průvodci .
Právní a etické aspekty scrapování Shopify
Krátká sekce, ale důležitá.
Endpoint /products.json poskytuje veřejně dostupná produktová data — tedy stejné informace, které vidí každý návštěvník při prohlížení obchodu. Podmínky použití Shopify sice obsahují formulace o zákazu používání „automatizovaných prostředků“ k přístupu ke „službám“, ale tím se míní samotná platforma (admin rozhraní, checkout), ne veřejná storefront data. K dubnu 2026 nebyl zaznamenán žádný soudní spor specificky zaměřený na scraping Shopify.
Důležité právní precedenty podporují scraping veřejných dat: případ hiQ v. LinkedIn potvrdil, že scraping veřejně dostupných dat neporušuje CFAA, a Meta v. Bright Data (2024) rozhodl, že omezení v TOS se vztahují jen na případy, kdy je uživatel přihlášen.
Nejlepší praxe:
- scrapujte pouze veřejně dostupná produktová data
- nescrapujte osobní ani zákaznická data
- respektujte
robots.txta rate limity - pokud pracujete s jakýmikoli osobními údaji, dodržujte GDPR/CCPA (produktový katalog osobní údaje neobsahuje)
- identifikujte se jasným User-Agent řetězcem
- scrapování vlastního Shopify obchodu přes Admin API je vždy v pořádku
Podrobnější pohled najdete v našem článku o .
Závěr a hlavní poznatky
Veřejný endpoint Shopify /products.json dělá extrakci e-commerce dat překvapivě snadnou. Postup je jednoduchý: připojit /products.json → načíst přes Python → stránkovat pomocí ?limit=250&page= → převést pomocí pandas → exportovat do CSV nebo Excelu.
Co tento průvodce pokrývá navíc oproti ostatním:
- Kompletní přehled polí: Víte přesně, jaká data jsou k dispozici (40+ polí napříč produkty, variantami a obrázky), ještě než napíšete jediný řádek kódu
- Další endpointy:
/collections.jsona/meta.jsonposkytují přehled na úrovni kategorií a metadata obchodu, které jiní autoři vůbec neřeší - Techniky připravené pro produkci: Reuse session, exponenciální backoff, User-Agent hlavičky a
?limit=250pro práci s reálnými rate limity - Správný export do CSV/Excelu: Ploché variantní tabulky pomocí pandas, ne jen syrový JSON dump
- No-code alternativa: pro uživatele, kteří preferují rychlost před flexibilitou kódu
Pro jednorázové i pravidelné tahání Shopify dat bez kódu vyzkoušejte — šablona Shopify Scraper zvládne vše od stránkování po export. Pro vlastní datové pipeline nebo scraping ve velkém napříč mnoha obchody vám Python skript v tomto průvodci dá plnou kontrolu.
Podívejte se na náš pro video návody, nebo si projděte naše průvodce o a pro podobné techniky.
Často kladené otázky
Lze scrapovat jakýkoli Shopify obchod přes products.json?
Většina Shopify obchodů tento endpoint standardně vystavuje — v testech vracelo platný JSON asi 71 % obchodů. Některé obchody s vlastní konfigurací nebo dalšími bezpečnostními vrstvami (Cloudflare, headless setupy) mohou vrátit 404 nebo požadavek zablokovat. Rychlá kontrola: otevřete {store-url}/products.json v prohlížeči. Pokud vidíš JSON, máš vyhráno.
Je scrapování Shopify obchodů legální?
Veřejná produktová data (ceny, názvy, obrázky, popisy) jsou obecně přístupná a právní precedenty jako hiQ v. LinkedIn podporují scraping veřejně dostupných informací. Přesto vždy zkontroluj podmínky používání konkrétního obchodu a místní zákony. Nescrapuj osobní ani zákaznická data a respektuj rate limity.
Kolik produktů lze ze Shopify obchodu scrapovat?
Neexistuje žádný pevný celkový limit. Stránkování pomocí ?limit=250&page= ti umožní získat celý katalog. U velmi velkých obchodů (25 000+ produktů) používej opakované session a pauzy, abys se vyhnul rate limitům. Endpoint /meta.json ti předem řekne přesný počet produktů, takže víš, kolik stránek čekat.
Jaký je rozdíl mezi products.json a Shopify Admin API?
/products.json je veřejný endpoint — bez autentizace, pouze pro čtení produktových dat, přístupný komukoli. Admin API vyžaduje přístupové tokeny majitele obchodu a poskytuje objednávky, množství zásob, data o zákaznících a možnost zápisu. Pokud potřebuješ data o prodejích nebo skutečné počty zásob, potřebuješ přístup k Admin API (tedy musíš být majitelem obchodu nebo mít jeho souhlas).
Můžu scrapovat Shopify i bez Pythonu?
Rozhodně ano. Nástroje jako ti umožní scrapovat Shopify obchody z rozšíření pro Chrome bez kódu. Automaticky řeší stránkování a exportují přímo do CSV, Excelu, Google Sheets, Airtable nebo Notion. Pro vývojáře, kteří preferují jiné jazyky, funguje stejný endpoint /products.json i v JavaScriptu, Ruby, Go — v jakémkoli jazyce, který umí HTTP požadavky a zpracování JSON.
Zjistit více