Scraping cen żywności: Dane na poziomie sklepu i kodu pocztowego na dużą skalę
Ceny żywności są bardzo lokalne: ten sam produkt kosztuje różne kwoty w zależności od sklepu i kodu pocztowego. Aby to uchwycić, potrzebne są żądania ukierunkowane geograficznie i dopasowanie UPC. Oto jak zbudować zestaw danych o cenach na poziomie sklepu, który się sprawdza.
Ceny żywności to jeden z najbardziej lokalnych zestawów danych w sieci. Ta sama paczka płatków może kosztować $4.29 w jednej sieci i $5.19 w innej, kilka mil dalej, a platformy dostawcze podają różne ceny w zależności od sklepu i ustawionego kodu pocztowego. Ta zmienność jest dokładnie tym, co czyni dane wartościowymi — dla marek CPG śledzących realizację sprzedaży detalicznej, dla narzędzi porównawczych, dla każdego, kto mierzy inflację na półce. Ale oznacza to również, że nie można po prostu scrapować ceny krajowej; trzeba uchwycić ceny na poziomie sklepu i kodu pocztowego, co jest problemem ukierunkowania geograficznego i dopasowania produktu. Ten przewodnik obejmuje, jak zbierać ceny żywności na poziomie sklepu, dopasowywać produkty według UPC i budować indeks koszyka, który się sprawdza. To ogólne informacje, nie porady prawne — szanuj warunki każdej strony.
Dlaczego rozpiętość jest szansą
Liczby mówią same za siebie. Kiedy Consumer Reports zlecił porównanie koszyków w sieciach w sześciu reprezentatywnych miastach USA, różnica między najtańszym a najdroższym sklepem w każdym mieście przekroczyła 33% — i jeszcze się powiększyła, gdy uwzględniono kluby magazynowe i sklepy specjalistyczne. Ceny żywności wzrosły o 25,5% między grudniem 2020 a grudniem 2024 według danych Bureau of Labor Statistics analizowanych przez St. Louis Fed, z samą kawą wzrastającą o około 20% rok do roku. Tygodniowe indeksy, które to śledzą, pochodzą z ponad 150 000 sklepów. Zestaw danych, który uchwyci, kto jest najtańszy, gdzie i jak to się zmienia z tygodnia na tydzień, jest naprawdę trudny do złożenia ręcznie — co czyni go obronnym, gdy go zautomatyzujesz.
Lokalizacja kontroluje cenę, więc kontroluje żądanie
Podstawowa technika: aby zobaczyć lokalne ceny sklepu, musisz się przedstawić jako kupujący w tym obszarze sklepu. Na większości stron z żywnością i dostawami ceny pojawiają się dopiero po ustawieniu kodu pocztowego dostawy lub wyborze konkretnego sklepu, a strona przypisuje to do twojej sesji i często do lokalizacji twojego IP. Tak więc żądanie ma dwa ruchome elementy — sklep/kod pocztowy ustawiony w ładunku i wyjściowe IP znajdujące się w tym samym regionie, aby strona ufała lokalizacji. Rezydencjalne IP w docelowej metropolii to klucz do odblokowania poprawnych lokalnych cen; IP z centrum danych w innym stanie może dać ci widok domyślny lub zablokowany.
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()

