Scraping Shopify products.json : Le point d'accès que chaque boutique expose

Oubliez l'analyse du HTML. Chaque boutique Shopify vous fournit un JSON propre à /products.json — catalogue complet, prix, variantes, stock. Voici les limites de pagination, les astuces de vitesse, et comment le transformer en surveillance de la concurrence.

Quiconque a déjà fait du scraping d'e-commerce connaît la douleur : sélecteurs CSS fragiles, divs d'emballage imbriqués, mises en page qui changent et cassent tout du jour au lendemain. Shopify vous offre une échappatoire. Presque chaque boutique construite sur Shopify expose un point d'accès public /products.json qui renvoie l'intégralité du catalogue sous forme de JSON propre et structuré — titres, handles, vendeurs, tags, variantes, prix, indicateurs de stock et images. Pas d'analyse HTML, pas de navigateur sans tête. Ce guide couvre le fonctionnement du point d'accès, ses véritables limites de pagination, une astuce qui rend le crawling de grandes boutiques beaucoup plus rapide, et comment transformer le tout en surveillance des prix et des stocks des concurrents.

Le point d'accès sur chaque boutique Shopify

Ajoutez /products.json au domaine racine de n'importe quelle boutique Shopify et vous obtenez une liste JSON de produits. C'est les mêmes données que la vitrine utilise, exposées par conception pour l'API Ajax. Chaque produit porte un id numérique stable, un handle, un vendor, un product_type, des tags, un tableau de variants (chacun avec son propre prix, SKU et un booléen available), et des images. C'est tout ce que vous scrapperiez normalement sur une page produit, livré en une seule requête.

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

Deux mises en garde d'emblée. Shopify limite le point d'accès public à 250 produits par page — une limite que vous ne pouvez pas dépasser, peu importe ce que vous passez, alors ignorez les conseils de définir limit=1000000 et de tout récupérer en un seul appel. Et une minorité de boutiques désactivent le point d'accès (les constructions personnalisées le désactivent parfois), alors vérifiez une réponse valide avant de construire un pipeline autour.

Paginer jusqu'à la fin

En raison du plafond de 250, un catalogue complet signifie parcourir les pages jusqu'à ce que vous en atteigniez une vide. La boucle naïve incrémente page et s'arrête lorsqu'une page revient vide. C'est correct et c'est bien pour les petites boutiques — une boutique avec quelques centaines de produits nécessite quelques requêtes.

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
Diagramme statistique montrant les limites de Shopify products.json : plafond de 250 produits par page, pagination 25 fois plus rapide avec recherche binaire, 833 pages sur une boutique de 25000 produits
Le point d'accès est limité à 250 produits par page — la vitesse vient de trouver la dernière page rapidement, pas de requêtes plus grandes.

L'astuce 25x : trouver la dernière page d'abord

La pagination séquentielle est lente sur les grandes boutiques car vous ne pouvez pas paralléliser — vous ne savez pas quand vous arrêter, donc chaque page attend celle qui la précède. La solution est une recherche binaire : sonder les numéros de page pour trouver la dernière page non vide, puis lancer toutes les requêtes de page en parallèle. Dans un benchmark public contre une boutique avec 25 000 produits répartis sur 833 pages, cela a réduit un crawl d'environ 120 secondes à environ 12 lors de la première exécution et environ 5 une fois le numéro de la dernière page mis en cache — une accélération de 25 fois. Faites passer les sondes par des IP rotatives pour que l'explosion de requêtes simultanées ne déclenche pas de limitation.

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

Comme l'a dit Rob Pike, les algorithmes sophistiqués sont lents lorsque n est petit — pour une boutique de 200 produits, passez la recherche binaire et bouclez simplement. Cela vaut son pesant d'or sur les catalogues de milliers de produits, où la pagination séquentielle traîne.

Réduire le tirage : collections et produits uniques

Vous ne voulez pas toujours l'ensemble du catalogue. Shopify expose le même JSON au niveau de la collection : /collections/&lt;handle&gt;/products.json renvoie uniquement les produits de cette collection, paginés de la même manière. C'est le chemin efficace lorsque vous ne suivez qu'une catégorie — baskets, parfums, une seule marque — plutôt qu'une boutique entière. Et pour inspecter un produit, ajoutez .json à son URL : /products/&lt;handle&gt;.json donne l'enregistrement complet de ce produit, y compris chaque variante et son indicateur d'inventaire, ce qui est pratique pour un sondage de réapprovisionnement serré sur un SKU spécifique sans re-crawler le catalogue.

