Lebensmittelpreise sind lokal. Ein Karton Eier kann in einem Markt am Stadtrand einen Preis haben, in der Innenstadt einen anderen und in einem Lieferdienst, der auf dasselbe Regal einen eigenen Aufschlag legt, einen dritten. Wenn Sie Ihre Preise an lokalen Wettbewerbern ausrichten, die Aktionen einer Marke prüfen oder die Lebensmittelinflation nach Region verfolgen, brauchen Sie Preise aus jeder relevanten Stadt, keinen nationalen Durchschnitt. Das ist eine Kernaufgabe der Price Intelligence, und bei Lebensmitteln ist sie schwieriger als in den meisten anderen Bereichen des Handels.
Dieser Leitfaden erklärt, wo Lebensmittelpreise variieren, wie Lieferdienste entscheiden, welche Filiale Sie sehen, und wie Sie eine Erfassung aufsetzen, die jede Stadt so liest wie ein Kunde vor Ort.
Wo Lebensmittelpreise variieren
Lebensmittelhändler arbeiten selten mit einer einzigen Preisliste. Die üblichen Ebenen sind:
- Preiszonen. Ketten teilen ihre Filialen nach lokalem Wettbewerb und Kosten in Zonen ein. Zwei Filialen derselben Kette, wenige Kilometer voneinander entfernt, können in unterschiedlichen Zonen liegen.
- Aktionen auf Filialebene. Wöchentliche Prospekte und Treueangebote unterscheiden sich oft nach Region, und manche Angebote gelten nur in ausgewählten Filialen.
- Aufschläge der Lieferdienste. Drittanbieter-Apps können Preise über dem Regalpreis im Markt zeigen, dazu Service- und Liefergebühren, die sich nach Gebiet und Tageszeit ändern.
- Verfügbarkeit. Ein Artikel kann in einer Filiale vorrätig sein und in einer anderen fehlen, was die tatsächlichen Kosten eines Warenkorbs verändert.
- Packungsgrößen und Eigenmarken. Dieselbe Produktlinie kann je nach Region in unterschiedlichen Größen angeboten werden, was Preisänderungen verdeckt, wenn Sie keine Grundpreise vergleichen.
Ein einzelner landesweiter Scrape vermischt all das zu einer irreführenden Zahl. Zu jedem erfassten Preis gehören Filiale, Stadt und Kanal.
Wie Lieferdienste und Händler-Websites eine Filiale wählen
Die meisten Lebensmittel-Websites zeigen das vollständige Sortiment erst, wenn sie wissen, wo Sie sind. Sie entscheiden ungefähr in dieser Reihenfolge:
- Eine gespeicherte Filiale oder Adresse, aus einem Cookie oder dem Kundenkonto.
- Die Adresse oder Postleitzahl, die Sie eingeben, in der Filialauswahl oder beim Liefercheck.
- Ihr IP-Standort, als erste Schätzung, bevor Sie etwas auswählen.
Das hat eine praktische Folge. Die IP bringt Sie in die richtige Stadt und sorgt dafür, dass die erste Schätzung in der Nähe der gewünschten Filiale landet. Die genaue Filiale, bis hinunter zur Postleitzahl, bestimmt die Adresse, die Sie der Website angeben. Ein zuverlässiges Setup macht deshalb beides: eine Residential-IP in der Zielstadt und die Filiale oder Lieferadresse, eingegeben in derselben Session, damit beides nie auseinanderläuft. Unser Beitrag dazu, wann Proxy-Targeting auf Stadtebene wichtig ist, erklärt, warum ein Widerspruch zwischen IP und gewähltem Standort verändern kann, was eine Website ausliefert.
Den Warenkorb festlegen
Bevor Sie etwas erfassen, legen Sie fest, was Sie vergleichen:
- Ein fester Warenkorb mit 50 bis 300 Produkten: Grundnahrungsmittel, Ihre eigenen Topseller und die Artikel, die Ihre Wettbewerber am stärksten bewerben.
- Ein Abgleichschlüssel für jedes Produkt, etwa der Barcode (GTIN), wenn die Website ihn ausgibt, andernfalls ein Abgleich über Marke, Name und Größe, den Sie einmal von Hand prüfen.
- Der Grundpreis (pro kg, pro Liter, pro Stück) neben dem Regalpreis, damit Änderungen der Packungsgröße nicht wie Preisänderungen aussehen.
- Eine Filialliste pro Stadt: welche Filialen und welche Liefergebiete diese Stadt für Sie repräsentieren.
Halten Sie den Warenkorb stabil. Wer ihn jede Woche ändert, kann keine Trends mehr ablesen.
Stadt für Stadt erfassen
Öffnen Sie für jede Stadt eine Session über Residential Proxies mit Targeting auf diese Stadt, legen Sie die Filiale auf der Website fest und lesen Sie dann den Warenkorb aus. Behalten Sie mit einer Sticky-Session-ID eine IP für die gesamte Session, damit die Website nicht sieht, wie der Kunde mittendrin zwischen Standorten springt.
customer-USERNAME-country-us-city-chicago-sid-chi-store-118-ttl-900:PASSWORD
Die Session-ID (sid) hält denselben Exit für bis zu ttl Sekunden. Nutzen Sie eine ID pro Filiale, damit jeder Filialbesuch wie ein einzelner Kunde aussieht. Bei einem großen Markt verteilen Sie die Arbeit auf die wichtigsten Städte, etwa Chicago, Dallas und Atlanta auf den Seiten zu den USA, statt das ganze Land von einem Ort aus zu lesen.
Eine minimale Schleife in Python sieht so aus:
import requests
GATEWAY = "p.shifter.io:443"
USER, PASS = "USERNAME", "PASSWORD"
def session_for(city, store_id):
s = requests.Session()
proxy = f"http://customer-{USER}-country-us-city-{city}-sid-{city}-{store_id}-ttl-900:{PASS}@{GATEWAY}"
s.proxies = {"http": proxy, "https": proxy}
return s
def read_basket(city, store_id, products):
s = session_for(city, store_id)
# 1. Set the store the way the site expects (store picker or address check).
s.post("https://grocer.example/api/store/select", json={"storeId": store_id}, timeout=30)
rows = []
for p in products:
r = s.get(f"https://grocer.example/api/product/{p['sku']}", timeout=30)
if r.status_code != 200:
rows.append({**p, "city": city, "store": store_id, "error": r.status_code})
continue
d = r.json()
rows.append({**p, "city": city, "store": store_id,
"price": d.get("price"), "unit_price": d.get("unitPrice"),
"promo": d.get("promotion"), "in_stock": d.get("available")})
return rows
Die Endpunkte sind hier Platzhalter. Viele Händler-Websites laden Preise über einen JSON-Endpunkt, sobald die Filiale gesetzt ist. Diesen Endpunkt auszulesen ist leichter und stabiler, als die Seite zu parsen.
Lieferdienste auslesen
Lieferdienste bringen zwei Dinge ins Spiel, die Sie getrennt erfassen müssen: den Artikelpreis in der App und die Gebühren. Erfassen Sie:
- Den Artikelpreis in der App neben dem Regalpreis von der eigenen Website des Händlers, um den Aufschlag zu messen.
- Service- und Liefergebühren für einen festen Warenkorbwert, da Gebühren oft vom Bestellwert abhängen.
- Den Zeitpunkt der Erfassung, weil sich Gebühren und Verfügbarkeit im Tagesverlauf ändern.
Vergleichen Sie Gleiches mit Gleichem: dieselbe Filiale, derselbe Warenkorb, dieselbe Uhrzeit.
Die Daten sauber halten
- Speichern Sie jeden Preis mit Stadt, Filiale, Kanal, Zeitpunkt und Grundpreis. Ohne die Filiale können Sie eine Änderung nicht erklären.
- Markieren Sie Aktionen, statt sie in den Durchschnitt einzurechnen. Ein zweiwöchiges Angebot ist keine Preissenkung.
- Achten Sie auf fehlende Artikel. Ein leerer Preis bedeutet oft, dass der Artikel nicht vorrätig ist, und das ist selbst ein Signal.
- Prüfen Sie auf personalisierte Preise. Treuepreise für eingeloggte Kunden können von Gastpreisen abweichen. Erfassen Sie als Gast, es sei denn, Sie untersuchen gezielt Treuepreise. Unser Leitfaden zum Erkennen geo-personalisierter und dynamischer Preise zeigt, wie Sie beides trennen.
- Erfassen Sie nur öffentliche Preise, mit moderater Abfragerate, und beachten Sie die Nutzungsbedingungen jeder Website.
Das Fazit
Ein Lebensmittelpreis hat nur mit Stadt, Filiale und Kanal eine Aussagekraft. Legen Sie einen Warenkorb fest, bestimmen Sie, welche Filialen für jede Stadt stehen, steigen Sie in jede Stadt über eine dort verortete Residential-IP ein, legen Sie die Filiale in derselben Session auf der Website fest und erfassen Sie Grundpreise, Aktionen und Gebühren getrennt. Führen Sie das wöchentlich für Grundnahrungsmittel und täglich für die Artikel aus, bei denen Sie im Wettbewerb stehen, und Sie sehen lokale Preisbewegungen, sobald sie passieren, statt einer verschwommenen nationalen Zahl.