Las herramientas de comparación de precios ayudan a los compradores y revendedores a encontrar la mejor oferta entre varios minoristas. Crear uno requiere consultar múltiples plataformas, normalizar formatos de precios y clasificar los resultados por valor. La API de Scavio cubre tanto a Amazon como a Walmart con un punto final unificado, lo que facilita consultar ambas plataformas y comparar resultados en paralelo. Este tutorial crea una función de comparación que acepta el nombre de un producto, consulta ambas plataformas en paralelo y devuelve una lista ordenada de ofertas.
Requisitos previos
- Python 3.10 o superior
- solicitudes y futuros concurrentes (stdlib) disponibles
- Una clave API de Scavio
- Comprensión básica de la programación asíncrona o concurrente
Guia paso a paso
Paso 1: Consulta ambas plataformas simultáneamente
Utilice concurrent.futures.ThreadPoolExecutor para consultar Amazon y Walmart al mismo tiempo, reduciendo la latencia total.
from concurrent.futures import ThreadPoolExecutor, as_completed
def search_platform(platform: str, query: str) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query, "marketplace": "US"}
)
r.raise_for_status()
return r.json().get("products", [])
def fetch_both(query: str) -> dict:
with ThreadPoolExecutor(max_workers=2) as ex:
futures = {ex.submit(search_platform, p, query): p for p in ["amazon", "walmart"]}
return {futures[f]: f.result() for f in as_completed(futures)}Paso 2: Normalizar los precios en todas las plataformas
Ambas plataformas devuelven el precio como una cadena como "$29,99". Analícelos en flotantes para compararlos.
def normalize(product: dict, source: str) -> dict:
price_str = product.get("price", "")
price = float(price_str.replace("$", "").replace(",", "")) if price_str else None
return {"source": source, "title": product.get("title"), "price": price, "raw": price_str}Paso 3: Fusionar y ordenar resultados
Combine resultados de ambas plataformas en una lista y ordénelos por precio ascendente.
def compare(query: str) -> list[dict]:
results = fetch_both(query)
items = []
for source, products in results.items():
items.extend(normalize(p, source) for p in products[:5])
return sorted(items, key=lambda x: x["price"] or float("inf"))Paso 4: Mostrar la tabla comparativa
Imprima una tabla formateada que muestre el mejor precio del producto en ambas plataformas.
offers = compare("Sony WH-1000XM5")
print(f"{'Source':<10} {'Price':<10} {'Title'}")
for o in offers[:6]:
print(f"{o['source']:<10} {o['raw']:<10} {o['title'][:50]}")Ejemplo en Python
import os
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search(platform: str, query: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query, "marketplace": "US"})
r.raise_for_status()
return r.json().get("products", [])
def compare(query: str) -> list[dict]:
with ThreadPoolExecutor(max_workers=2) as ex:
futs = {ex.submit(search, p, query): p for p in ["amazon", "walmart"]}
all_items = []
for f in as_completed(futs):
src = futs[f]
for p in f.result()[:5]:
price_str = p.get("price", "")
price = float(price_str.replace("$", "").replace(",", "")) if price_str else None
all_items.append({"source": src, "price": price, "raw": price_str, "title": p.get("title", "")})
return sorted(all_items, key=lambda x: x["price"] or float("inf"))
if __name__ == "__main__":
for o in compare("Sony WH-1000XM5")[:6]:
print(f"{o['source']:<10} {o['raw']:<10} {o['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 searchPlatform(platform, query) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform, query, marketplace: "US" })
});
const data = await res.json();
return (data.products || []).slice(0, 5).map(p => ({ source: platform, ...p }));
}
async function compare(query) {
const [amazon, walmart] = await Promise.all([
searchPlatform("amazon", query),
searchPlatform("walmart", query)
]);
const all = [...amazon, ...walmart];
return all.sort((a, b) => {
const pa = parseFloat((a.price || "").replace(/[$,]/g, "")) || Infinity;
const pb = parseFloat((b.price || "").replace(/[$,]/g, "")) || Infinity;
return pa - pb;
});
}
compare("Sony WH-1000XM5").then(results => {
results.slice(0, 6).forEach(r => console.log(`${r.source}: ${r.price} — ${r.title?.slice(0, 50)}`));
}).catch(console.error);Salida esperada
amazon $279.00 Sony WH-1000XM5 Wireless Noise Canceling Headphones
amazon $289.99 Sony WH-1000XM5 Wireless Headphones (Midnight Black)
walmart $279.00 Sony WH1000XM5 Bluetooth Headphones
walmart $299.00 Sony WH-1000XM5 Premium Wireless Headphones