Scraping des prix des produits alimentaires : données par magasin et code postal à grande échelle

Les prix des produits alimentaires sont hyper-locaux : le même article coûte des montants différents selon le magasin et le code postal. Capturer cela signifie des requêtes géo-ciblées et un appariement par code UPC. Voici comment construire un ensemble de données de prix par magasin qui tient la route.

La tarification des produits alimentaires est l'un des ensembles de données les plus hyper-locaux sur le web. La même boîte de céréales peut coûter 4,29 $ dans une chaîne et 5,19 $ dans une autre à quelques kilomètres de distance, et les plateformes de livraison proposent des prix différents selon le magasin et le code postal que vous définissez. Cette variabilité est précisément la raison pour laquelle les données sont précieuses — pour les marques de produits de grande consommation suivant l'exécution au détail, pour les outils de comparaison, pour quiconque mesurant l'inflation en rayon. Mais cela signifie aussi que vous ne pouvez pas simplement extraire un prix national ; vous devez capturer les prix par magasin et par code postal, ce qui est un problème de géo-ciblage et d'appariement de produits. Ce guide couvre comment collecter les prix des produits alimentaires au niveau du magasin, apparier les produits par code UPC et construire un indice de panier qui tient la route. Il s'agit d'informations générales, pas de conseils juridiques — respectez les conditions de chaque site.

Pourquoi l'écart est une opportunité

Les chiffres font le cas. Lorsque Consumer Reports a commandé une comparaison de panier entre les chaînes dans six villes représentatives des États-Unis, l'écart entre le magasin le moins cher et le plus cher dans chaque ville a dépassé 33 % — et s'est élargi une fois les clubs-entrepôts et les épiceries spécialisées inclus. Les prix des aliments ont augmenté de 25,5 % entre décembre 2020 et décembre 2024 selon les données du Bureau of Labor Statistics analysées par la Fed de St. Louis, avec le café seul en hausse d'environ 20 % d'une année sur l'autre. Les indices hebdomadaires qui suivent cela proviennent de plus de 150 000 magasins. Un ensemble de données qui capture qui est le moins cher, où, et comment cela change semaine après semaine est vraiment difficile à assembler à la main — ce qui le rend défendable une fois automatisé.

La localisation contrôle le prix, donc elle contrôle la requête

La technique de base : pour voir les prix locaux d'un magasin, vous devez vous présenter comme un acheteur dans la zone de ce magasin. Sur la plupart des sites de produits alimentaires et de livraison, les prix ne se résolvent qu'une fois que vous avez défini un code postal de livraison ou choisi un magasin spécifique, et le site associe cela à votre session et souvent à la localisation de votre IP. Ainsi, la requête a deux parties mobiles — le magasin/code postal que vous définissez dans la charge utile, et une IP de sortie qui se trouve dans la même région pour que le site fasse confiance à la localisation. Une IP résidentielle dans la métropole cible est ce qui débloque la tarification locale correcte ; une IP de centre de données dans un autre État peut vous donner une vue par défaut ou bloquée.

import httpx

# A residential exit in the target region unlocks that region's prices
def region_proxy(state):
    return f"http://USER:PASS-country-us-region-{state}@gate.quantumproxies.io:8000"

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": "application/json",
}

def fetch_store_price(store_api_url, zip_code, state):
    # Many stores accept the ZIP as a cookie/param that scopes pricing
    r = httpx.get(
        store_api_url,
        params={"zipCode": zip_code},
        headers={**HEADERS, "cookie": f"store_zip={zip_code}"},
        proxy=region_proxy(state),
        timeout=30,
    )
    return r.json()
Panneau de statistiques montrant un écart de prix de panier de 33 %, une inflation alimentaire de 25,5 % et plus de 150 000 magasins dans un indice hebdomadaire
Un panier peut coûter un tiers de plus dans une chaîne que dans une autre dans la même ville — capturer cet écart est tout l'intérêt.

Lisez le JSON d'hydratation, pas le prix rendu

