Google Shopping agrega listados de productos de miles de comerciantes en un formato de comparación estructurado. Extraer estos datos a escala es valioso para las plataformas de inteligencia de precios, el seguimiento competitivo y el enriquecimiento del catálogo. La API de Scavio devuelve resultados de Google Shopping en el campo shopping_results con título del producto, precio, nombre del comerciante, calificación, recuento de reseñas, URL de la imagen y enlace del producto. Este tutorial crea un canal de extracción de datos estructurado que consulta Google Shopping en busca de categorías de productos y normaliza la salida para análisis.
Requisitos previos
- Python 3.8 o superior
- solicita biblioteca instalada
- Una clave API de Scavio
- Categorías de productos o productos específicos a monitorear
Guia paso a paso
Paso 1: Obtener resultados de Google Shopping
Consulta el punto final de Scavio para obtener un producto. Los resultados de compras aparecen en la matriz shopping_results de la respuesta.
def get_shopping_data(product: str) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"query": product, "country_code": "us"}
)
r.raise_for_status()
return r.json().get("shopping_results", [])Paso 2: Normalizar los datos de compras
Transforme los resultados de compras sin procesar en un esquema coherente con valores de precios analizados para su análisis.
def normalize_item(item: dict) -> dict:
price_str = item.get("price", "")
price = float(price_str.replace("$", "").replace(",", "")) if price_str else None
return {
"title": item.get("title", ""),
"price": price,
"price_raw": price_str,
"merchant": item.get("source", ""),
"rating": float(item.get("rating", 0) or 0),
"reviews": int(item.get("reviews", 0) or 0),
"link": item.get("link", ""),
"thumbnail": item.get("thumbnail", ""),
}Paso 3: Calcular estadísticas de precios
Calcule los precios mínimo, máximo, mediano y promedio de todos los comerciantes para un producto.
import statistics
def price_stats(items: list[dict]) -> dict:
prices = [i["price"] for i in items if i["price"] is not None]
if not prices:
return {"min": None, "max": None, "median": None, "mean": None}
return {
"min": min(prices),
"max": max(prices),
"median": statistics.median(prices),
"mean": round(statistics.mean(prices), 2),
}Paso 4: Exportar feed estructurado
Escriba los datos de compras normalizados en un archivo JSON adecuado para ser ingerido por herramientas de análisis o bases de datos.
import json
def export_feed(product: str, items: list[dict]) -> None:
feed = {
"product": product,
"item_count": len(items),
"stats": price_stats(items),
"items": items,
}
with open(f"shopping_{product.replace(' ', '_')}.json", "w") as f:
json.dump(feed, f, indent=2)
print(f"Exported {len(items)} items for {product}")Ejemplo en Python
import os
import json
import statistics
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def get_shopping(product: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": product, "country_code": "us"})
r.raise_for_status()
return r.json().get("shopping_results", [])
def normalize(item: dict) -> dict:
p = item.get("price", "")
return {
"title": item.get("title"), "price": float(p.replace("$", "").replace(",", "")) if p else None,
"merchant": item.get("source"), "rating": item.get("rating"), "reviews": item.get("reviews"),
}
if __name__ == "__main__":
items = [normalize(i) for i in get_shopping("mechanical keyboard")]
prices = [i["price"] for i in items if i["price"]]
print(f"Found {len(items)} listings")
if prices:
print(f"Price range: ${min(prices):.2f} - ${max(prices):.2f}")
print(f"Median: ${statistics.median(prices):.2f}")
for i in sorted(items, key=lambda x: x["price"] or float("inf"))[:5]:
print(f" {i['merchant']}: ${i['price']:.2f} - {i['title'][:50]}")Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function getShopping(product) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: product, country_code: "us" })
});
const data = await res.json();
return (data.shopping_results || []).map(i => ({
title: i.title, price: i.price ? parseFloat(i.price.replace(/[$,]/g, "")) : null,
merchant: i.source, rating: i.rating
}));
}
async function main() {
const items = await getShopping("mechanical keyboard");
const prices = items.map(i => i.price).filter(Boolean);
console.log(`${items.length} listings, $${Math.min(...prices)} - $${Math.max(...prices)}`);
items.sort((a, b) => (a.price || Infinity) - (b.price || Infinity)).slice(0, 5)
.forEach(i => console.log(` ${i.merchant}: $${i.price} - ${i.title?.slice(0, 50)}`));
}
main().catch(console.error);Salida esperada
Found 15 listings
Price range: $39.99 - $299.99
Median: $89.99
Amazon: $39.99 - Redragon K552 Mechanical Gaming Keyboard
Walmart: $49.99 - RK ROYAL KLUDGE RK61 60% Mechanical
Best Buy: $74.99 - HyperX Alloy Origins Core Mechanical