Raspagem de Preços de Supermercado: Dados em Nível de Loja e CEP em Escala
Os preços de supermercado são hiperlocais: o mesmo item custa valores diferentes por loja e CEP. Capturar isso significa solicitações geograficamente direcionadas e correspondência de UPC. Aqui está como construir um conjunto de dados de preços em nível de loja que se sustenta.
A precificação de supermercado é um dos conjuntos de dados mais hiperlocais da web. A mesma caixa de cereal pode custar $4,29 em uma rede e $5,19 em outra a poucos quilômetros de distância, e as plataformas de entrega oferecem preços diferentes dependendo da loja e do código postal que você definir. Essa variabilidade é exatamente o motivo pelo qual os dados são valiosos — para marcas de CPG acompanhando a execução no varejo, para ferramentas de comparação, para qualquer pessoa medindo a inflação na prateleira. Mas isso também significa que você não pode simplesmente raspar um preço nacional; você tem que capturar preços por loja e por CEP, o que é um problema de direcionamento geográfico e correspondência de produtos. Este guia cobre como coletar preços de supermercado em nível de loja, corresponder produtos por UPC e construir um índice de cesta que se sustenta. É informação geral, não aconselhamento jurídico — respeite os termos de cada site.
Por que a diferença é a oportunidade
Os números fazem o caso. Quando a Consumer Reports encomendou uma comparação de cestas entre redes em seis cidades representativas dos EUA, a diferença entre a loja mais barata e a mais cara em cada cidade superou 33% — e aumentou ainda mais quando clubes de armazém e mercearias especializadas foram incluídos. Os preços dos alimentos subiram 25,5% entre dezembro de 2020 e dezembro de 2024, de acordo com dados do Bureau of Labor Statistics analisados pelo Fed de St. Louis, com o café sozinho subindo cerca de 20% ano a ano. Índices semanais que rastreiam isso são extraídos de mais de 150.000 lojas. Um conjunto de dados que captura quem é o mais barato, onde, e como isso muda semana a semana é genuinamente difícil de montar manualmente — o que o torna defensável uma vez que você o automatiza.
A localização controla o preço, então controla a solicitação
A técnica principal: para ver os preços locais de uma loja, você deve se apresentar como um comprador na área dessa loja. Na maioria dos sites de supermercado e entrega, os preços só são resolvidos uma vez que você define um CEP de entrega ou escolhe uma loja específica, e o site vincula isso à sua sessão e, muitas vezes, à localização do seu IP. Portanto, a solicitação tem duas partes móveis — a loja/CEP que você define no payload e um IP de saída que está na mesma região para que o site confie na localização. Um IP residencial na área metropolitana alvo é o que desbloqueia o preço local correto; um IP de datacenter em outro estado pode lhe dar uma visão padrão ou bloqueada.
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()

Leia o JSON de hidratação, não o preço renderizado
Os sites modernos de supermercado são fortemente renderizados no cliente e — como a maioria dos grandes aplicativos de comércio eletrônico — eles incorporam os dados do produto como JSON na página em vez de apenas pintá-los na tela. Procure um payload de hidratação (frequentemente em uma tag <script> como __NEXT_DATA__ ou um objeto de estado específico da loja) que carrega o preço, status de estoque e, crucialmente, o UPC ou GTIN. Ler esse JSON é muito mais robusto do que raspar um elemento de preço renderizado, e ele fornece o código de barras necessário para a correspondência. Nossa nota sobre por que um scraper retorna uma página vazia cobre como encontrar esses payloads quando o HTML visível parece vazio.
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",
}
Corresponda por UPC, nunca por nome
O maior erro nos dados de preços de supermercado é corresponder produtos por nome. "Cheerios Family Size", "Cheerios Family Size 18oz" e "General Mills Cheerios (Family Size)" são o mesmo item com três rótulos em três lojas — corresponder pelo nome e sua comparação é ruído. Corresponda pelo código de barras UPC/GTIN em vez disso, que é o mesmo independentemente de como cada loja intitula o produto. Toda ferramenta séria de comparação de supermercado faz isso; é o que torna uma cesta entre lojas significativa.
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()}
A partir de linhas correspondentes por código de barras, você pode construir a métrica que importa: um índice de cesta. Defina uma cesta fixa de itens comuns, precifique-a em cada loja por CEP e totalize-a — esse único número, rastreado ao longo do tempo, é o que revela as diferenças de 33% e a inflação semana a semana. Como você está executando a mesma coleta em muitos locais e lojas, a rotação por solicitação em um pool de proxy residencial impede que qualquer saída pareça anormal enquanto preserva o geo que você definiu.
Colete preços locais de supermercado em IPs geograficamente direcionados
Escalando para um conjunto de dados real
Um feed de preços de supermercado em produção é uma matriz: lojas × CEPs × produtos × tempo. Isso é um monte de solicitações, e é onde a raspagem DIY fica pesada — você está lidando com sessões geograficamente vinculadas, payloads de hidratação que mudam entre implantações e camadas anti-bot nas maiores redes. Uma Scraper API que renderiza quando necessário, rotaciona IPs geograficamente direcionados e retorna JSON limpo colapsa a maior parte disso em uma única chamada, para que você concentre seu esforço na lógica da cesta em vez da infraestrutura. Para o lado da estratégia de preços dos mesmos dados, veja nossos guias sobre monitoramento de preços de concorrentes e construção de uma camada de dados de comparação de preços.

Perguntas frequentes
Como faço para raspar preços de supermercado por localização?
Defina a loja ou CEP de entrega na solicitação (geralmente um parâmetro ou cookie) e roteie através de um proxy residencial cujo IP de saída esteja nessa região, para que o site confie na localização e retorne preços locais. Em seguida, leia o preço e o UPC do JSON de hidratação da página em vez do elemento renderizado. Repita por CEP para construir uma matriz geográfica.
Por que corresponder produtos de supermercado por UPC em vez de nome?
Porque as lojas intitulam o mesmo item de forma diferente — tamanhos, ordem de marcas e abreviações variam — então a correspondência por nome produz falsas incompatibilidades e comparações ruidosas. O código de barras UPC ou GTIN é idêntico entre os varejistas para o mesmo produto, então corresponder por ele permite alinhar os preços para o mesmo item em todas as lojas que você raspa.
Os preços de entrega de supermercado realmente diferem por CEP?
Sim. As plataformas de supermercado e entrega delimitam preços, promoções e disponibilidade para uma loja, e as lojas estão vinculadas ao seu CEP de entrega, então o mesmo produto pode mostrar preços diferentes em áreas vizinhas. A Consumer Reports encontrou diferenças de cesta acima de 33% entre as redes mais baratas e mais caras em uma única cidade, o que é por isso que a coleta específica por localização é importante.
É legal raspar preços de supermercado?
Coletar preços visíveis publicamente é comum — veículos de notícias e índices de preços fazem isso semanalmente — mas depende dos termos do site e da sua jurisdição. Fique em páginas de produtos públicas, evite dados pessoais e áreas logadas, controle o ritmo das suas solicitações e obtenha aconselhamento jurídico para uso comercial. Esta é informação geral, não aconselhamento jurídico.
Os dados de preços de supermercado vivem e morrem na localização e identidade. Defina a loja e o CEP, apresente-se a partir de um IP residencial na região, leia o JSON de hidratação e corresponda no UPC — depois totalize a cesta e acompanhe ao longo do tempo. Faça isso em lojas e CEPs suficientes e você terá um conjunto de dados que uma comparação manual nunca poderia acompanhar.
Construa seu feed de preços de supermercado com a Scraper API