Las aplicaciones de búsqueda de ofertas observan los precios de los productos en los minoristas y notifican a los usuarios cuando los precios bajan significativamente. Las métricas clave son el precio actual versus el precio original o histórico, expresado como porcentaje de descuento. Las respuestas de productos de Amazon y Walmart de la API de Scavio incluyen precios actuales y originales cuando están disponibles, lo que facilita calcular los descuentos sobre la marcha. Este tutorial crea un buscador de ofertas que escanea los resultados de búsqueda de productos, calcula descuentos y genera ofertas por encima de un umbral configurable.
Requisitos previos
- Python 3.8 o superior
- solicita biblioteca instalada
- Una clave API de Scavio
- Matemáticas básicas de Python y análisis de cadenas
Guia paso a paso
Paso 1: Buscar productos y extraer precios
Consulta en Amazon una categoría de producto y extrae tanto el precio actual como el precio original de cada resultado.
def extract_prices(product: dict) -> tuple[float | None, float | None]:
def parse(s):
return float(s.replace("$", "").replace(",", "")) if s else None
return parse(product.get("price")), parse(product.get("original_price"))Paso 2: Calcular porcentaje de descuento
Calcule el porcentaje de descuento del precio actual y original. Devuelve 0 si el precio original no está disponible.
def discount_pct(current: float | None, original: float | None) -> float:
if not current or not original or original <= current:
return 0.0
return round((original - current) / original * 100, 1)Paso 3: Filtrar ofertas por encima de un umbral
Escanee todos los productos y devuélvalos con un porcentaje de descuento igual o superior al umbral configurado.
def find_deals(products: list[dict], min_discount: float = 20.0) -> list[dict]:
deals = []
for p in products:
current, original = extract_prices(p)
pct = discount_pct(current, original)
if pct >= min_discount:
deals.append({**p, "discount_pct": pct})
return sorted(deals, key=lambda x: x["discount_pct"], reverse=True)Paso 4: Imprimir alertas de ofertas
Genere una alerta de oferta formateada para cada producto calificado.
def print_deals(deals: list[dict]) -> None:
if not deals:
print("No deals found above threshold")
return
for d in deals:
print(f"[{d['discount_pct']}% OFF] {d['title'][:50]}")
print(f" Now: {d.get('price')} | Was: {d.get('original_price')}")Ejemplo en Python
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_amazon(query: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"platform": "amazon", "query": query, "marketplace": "US"})
r.raise_for_status()
return r.json().get("products", [])
def parse_price(s): return float(s.replace("$", "").replace(",", "")) if s else None
def find_deals(products, min_pct=20):
deals = []
for p in products:
curr = parse_price(p.get("price"))
orig = parse_price(p.get("original_price"))
if curr and orig and orig > curr:
pct = round((orig - curr) / orig * 100, 1)
if pct >= min_pct:
deals.append({**p, "pct": pct})
return sorted(deals, key=lambda x: x["pct"], reverse=True)
if __name__ == "__main__":
products = search_amazon("bluetooth headphones")
for deal in find_deals(products):
print(f"[{deal['pct']}% off] {deal.get('title', '')[:50]} — {deal.get('price')}")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 searchAmazon(query) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "amazon", query, marketplace: "US" })
});
const data = await res.json();
return data.products || [];
}
function parsePrice(s) { return s ? parseFloat(s.replace(/[$,]/g, "")) : null; }
function findDeals(products, minPct = 20) {
return products
.map(p => ({ ...p, pct: (() => {
const curr = parsePrice(p.price), orig = parsePrice(p.original_price);
return curr && orig && orig > curr ? Math.round((orig - curr) / orig * 1000) / 10 : 0;
})() }))
.filter(p => p.pct >= minPct)
.sort((a, b) => b.pct - a.pct);
}
searchAmazon("bluetooth headphones").then(products => {
findDeals(products).forEach(d => console.log(`[${d.pct}% off] ${d.title?.slice(0, 50)} — ${d.price}`));
}).catch(console.error);Salida esperada
[45% off] Beats Studio3 Wireless Headphones
Now: $109.99 | Was: $199.99
[30% off] Sony WH-CH520 Wireless Headphones
Now: $34.99 | Was: $49.99
[25% off] JBL Tune 510BT Wireless On-Ear
Now: $29.99 | Was: $39.99