Les sites modernes de produits alimentaires sont fortement rendus côté client, et — comme la plupart des grandes applications de commerce électronique — ils intègrent les données des produits sous forme de JSON dans la page plutôt que de les afficher uniquement à l'écran. Recherchez une charge utile d'hydratation (souvent dans une balise <script> telle que __NEXT_DATA__ ou un objet d'état spécifique au magasin) qui contient le prix, le statut du stock et, surtout, le code UPC ou GTIN. Lire ce JSON est bien plus robuste que de scraper un élément de prix rendu, et cela vous donne le code-barres dont vous avez besoin pour l'appariement. Notre note sur pourquoi un scraper retourne une page vide couvre la recherche de ces charges utiles lorsque le HTML visible semble vide.

import re, json

def extract_hydration(html: str) -> dict:
    m = re.search(r'<script id="__NEXT_DATA__"[^>]*>(\{.+?\})</script>',
                  html, re.DOTALL)
    if not m:
        raise ValueError("hydration payload not found")
    return json.loads(m.group(1))

def parse_product(state_json: dict) -> dict:
    p = state_json["props"]["pageProps"]["product"]
    return {
        "upc": p.get("upc") or p.get("gtin"),
        "name": p.get("name"),
        "price": p["price"]["current"],
        "in_stock": p.get("availabilityStatus") == "IN_STOCK",
    }

Appariez par code UPC, jamais par nom

La plus grande erreur dans les données de prix des produits alimentaires est d'apparier les produits par nom. "Cheerios Family Size", "Cheerios Family Size 18oz" et "General Mills Cheerios (Family Size)" sont le même article avec trois étiquettes dans trois magasins — appariez sur le nom et votre comparaison est du bruit. Appariez sur le code-barres UPC/GTIN à la place, qui est le même quel que soit le titre du produit dans chaque magasin. Chaque outil sérieux de comparaison de produits alimentaires fait cela ; c'est ce qui rend un panier inter-magasins significatif.

from collections import defaultdict

# Group scraped rows by barcode so each item lines up across stores
def compare_by_upc(rows: list[dict]) -> dict:
    by_upc = defaultdict(dict)
    for r in rows:                      # r = {store, upc, price, ...}
        if r.get("upc"):
            by_upc[r["upc"]][r["store"]] = r["price"]
    # cheapest store per item
    return {upc: min(prices, key=prices.get) for upc, prices in by_upc.items()}

À partir des lignes appariées par code-barres, vous pouvez construire la métrique qui compte : un indice de panier. Définissez un panier fixe d'articles courants, évaluez-le dans chaque magasin par code postal, et totalisez-le — ce nombre unique, suivi dans le temps, est ce qui révèle les écarts de 33 % et l'inflation semaine après semaine. Parce que vous exécutez la même collecte à travers de nombreux emplacements et magasins, la rotation par requête à travers un pool de proxy résidentiel empêche toute sortie de paraître anormale tout en préservant la géo que vous avez définie.

Collectez les prix locaux des produits alimentaires sur des IPs géo-ciblées

Passer à un ensemble de données réel

Un flux de prix de produits alimentaires en production est une matrice : magasins × codes postaux × produits × temps. Cela représente beaucoup de requêtes, et c'est là que le scraping DIY devient lourd — vous jonglez avec des sessions liées à la géo, des charges utiles d'hydratation qui changent entre les déploiements, et des couches anti-bot sur les grandes chaînes. Une Scraper API qui rend lorsque nécessaire, fait tourner des IPs géo-ciblées et retourne un JSON propre réduit la plupart de cela à un seul appel, vous permettant de concentrer vos efforts sur la logique de panier plutôt que sur la plomberie. Pour le côté stratégie de tarification des mêmes données, consultez nos guides sur la surveillance des prix des concurrents et la construction d'une couche de données de comparaison de prix.

Diagramme de pipeline pour la collecte des prix des produits alimentaires : définissez le magasin et le code postal, récupérez le JSON d'hydratation, appariez par code UPC, construisez un indice de panier
Définissez l'emplacement, lisez le JSON que la page envoie, appariez par code-barres, puis totalisez le panier par code postal au fil du temps.

Questions fréquemment posées

Comment puis-je extraire les prix des produits alimentaires par emplacement ?

Définissez le magasin ou le code postal de livraison dans la requête (généralement un paramètre ou un cookie) et routez via un proxy résidentiel dont l'IP de sortie se trouve dans cette région, afin que le site fasse confiance à l'emplacement et retourne les prix locaux. Ensuite, lisez le prix et le code UPC à partir du JSON d'hydratation de la page plutôt que de l'élément rendu. Répétez par code postal pour construire une matrice géo.

Pourquoi apparier les produits alimentaires par code UPC plutôt que par nom ?

Parce que les magasins titrent le même article différemment — tailles, ordre des marques et abréviations varient — donc l'appariement par nom produit des discordances fausses et des comparaisons bruyantes. Le code-barres UPC ou GTIN est identique chez les détaillants pour le même produit, donc l'appariement sur celui-ci vous permet d'aligner les prix pour le même article exact dans chaque magasin que vous scrapez.

Les prix de livraison des produits alimentaires diffèrent-ils vraiment par code postal ?

Oui. Les plateformes de produits alimentaires et de livraison limitent les prix, promotions et disponibilités à un magasin, et les magasins sont liés à votre code postal de livraison, donc le même produit peut afficher des prix différents dans des zones voisines. Consumer Reports a trouvé des écarts de panier supérieurs à 33 % entre les chaînes les moins chères et les plus chères dans une même ville, c'est pourquoi la collecte spécifique à l'emplacement est importante.

Le scraping des prix des produits alimentaires est-il légal ?

Collecter des prix visibles publiquement est courant — les médias et les indices de prix le font chaque semaine — mais cela dépend des conditions du site et de votre juridiction. Tenez-vous-en aux pages de produits publiques, évitez les données personnelles et les zones nécessitant une connexion, espacez vos requêtes, et obtenez des conseils juridiques pour un usage commercial. Ce sont des informations générales, pas des conseils juridiques.

Les données de prix des produits alimentaires vivent et meurent par la localisation et l'identité. Définissez le magasin et le code postal, présentez-vous à partir d'une IP résidentielle dans la région, lisez le JSON d'hydratation, et appariez sur le code UPC — puis totalisez le panier et suivez-le au fil du temps. Faites cela à travers suffisamment de magasins et de codes postaux et vous possédez un ensemble de données qu'une comparaison manuelle ne pourrait jamais égaler.

Construisez votre flux de prix des produits alimentaires avec la Scraper API