Extraiga datos de productos de Amazon y Walmart a través de una única API consultando ambas plataformas con la misma búsqueda de productos, normalizando los diferentes esquemas de respuesta en un formato unificado, comparando precios entre mercados y configurando alertas cuando las diferencias de precios superen un umbral. Ejecutar raspadores separados para cada mercado significa mantener dos bases de código, dos grupos de proxy y dos canales de análisis. Una API de búsqueda multiplataforma reduce esto a una base de código con un parámetro de plataforma.
Requisitos previos
- Python 3.8+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una lista de productos para rastrear en los mercados
Guia paso a paso
Paso 1: Definir productos a seguir
Configure la lista de productos y los mercados para consultar cada producto.
import os, requests, json, re
API_KEY = os.environ['SCAVIO_API_KEY']
PRODUCTS = [
'Sony WH-1000XM5 headphones',
'Apple AirPods Pro 2',
'Samsung Galaxy S24 Ultra case',
]
PLATFORMS = ['amazon', 'walmart']Paso 2: Consultar ambas plataformas
Busque cada producto tanto en Amazon como en Walmart a través de la API multiplataforma de Scavio.
def search_product(product: str, platform: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': platform, 'query': product}, timeout=15)
resp.raise_for_status()
return resp.json().get('organic_results', [])
def search_all_platforms(product: str) -> dict:
results = {}
for platform in PLATFORMS:
results[platform] = search_product(product, platform)
print(f'{platform}: {len(results[platform])} results for "{product[:30]}"')
return results
all_results = search_all_platforms(PRODUCTS[0])Paso 3: Normalizar el esquema
Asigne los campos de respuesta de Amazon y Walmart a un esquema común para que el código posterior no necesite una lógica específica de la plataforma.
def parse_price(price_str: str) -> float:
if not price_str:
return 0.0
cleaned = re.sub(r'[^\d.]', '', str(price_str))
try:
return float(cleaned)
except ValueError:
return 0.0
def normalize(result: dict, platform: str) -> dict:
return {
'platform': platform,
'title': result.get('title', ''),
'price': parse_price(result.get('price', '')),
'price_raw': result.get('price', ''),
'rating': result.get('rating', ''),
'url': result.get('link', ''),
'image': result.get('thumbnail', result.get('image', '')),
}
def normalize_all(results: dict) -> list:
normalized = []
for platform, items in results.items():
for item in items[:3]:
normalized.append(normalize(item, platform))
return normalized
normalized = normalize_all(all_results)
for n in normalized:
print(f"{n['platform']:<10} ${n['price']:<8} {n['title'][:50]}")Paso 4: Comparar precios entre mercados
Encuentre el mejor precio para cada producto en Amazon y Walmart.
def compare_prices(product: str) -> dict:
results = search_all_platforms(product)
normalized = normalize_all(results)
if not normalized:
return {'product': product, 'best': None}
priced = [n for n in normalized if n['price'] > 0]
if not priced:
return {'product': product, 'best': None, 'note': 'no prices found'}
best = min(priced, key=lambda x: x['price'])
worst = max(priced, key=lambda x: x['price'])
savings = worst['price'] - best['price']
return {
'product': product,
'best': {'platform': best['platform'], 'price': best['price'], 'title': best['title'][:50]},
'worst': {'platform': worst['platform'], 'price': worst['price']},
'savings': round(savings, 2),
}
comp = compare_prices(PRODUCTS[0])
print(f"Best: {comp['best']['platform']} ${comp['best']['price']} (save ${comp['savings']})")Paso 5: Alerta sobre diferencias de precios
Configure alertas cuando la diferencia de precio entre los mercados supere un umbral.
PRICE_DIFF_THRESHOLD = 10.0 # dollars
def check_alerts(products: list) -> list:
alerts = []
for product in products:
comp = compare_prices(product)
if comp.get('savings', 0) >= PRICE_DIFF_THRESHOLD:
alert = {
'product': product,
'best_platform': comp['best']['platform'],
'best_price': comp['best']['price'],
'savings': comp['savings'],
}
alerts.append(alert)
print(f'ALERT: {product} - save ${alert["savings"]} on {alert["best_platform"]}')
if not alerts:
print('No significant price differences found')
return alerts
check_alerts(PRODUCTS)Ejemplo en Python
import requests, os, re
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def compare(product):
prices = {}
for platform in ['amazon', 'walmart']:
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': platform, 'query': product}).json()
top = (data.get('organic_results', []) or [{}])[0]
price = re.sub(r'[^\d.]', '', top.get('price', '0'))
prices[platform] = float(price) if price else 0
return prices
print(compare('Sony WH-1000XM5'))Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function compare(product) {
const prices = {};
for (const platform of ['amazon', 'walmart']) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform, query: product})
});
const top = ((await r.json()).organic_results || [])[0] || {};
prices[platform] = parseFloat((top.price || '0').replace(/[^\d.]/g, '')) || 0;
}
return prices;
}
compare('Sony WH-1000XM5').then(console.log);Salida esperada
A unified pipeline that queries Amazon and Walmart for the same products, normalizes the data into a common schema, and alerts on cross-marketplace price differences.