Combiner les deux maintient le volume de requêtes — et la bande passante — bas. Découvrez le catalogue une fois avec le point d'accès complet, stockez les handles qui vous intéressent, puis interrogez les produits ou collections individuels selon un calendrier serré. Ce modèle fait la différence entre un moniteur qui s'adapte à des centaines de boutiques et un qui épuise discrètement votre budget proxy en téléchargeant à nouveau des catalogues qui n'ont pas changé.

Transformez-le en surveillance de la concurrence

La véritable valeur n'est pas un dump de catalogue ponctuel — c'est la différence au fil du temps. Prenez un instantané du products.json d'un concurrent selon un calendrier, indexez par id de variante, et comparez les exécutions pour détecter les changements de prix, les nouveaux produits et les réapprovisionnements dès qu'ils se produisent. Parce que available et price vivent sur chaque variante, vous obtenez des signaux de stock et de prix sans toucher à une page produit.

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

C'est l'épine dorsale de la surveillance des prix des concurrents et de la recherche de dropshipping — les deux reposent sur le même modèle d'instantané et de différence à travers de nombreuses boutiques à la fois.

Obtenez des proxies de datacenter rapides pour le scraping Shopify

Diagramme de flux d'un pipeline Shopify products.json : point d'accès au portail proxy rotatif à l'analyse JSON de variante aux instantanés de différence pour la surveillance
Prenez un instantané selon un calendrier, différenciez les variantes, et vous avez des alertes de prix et de réapprovisionnement en direct sur chaque boutique que vous suivez.

Quels proxies vous faut-il réellement

Le point d'accès products.json est un JSON public, pas un flux de paiement sécurisé, donc il est tolérant — mais scrappez des centaines de boutiques ou marteler une sur un calendrier et vous atteindrez les limites de taux par IP. La réponse économique est des proxies de datacenter rapides avec rotation : bon marché, rapide, et suffisant pour répartir les requêtes sur les IPs afin qu'aucune ne soit limitée. Réservez les IPs résidentielles pour les boutiques qui bloquent carrément les plages de datacenter. Si une boutique a désactivé products.json et cache son catalogue derrière des pages rendues ou une protection anti-bot, une Scraper API qui rend et tourne pour vous est le recours plus propre. Notre guide sur quand les proxies de datacenter gagnent couvre la décision.

Questions fréquemment posées

Comment obtenir tous les produits d'une boutique Shopify en JSON ?

Demandez /products.json sur le domaine de la boutique avec ?limit=250&page=N et incrémentez page jusqu'à ce qu'une page renvoie un tableau de produits vide. Chaque réponse contient jusqu'à 250 produits avec leurs variantes, prix, SKUs et indicateurs de stock. Pour les grands catalogues, effectuez une recherche binaire de la dernière page et récupérez les pages en parallèle.

Quelle est la limite sur Shopify products.json ?

Le point d'accès public est limité à 250 produits par page — la valeur la plus élevée que limit accepte. Passer un nombre plus grand ne renverra pas plus ; vous devez toujours parcourir le catalogue. C'est une limite stricte de Shopify, alors prévoyez une pagination plutôt que d'essayer de tout récupérer en une seule requête.

Est-ce légal de scraper Shopify products.json ?

Le point d'accès sert des données de produit disponibles publiquement sans connexion, et les tribunaux américains ont généralement soutenu le scraping de données publiques. Cela dit, respectez les conditions d'utilisation de la boutique, évitez les données personnelles, et ne surchargez pas le serveur. Ceci est une information générale, pas un conseil juridique — vérifiez les spécificités pour votre cas d'utilisation et votre juridiction.

Pourquoi products.json renvoie-t-il un 404 ou une réponse vide ?

Soit la boutique n'est pas sur Shopify, soit le marchand a désactivé le point d'accès sur une construction personnalisée. Certaines boutiques limitent également les requêtes répétées d'une même IP, ce qui peut ressembler à une erreur. Confirmez que la boutique est Shopify, faites tourner votre IP, et ajoutez un délai entre les requêtes avant de supposer que le point d'accès est parti.

Le point d'accès products.json transforme le scraping Shopify d'une corvée de gestion de sélecteurs en une extraction JSON propre : catalogue complet, prix et stock en une URL, 250 par page, rapide à crawler avec une recherche binaire, et trivial à transformer en surveillance de la concurrence. Découvrez une fois, interrogez les collections et produits qui comptent, répartissez les requêtes sur des IPs de datacenter rotatives, et vous pouvez suivre des centaines de boutiques selon un calendrier sans une seule exécution bloquée — pas de parser HTML, pas de navigateur sans tête, pas de sélecteurs fragiles à surveiller.

Commencez à scraper Shopify avec QuantumProxies