Czytaj JSON z hydratacji, nie renderowaną cenę
Nowoczesne strony z żywnością są mocno renderowane po stronie klienta i — jak większość dużych aplikacji e-commerce — osadzają dane o produktach jako JSON na stronie, zamiast tylko malować je na ekranie. Szukaj ładunku hydratacji (często w tagu <script>, takim jak __NEXT_DATA__ lub obiekt stanu specyficzny dla sklepu), który zawiera cenę, status zapasów i, co najważniejsze, UPC lub GTIN. Czytanie tego JSON jest znacznie bardziej niezawodne niż scrapowanie renderowanego elementu ceny i daje ci kod kreskowy potrzebny do dopasowania. Nasza notatka na temat dlaczego scraper zwraca pustą stronę obejmuje znajdowanie tych ładunków, gdy widoczny HTML wygląda na pusty.
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",
}
Dopasuj według UPC, nigdy według nazwy
Największym błędem w danych o cenach żywności jest dopasowywanie produktów według nazwy. "Cheerios Family Size", "Cheerios Family Size 18oz" i "General Mills Cheerios (Family Size)" to ten sam produkt z trzema etykietami w trzech sklepach — dopasowanie według nazwy to szum. Dopasuj według kodu kreskowego UPC/GTIN, który jest taki sam niezależnie od tego, jak każdy sklep nazywa produkt. Każde poważne narzędzie do porównywania żywności to robi; to jest to, co czyni koszyk między sklepami znaczącym.
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()}
Z wierszy dopasowanych według kodu kreskowego możesz zbudować najważniejszą metrykę: indeks koszyka. Zdefiniuj stały koszyk powszechnych produktów, wyceń go w każdym sklepie na kod pocztowy i zsumuj — ta pojedyncza liczba, śledzona w czasie, ujawnia 33% różnice i inflację z tygodnia na tydzień. Ponieważ prowadzisz tę samą kolekcję w wielu lokalizacjach i sklepach, rotacja żądań przez pulę proxy rezydencjalnych utrzymuje każde wyjście od wyglądania nienormalnie, zachowując ustawioną geolokalizację.
Zbieraj lokalne ceny żywności na IP ukierunkowanych geograficznie
Skalowanie do rzeczywistego zestawu danych
Produkcja kanału cen żywności to macierz: sklepy × kody pocztowe × produkty × czas. To dużo żądań i to jest miejsce, gdzie DIY scraping staje się ciężki — żonglujesz sesjami związanymi z geolokalizacją, ładunkami hydratacji, które zmieniają się między wdrożeniami, i warstwami antybotowymi na większych sieciach. Scraper API, który renderuje, gdy jest to potrzebne, rotuje IP ukierunkowane geograficznie i zwraca czysty JSON, redukuje większość tego do jednego wywołania, więc możesz skupić się na logice koszyka zamiast na hydraulice. Dla strony strategii cenowej tych samych danych, zobacz nasze przewodniki na temat monitorowania cen konkurencji i budowania warstwy danych porównawczych cen.

Najczęściej zadawane pytania
Jak scrapować ceny żywności według lokalizacji?
Ustaw sklep lub kod pocztowy dostawy w żądaniu (zwykle parametr lub cookie) i przekieruj przez proxy rezydencjalne, którego wyjściowe IP znajduje się w tym regionie, aby strona ufała lokalizacji i zwracała lokalne ceny. Następnie odczytaj cenę i UPC z JSON z hydratacji strony zamiast z renderowanego elementu. Powtórz dla każdego kodu pocztowego, aby zbudować macierz geograficzną.
Dlaczego dopasowywać produkty spożywcze według UPC zamiast nazwy?
Ponieważ sklepy różnie nazywają ten sam produkt — rozmiary, kolejność marek i skróty różnią się — więc dopasowanie według nazwy powoduje fałszywe niedopasowania i hałaśliwe porównania. Kod kreskowy UPC lub GTIN jest identyczny wśród detalistów dla tego samego produktu, więc dopasowanie według niego pozwala wyrównać ceny dla dokładnie tego samego produktu w każdym sklepie, który scrapujesz.
Czy ceny dostawy żywności naprawdę różnią się w zależności od kodu pocztowego?
Tak. Platformy spożywcze i dostawcze dostosowują ceny, promocje i dostępność do sklepu, a sklepy są powiązane z twoim kodem pocztowym dostawy, więc ten sam produkt może mieć różne ceny w sąsiednich obszarach. Consumer Reports znalazł różnice w koszykach powyżej 33% między najtańszymi a najdroższymi sieciami w jednym mieście, co jest powodem, dla którego zbieranie danych specyficznych dla lokalizacji ma znaczenie.
Czy scrapowanie cen żywności jest legalne?
Zbieranie publicznie widocznych cen jest powszechne — media i indeksy cenowe robią to co tydzień — ale zależy to od warunków strony i twojej jurysdykcji. Trzymaj się publicznych stron produktów, unikaj danych osobowych i obszarów wymagających logowania, ograniczaj swoje żądania i zasięgnij porady prawnej w przypadku komercyjnego wykorzystania. To ogólne informacje, nie porady prawne.
Dane o cenach żywności żyją i umierają na lokalizacji i tożsamości. Ustaw sklep i kod pocztowy, przedstaw się z rezydencjalnego IP w regionie, odczytaj JSON z hydratacji i dopasuj według UPC — następnie zsumuj koszyk i śledź go w czasie. Zrób to w wystarczającej liczbie sklepów i kodów pocztowych, a posiadasz zestaw danych, z którym ręczne porównanie nigdy nie nadąży.