Monitorear los ASIN de Amazon diariamente para detectar cambios de precios, cambios de calificación y disponibilidad de existencias es esencial para la inteligencia del comercio electrónico. Las soluciones basadas en scraper requieren un mantenimiento constante a medida que Amazon cambia el diseño de las páginas y refuerza la detección de bots. Este tutorial crea un canal de monitoreo estable utilizando la API de Scavio que verifica una lista de ASIN de manera programada, almacena datos históricos, detecta cambios significativos y envía alertas. Cada cheque de ASIN cuesta $0,005 sin gastos generales de mantenimiento.
Requisitos previos
- Python 3.9+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una lista de ASIN para monitorear
Guia paso a paso
Paso 1: Definir la lista de seguimiento y almacenamiento de ASIN
Configure la lista de ASIN para monitorear y un sistema de almacenamiento basado en JSON para el seguimiento histórico.
import os, requests, json, time
from datetime import datetime
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
URL = 'https://api.scavio.dev/api/v1/search'
WATCHLIST = ['B09G9FPHY6', 'B07FZ8S74R', 'B08N5WRWNW', 'B0BSHF7WHW']
HISTORY_FILE = 'asin_history.json'
def load_history() -> dict:
if os.path.exists(HISTORY_FILE):
with open(HISTORY_FILE) as f:
return json.load(f)
return {}
def save_history(history: dict):
with open(HISTORY_FILE, 'w') as f:
json.dump(history, f, indent=2)Paso 2: Obtener datos de producto actuales para cada ASIN
Consulta la API de Scavio para cada ASIN y extrae el precio, la calificación, el recuento de reseñas y la disponibilidad.
def fetch_asin(asin: str) -> dict:
resp = requests.post(URL, headers=H,
json={'platform': 'amazon', 'query': asin, 'marketplace': 'US'})
resp.raise_for_status()
data = resp.json()
product = data.get('product', data)
price_str = product.get('price', '')
price = None
if price_str:
price = float(price_str.replace('$', '').replace(',', ''))
return {
'asin': asin,
'title': product.get('title', ''),
'price': price,
'rating': product.get('rating', ''),
'reviews': product.get('reviews_count', 0),
'availability': product.get('availability', ''),
'timestamp': datetime.now().isoformat(),
}
for asin in WATCHLIST[:2]:
data = fetch_asin(asin)
print(f'{asin}: ${data["price"]} | {data["rating"]} stars | {data["title"][:40]}')
time.sleep(0.3)Paso 3: Detectar cambios y generar alertas
Compare los datos actuales con instantáneas anteriores para detectar caídas de precios, cambios de calificación y problemas de acciones.
def check_changes(asin: str, current: dict, history: dict) -> list:
alerts = []
prev_records = history.get(asin, [])
if not prev_records:
return alerts
prev = prev_records[-1]
# Price change
if current['price'] and prev.get('price'):
pct_change = (current['price'] - prev['price']) / prev['price'] * 100
if abs(pct_change) > 5:
direction = 'dropped' if pct_change < 0 else 'increased'
alerts.append(f'PRICE {direction} {abs(pct_change):.1f}%: ${prev["price"]} -> ${current["price"]}')
# Rating change
if current['rating'] and prev.get('rating') and current['rating'] != prev['rating']:
alerts.append(f'RATING changed: {prev["rating"]} -> {current["rating"]}')
# Stock status
if 'out of stock' in (current.get('availability', '') or '').lower():
alerts.append('OUT OF STOCK')
return alerts
def run_monitoring():
history = load_history()
for asin in WATCHLIST:
current = fetch_asin(asin)
alerts = check_changes(asin, current, history)
if asin not in history:
history[asin] = []
history[asin].append(current)
status = f'[ALERT] {", ".join(alerts)}' if alerts else '[OK]'
print(f'{status} {asin}: ${current["price"]} | {current["title"][:35]}')
time.sleep(0.3)
save_history(history)
print(f'\nMonitored {len(WATCHLIST)} ASINs | Cost: ${len(WATCHLIST) * 0.005:.3f}')
run_monitoring()Ejemplo en Python
import os, requests, json, time
from datetime import datetime
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def monitor_asins(asins):
for asin in asins:
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'amazon', 'query': asin, 'marketplace': 'US'})
p = resp.json().get('product', resp.json())
print(f'{asin}: {p.get("price", "N/A")} | {p.get("rating", "N/A")} | {p.get("title", "")[:40]}')
time.sleep(0.3)
print(f'Cost: ${len(asins) * 0.005:.3f}')
monitor_asins(['B09G9FPHY6', 'B07FZ8S74R'])Ejemplo en JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function monitorAsins(asins) {
for (const asin of asins) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'amazon', query: asin, marketplace: 'US' })
});
const p = (await resp.json()).product || {};
console.log(`${asin}: ${p.price || 'N/A'} | ${p.rating || 'N/A'} | ${(p.title || '').slice(0, 40)}`);
}
console.log(`Cost: $${(asins.length * 0.005).toFixed(3)}`);
}
monitorAsins(['B09G9FPHY6', 'B07FZ8S74R']);Salida esperada
[OK] B09G9FPHY6: $29.99 | Echo Dot (5th Gen) | Smart speake
[ALERT] PRICE dropped 12.3%: $28.49 -> $24.99 B07FZ8S74R: $24.99 | Fire TV Stick 4K with Alexa
[OK] B08N5WRWNW: $89.99 | Kindle Paperwhite (11th Generatio
[OK] B0BSHF7WHW: $39.99 | Fire TV Stick 4K Max (2nd Gen)
Monitored 4 ASINs | Cost: $0.020