e1e9bb7499
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.8 KiB
4.8 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, params, output
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | params | output | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| scrape_amazon_bestsellers | function | py | datascience | 1.0.0 | impure | def scrape_amazon_bestsellers(marketplace: str = 'amazon.es', categories: list[str] | None = None, list_type: str = 'bestsellers', max_items: int = 50) -> list[dict] | Scrapea los rankings de Amazon (Best Sellers y Movers & Shakers) de un marketplace para captar señales de demanda de productos: rank, ASIN, titulo, precio, rating, reseñas y, en movers, el cambio porcentual. |
|
false | error_go_core |
|
false | python/functions/datascience/scrape_amazon_bestsellers.py |
|
Lista de dicts, uno por producto, con exactamente estas claves: marketplace, list_type, category, rank, asin, title, price, currency, rating, reviews, pct_change, url. None donde no haya dato. price/rating/pct_change son float; rank/reviews son int. pct_change solo se rellena en movers_shakers. Casa 1:1 con la tabla Postgres amazon_bestsellers (el ingest añade id/snapshot_date/scraped_at). |
Ejemplo
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from datascience.scrape_amazon_bestsellers import scrape_amazon_bestsellers
# Best Sellers de electronica y videojuegos en Amazon.es
rows = scrape_amazon_bestsellers(
marketplace="amazon.es",
categories=["electronics", "videogames"],
list_type="bestsellers",
max_items=50,
)
print(len(rows), "items")
print(rows[0])
# {'marketplace': 'amazon.es', 'list_type': 'bestsellers', 'category': 'electronics',
# 'rank': 1, 'asin': 'B0...', 'title': '...', 'price': 29.99, 'currency': 'EUR',
# 'rating': 4.5, 'reviews': 1234, 'pct_change': None, 'url': 'https://www.amazon.es/dp/B0...'}
# Movers & Shakers (productos que mas suben) — incluye pct_change
movers = scrape_amazon_bestsellers(
marketplace="amazon.com",
list_type="movers_shakers",
max_items=30,
)
Cuando usarla
Usala cuando necesites captar señales de demanda de mercado desde Amazon: que se esta vendiendo mas (Best Sellers) o que esta subiendo de golpe en ventas (Movers & Shakers), por marketplace y categoria. Util como fuente de un pipeline de market intelligence / trend detection que luego ingesta a la tabla amazon_bestsellers y cruza snapshots diarios para detectar productos al alza. Llamala antes de cualquier analisis de tendencias de catalogo; el dict devuelto esta listo para insertar tras añadir snapshot_date/scraped_at.
Gotchas
- Anti-bot fuerte: Amazon detecta scraping HTTP puro y puede devolver captcha,
503o429. La funcion detecta el bloqueo (status 429/503 o markers de captcha en el HTML) y, tras agotar reintentos, lanzaRuntimeErrorcon el status. Si HTTP puro falla repetidamente, la alternativa es el navegador del ecosistema (browser MCP / CDP) sobre una pestaña real de Chrome, que pasa el anti-bot mejor querequests. - HTML fragil: Amazon cambia las plantillas del DOM con frecuencia y sirve varias a la vez segun A/B test. Los selectores estan escritos defensivamente (varios fallbacks por campo) pero pueden necesitar mantenimiento cuando Amazon rota plantillas. Si un campo no aparece en ninguna plantilla conocida, se devuelve
Noneen vez de petar. - Campos opcionales = None: no todos los items traen precio/rating/reviews/pct_change.
pct_changesolo se rellena enlist_type="movers_shakers"; en bestsellers siempre esNone. - rank fallback posicional: si Amazon no renderiza el badge de rank, se usa la posición (1-indexada) del item en la pagina como rank.
- Una peticion por categoria: cada slug en
categoriesdispara una peticion HTTP independiente (con 2 reintentos + backoff). Listas largas de categorias multiplican el riesgo de throttling — espacia las llamadas si scrapeas muchas. - Moneda best-effort:
currencyse infiere del simbolo en el precio (€,, £, R) y, si no hay simbolo reconocible, del TLD del marketplace. Puede serNonesi no se pudo determinar.