e1e9bb7499
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
3.4 KiB
Markdown
55 lines
3.4 KiB
Markdown
# market-intel
|
|
|
|
Inteligencia de mercado para captación de clientes: scrapers de señales de demanda y
|
|
tendencias de productos/nichos desde varias fuentes públicas, más vigilancia de precios de
|
|
la competencia, aterrizados en Postgres y analizados con Metabase. Scheduling con
|
|
`dag_engine`. Origen: proyecto `captacion_clientes`.
|
|
|
|
## Funciones
|
|
|
|
| ID | Firma corta | Qué hace |
|
|
|---|---|---|
|
|
| `scrape_amazon_bestsellers_py_datascience` | `(marketplace, categories, list_type, max_items)` | Amazon Best Sellers + Movers & Shakers (ranking real de demanda). HTTP, funciona. |
|
|
| `scrape_google_trends_py_datascience` | `(keywords, geo, timeframe, include_related)` | Interés de búsqueda (0-100) + rising/top via pytrends. Backoff ante 429. |
|
|
| `scrape_tiktok_creative_py_datascience` | `(country, kind, limit, period)` | TikTok Creative Center (hashtags/songs/creators). **Bloqueado por anti-bot vía HTTP**; pendiente browser CDP. |
|
|
| `scrape_aliexpress_trending_py_datascience` | `(query, category, limit, ship_to)` | Productos populares AliExpress (orders/rating). **Bloqueado por captcha vía HTTP**; pendiente browser CDP. |
|
|
| `scrape_competitor_prices_py_datascience` | `(targets) -> list[dict]` | Precio actual de una lista de URLs de competidores (cascada: selector → JSON-LD → meta → heurística). |
|
|
| `pg_insert_rows_py_infra` | `(dsn, table, rows, add_snapshot_date=True)` | Insert append-only por lote en Postgres (execute_values parametrizado, añade snapshot_date). |
|
|
| `pg_apply_sql_py_infra` | `(dsn, sql_path) -> int` | Aplica un `.sql` de migración a Postgres (idempotente con IF NOT EXISTS). |
|
|
| `ingest_market_trends_py_pipelines` | `(source)` | Dispatcher: scrapea una fuente y la aterriza en su tabla. Lo invoca `dag_engine`. |
|
|
|
|
## Ejemplo canónico (end-to-end)
|
|
|
|
```bash
|
|
# 1. (una vez) Stack Metabase + Postgres en Docker
|
|
fn run init_metabase_go_infra --project captacion --metabase-port 3030 --pg-port 5433 \
|
|
--pg-user captacion --pg-password "$(pass show captacion/postgres | head -1)"
|
|
docker exec captacion-postgres psql -U captacion -d metabase -c "CREATE DATABASE trends OWNER captacion"
|
|
|
|
# 2. (una vez) Aplicar el schema
|
|
python3 -c "import sys; sys.path.insert(0,'python/functions'); from infra import pg_apply_sql; \
|
|
pg_apply_sql('postgresql://captacion:PW@localhost:5433/trends', 'projects/captacion_clientes/db/migrations/001_schema.sql')"
|
|
|
|
# 3. Ingesta una fuente (manual o vía dag_engine)
|
|
fn run ingest_market_trends_py_pipelines amazon
|
|
fn run ingest_market_trends_py_pipelines google_trends
|
|
|
|
# 4. dag_engine lo hace solo: dags market-intel-daily (06:30) y competitor-prices-hourly
|
|
```
|
|
|
|
## Fronteras
|
|
|
|
- NO hace explotación ni bypass agresivo de anti-bot: TikTok/AliExpress por HTTP-directo
|
|
caen desde datacenter; la vía robusta es el browser MCP/CDP (grupo `navegator`/`web-proxy`,
|
|
doctrina `flow_replay.md`), aún no implementada para estas dos fuentes.
|
|
- NO es un grupo de visualización: el análisis vive en Metabase (grupo `metabase`).
|
|
- NO gestiona el scheduling: eso es `dag_engine` (grupo `scheduler`).
|
|
- El DSN de Postgres y credenciales NO se hardcodean: van en `pass`/`.env` del proyecto.
|
|
|
|
## Notas
|
|
|
|
- Las tablas de `trends` son append-only particionadas por `snapshot_date` — pensadas para
|
|
series temporales en Metabase (qué tendencia sube/baja). No correr en bucle apretado.
|
|
- `competitor_prices` se nutre de la tabla `competitor_targets` (el usuario inserta los
|
|
objetivos a vigilar: competidor + product_key + URL).
|