# 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).