Skip to main content
Glama

💡 Nota sobre el nombre: El nombre público final de este proyecto es Reelminner. La clase del motor Python es Reelminner (ver scraper.py), la CLI/GUI y el servidor MCP están marcados como reelminner, y el repositorio de GitHub es reelminner. El nombre en clave anterior ReelSnipe se ha retirado por completo. Otras ideas de nombre se enumeran en Opciones de nombre.


📚 Tabla de contenidos


Related MCP server: Instagram Complete MCP Server

Qué es Reelminner

Reelminner es un conjunto de herramientas de código abierto que extrae datos estructurados de los Reels de Instagram y de los perfiles que los publicaron. Está construido alrededor de un único motor reutilizable (Reelminner) que se expone de cuatro formas diferentes:

Interfaz

Archivo

Ideal para

🖥️ GUI de escritorio

gui.py

Usuarios no técnicos, scraping con un clic

⌨️ CLI

scraper.py

Usuarios avanzados, trabajos por lotes, scripts

🤖 Servidor MCP

mcp_server.py

Agentes de IA / flujos de trabajo con LLM

🐍 API de Python

import scraper

Integración en tu propio código

Todo comparte la misma lógica de análisis, sesión y límite de velocidad, por lo que los resultados son idénticos sin importar qué interfaz utilices.


✨ Características

  • Análisis de reels de múltiples fuentes — Reelminner lee datos de varias capas (JSON incrustado, respuestas GraphQL y un respaldo DOM en vivo) para que siga funcionando incluso cuando Instagram cambia una de ellas.

  • Enriquecimiento del perfil del propietario — para cada reel puede obtener automáticamente el username, full_name, bio, followers, is_verified y reels_count del autor.

  • Extracción del número de seguidores — obtenido mediante la consulta GraphQL UserByRestrictedView / GraphQLOwnerInfo de Instagram, con respaldo DOM y paginación (maneja cifras de seguidores limitadas como "1.2M" desplazándose por el perfil).

  • Metadatos de música — audio del reel music_title, music_artist y music_id.

  • Métricas de interacciónviews, likes, comments y la video_url / thumbnail directa.

  • Gestión de sesión e inicio de sesión — QR/inicio de sesión interactivo, importación de cookies desde exportaciones de EditThisCookie y una renovación de sesión de 24 horas para que no tengas que volver a iniciar sesión constantemente.

  • Scraping concurrente — un grupo de hilos (--workers, por defecto 3) con retrasos corteses entre solicitudes (--delay, por defecto 2s) y retroceso adaptativo cuando Instagram devuelve BLOCKED / RATE_LIMITED.

  • Seguimiento de estado resistente — cada fila lleva un código status (OK, PARSED_PARTIAL, FAILED, NO_DATA, BLOCKED, RATE_LIMITED) para que sepas exactamente qué ha tenido éxito.

  • Múltiples formatos de exportación — CSV (por defecto), JSON y Excel (.xlsx mediante openpyxl).

  • Servidor MCP — cinco herramientas estables para que un agente de IA (Claude, Cursor, etc.) pueda hacer scraping, comprobar el estado, importar cookies, detener y exportar.

  • GUI de escritorio — tema oscuro integrado, cuadro para pegar URL, tabla de resultados en vivo, clic derecho para copiar URL / abrir reel y exportación con un clic.

  • Probado — suite de pytest + un arnés de control de calidad de extremo a extremo que aplica controles de calidad de datos.


🧠 Cómo funciona

┌────────────┐   ┌────────────┐   ┌────────────┐   ┌────────────┐
│   GUI      │   │    CLI     │   │  MCP srv   │   │  Python    │
│  gui.py    │   │ scraper.py │   │mcp_server  │   │   import   │
└─────┬──────┘   └─────┬──────┘   └─────┬──────┘   └─────┬──────┘
      └────────────────┴────────────────┴────────────────┘
                       ▼
              ┌───────────────────────┐
              │  Reelminner  │  ← the engine (scraper.py)
              │  • session / cookies   │
              │  • thread pool         │
              │  • adaptive back‑off   │
              └───────────┬───────────┘
                          ▼
              ┌───────────────────────┐
              │  parsers.py            │  ← pure extraction helpers
              │  parse_reel_page / json│
              │  parse_owner / music   │
              │  regex adapters         │
              └───────────────────────┘
  1. Normaliza la URL de entrada (normalize_reel_url) para que /reel/X/ y /reel/s/…/ funcionen ambos.

  2. Carga la sesión — aplica las cookies guardadas (sessionid, csrftoken, ds_user_id, ig_did, mid, rur) o inicia sesión.

  3. Obtiene y analiza la página del reel con un respaldo en capas:

    • parse_reel_page → JSON HTML incrustado window.__additionalData / sharedData

    • parse_reel_json → respuesta GraphQL GQL sin procesar

    • parse_graphql_reel → objeto shortcodeMedia

    • Respaldo DOM → _extract_text_raw consulta la página en vivo para obtener me gusta / comentarios / reproducciones / seguidores mediante adaptadores de expresiones regulares.

  4. Enriquece el propietario (a menos que se use --no-profiles): obtiene el perfil y lee followers, full_name, bio, is_verified, reels_count.

  5. Respeta los límites: espera delay entre solicitudes; si está bloqueado, retrocede y reintenta.

  6. Escribe filas en CSV / JSON / Excel con un status por fila.


🏗️ Arquitectura del proyecto

Reelminner es un diseño de motor único, múltiples interfaces. Un motor central (Reelminner) hace todo el trabajo real; la GUI, la CLI, el servidor MCP y la API de Python son interfaces ligeras que lo invocan. Esto mantiene el análisis, la gestión de sesión y el límite de velocidad idénticos en todos los puntos de entrada.

                         ┌─────────────────────────────┐
        URL(s) in ──────▶│     Reelminner     │  scraper.py
                         │  ── engine / orchestrator ──  │
                         └───────┬───────────┬──────────┘
                  run scrapes    │           │  enrich owner
                                 ▼           ▼
                    ┌────────────────┐  ┌──────────────────┐
                    │   parsers.py    │  │ session + graphql│
                    │ pure extractors │  │ (followers/music)│
                    └───────┬────────┘  └─────────┬────────┘
                            └─────────┬────────────┘
                                      ▼
                            ReelData row + status
                                      ▼
                       CSV / JSON / Excel writers

Responsabilidades de los módulos

Archivo

Rol

Símbolos públicos clave

scraper.py

Motor central + CLI. Gestiona el navegador, la sesión, el grupo de hilos y los escritores.

Reelminner, scrape(), login(), has_session(), save_cookies_from_file(), clear_session(), write_csv, export_json, export_excel, normalize_reel_url, csv_columns, ReelData, DEFAULT_STATE_FILE

parsers.py

Helpers de extracción pura — sin navegador, fáciles de probar unitariamente.

parse_reel_page, parse_reel_json, parse_graphql_reel, parse_owner_username_from_html, parse_music, parse_count, parse_caption, parse_graphql_followers, parse_profile_card

gui.py

Aplicación de escritorio Tkinter. Construye la ventana, el menú, el cuadro de URL, el control deslizante de workers, la tabla de resultados y los diálogos de exportación.

ReelminnerGUI, build(), scrape(), export_*, copy_url(), open_reel()

theme.py

Estilos de la GUI — aplica el tema oscuro a los widgets ttk.

apply_dark_theme(root)

mcp_server.py

Servidor MCP — expone el motor como 5 herramientas para agentes de IA a través de stdio.

mcp (FastMCP), scrape_reels, get_status, import_cookies, stop_scrape, export_results

build_exe.py

Empaquetado — compilación de un solo archivo con PyInstaller.

EXE(...), COLLECT/Analysis

run_qa.py

Arnés de control de calidad — ejecuta el motor sobre un corpus y aplica controles de calidad de datos.

run_qa(), comprobaciones de control, qa_report.json

Detalles internos del motor (Reelminner)

  • Capa de sesión_SESSION_COOKIE_NAMES (sessionid, csrftoken, ds_user_id, ig_did, mid, rur); _apply_cookies(), _refresh_if_needed() (24h), login() (QR interactivo), clear_session().

  • Concurrenciascrape() inicia un ThreadPoolExecutor(max_workers=workers); cada URL es gestionada por _worker_scrape_url, que llama a _gather_metadata (datos del reel) y opcionalmente a _gather_article (perfil del propietario). Un semáforo + _sleep() garantizan la cortesía; status_code / retcode impulsan un bucle adaptativo de reintento/retroceso cuando Instagram devuelve BLOCKED / RATE_LIMITED.

  • Canalización de análisis (respaldo en capas) — dentro de _gather_metadata el motor intenta, en orden: parse_reel_page (JSON HTML incrustado) → parse_reel_json (GraphQL GQL sin procesar) → parse_graphql_reel (shortcodeMedia) → respaldo DOM mediante los adaptadores _extract_text_html / _extract_text_raw y la lista de expresiones regulares _PATTERNS (me gusta/comentarios/reproducciones/seguidores).

  • Enriquecimiento de perfilget_follower_count() utiliza la consulta GraphQL UserByRestrictedView / GraphQLOwnerInfo de Instagram, con respaldo al DOM y paginación de seguidores (_fetch_followers con end_cursor) cuando los recuentos están limitados.

  • Salida — las filas se recopilan como diccionarios ReelData y se escriben mediante write_csv (respetando csv_columns), export_json o export_excel (necesita openpyxl).

Por qué esta estructura

  • Capacidad de prueba — todo el análisis vive en parsers.py sin dependencia del navegador, por lo que tests/test_parsers.py puede hacer afirmaciones sobre fixtures HTML/JSON guardados.

  • Una única fuente de verdad — cada interfaz comparte el mismo Reelminner, por lo que una corrección en el motor beneficia simultáneamente a la GUI, la CLI y el servidor MCP.

  • Empaquetado seguro — las interfaces ligeras de GUI/CLI significan que el EXE de PyInstaller solo incluye el motor + una UI mínima, manteniendo el binario pequeño.


📦 Instalación

Requisitos: Python 3.10+ y el motor de navegador Playwright.

# 1. Clone
git clone https://github.com/ilovekushgola/reelminner.git
cd reelminner

# 2. (Recommended) create a virtual environment
python -m venv .venv
.venv\Scripts\activate        # Windows
# source .venv/bin/activate   # macOS / Linux

# 3. Install dependencies
pip install -r requirements.txt

# 4. Install the Chromium browser for Playwright
playwright install chromium

Solo GUI: la aplicación de escritorio usa tkinter, que viene con las instalaciones estándar de Python. No se necesita ningún paquete adicional. La GUI está más pulida en Windows.

Herramientas opcionales de desarrollo/pruebas:

pip install -r requirements-dev.txt   # pytest, coverage

💡 Antes de empezar: Reelminner funciona mejor con una sesión de Instagram iniciada — algunos reels y todos los datos de propietario/seguidores requieren autenticación. Ejecuta python scraper.py --login una vez (QR interactivo), o importa las cookies exportadas desde la extensión de navegador EditThisCookie con python scraper.py --import-cookies cookies.json. Solo lee contenido público que ya tienes permitido ver.


🚀 Inicio rápido

# Scrape a single reel from the command line
python scraper.py "https://www.instagram.com/reel/CxXYZ123/"

# …or many reels from a file (one URL per line)
python scraper.py -f urls.txt -o export.csv

# Launch the desktop GUI
python gui.py

💻 Uso

1. GUI de escritorio

python gui.py
  • Haz clic en Login (opcional pero recomendado: mejora la tasa de éxito).

  • Pega una URL de reel por línea en el cuadro (o Ctrl+A para seleccionar todo).

  • Arrastra el control deslizante de Workers y luego haz clic en Scrape.

  • Observa los resultados aparecer en la tabla.

  • Clic derecho en una fila para Copiar URL o Abrir Reel.

  • Exportar a CSV / Excel / JSON, o Abrir carpeta de resultados.

Los últimos resultados se guardan automáticamente en results/_last_results.json.

2. Línea de comandos (CLI)

python scraper.py [URL ...] [options]

Indicador

Valor por defecto

Descripción

urls

Una o más URLs de reel (posicionales).

-f, --file

Archivo de texto con una URL de reel por línea.

--login

off

Abrir un navegador para iniciar sesión interactivamente (QR).

--import-cookies FILE

Importar una exportación JSON de EditThisCookie.

--clear-session

off

Eliminar el storage_state.json guardado.

--headless

off

Ejecutar el navegador sin ventana.

-w, --workers

3

Número de hilos de scraping concurrentes.

--delay

2.0

Segundos de espera entre solicitudes.

--state

storage_state.json

Ruta para la sesión guardada.

-o, --output

reels_results.csv

Ruta de salida CSV.

--no-profiles

off

Omitir la obtención automática de datos de seguidores del propietario.

# Headless, 5 workers, 1s delay, no profile enrichment
python scraper.py -f reels.txt -w 5 --delay 1 --headless --no-profiles -o out.csv

3. Servidor MCP (para agentes de IA)

Reelminner incluye un servidor MCP (Model Context Protocol) para que un cliente de IA pueda manejarlo.

python mcp_server.py            # stdio transport

Configura tu cliente MCP (el .mcp.json está incluido en el repositorio):

{
  "mcpServers": {
    "reelminner": {
      "command": "python",
      "args": ["mcp_server.py"],
      "cwd": ".",
      "env": { "RMIN_HEADLESS": "true" }
    }
  }
}

Herramientas expuestas (5, estables):

Herramienta

Firma

Propósito

scrape_reels

(urls, workers, delay, headless, with_profiles)

Ejecutar un trabajo de scraping.

get_status

()

Progreso actual / resumen del último resultado.

import_cookies

(json_path)

Cargar cookies desde un archivo EditThisCookie.

stop_scrape

()

Detener el trabajo en ejecución.

export_results

(path, fmt)

Exportar a csv / json / xlsx.

Anulaciones de entorno: RMIN_HEADLESS, RMIN_WORKERS, RMIN_DELAY, RMIN_WITH_PROFILES.

4. API de Python

from scraper import Reelminner, write_csv

scraper = Reelminner(workers=3, delay=2.0, headless=True)
rows, report = scraper.scrape(
    ["https://www.instagram.com/reel/CxXYZ123/"],
    with_profiles=True,
)
write_csv(rows, "out.csv")

for r in rows:
    print(r["username"], r["followers"], r["likes"], r["status"])

Miembros clave de Reelminner:

  • scrape(urls, with_profiles=True)(rows, report)

  • login() — inicio de sesión interactivo

  • has_session() / save_cookies_from_file(path) / clear_session()

  • write_csv(rows, path), export_json(rows, path), export_excel(rows, path)

  • normalize_reel_url(url) — helper público

  • csv_columns — la lista ordenada de campos de salida

  • DEFAULT_STATE_FILEstorage_state.json por defecto


📊 Formato de salida

Cada reel se convierte en una fila. El esquema CSV completo (scraper.csv_columns):

Columna

Descripción

idx

Índice de fila.

username

Nombre de usuario del propietario del reel (p. ej. natgeo).

followers

Número de seguidores del propietario (puede ser follower_minfollower_max).

full_name

Nombre para mostrar del propietario.

bio

Texto de la biografía del propietario.

is_verified

True / False.

reels_count

Número de reels en el perfil del propietario.

profile_url

Enlace al perfil del propietario.

reel_url

URL canónica del reel.

reel_id

Código corto / ID del reel de Instagram.

caption

Texto del pie de foto del reel.

upload_date

Marca de tiempo de la publicación.

views

Número de reproducciones / vistas.

likes

Número de me gusta.

comments

Número de comentarios.

video_url

URL directa del archivo de video.

thumbnail

URL de la imagen en miniatura.

music_title

Título de la pista de audio.

music_artist

Artista del audio.

music_id

ID de audio / música.

scrape_ts

Cuándo se raspó esta fila (marca de tiempo ISO).

status

OK · PARSED_PARTIAL · FAILED · NO_DATA · BLOCKED · RATE_LIMITED.


⚙️ Configuración

Cookies / sesión

  • Inicia sesión con python scraper.py --login (guarda storage_state.json).

  • O exporta cookies desde tu navegador mediante la extensión EditThisCookie y ejecuta python scraper.py --import-cookies cookies.json.

Variables de entorno (usadas por el servidor MCP y los valores predeterminados de la CLI)

Variable

Efecto

RMIN_HEADLESS

true/false — ejecutar el navegador en modo headless.

RMIN_WORKERS

Número de trabajadores predeterminado.

RMIN_DELAY

Retraso predeterminado entre solicitudes (segundos).

RMIN_WITH_PROFILES

true/false — enriquecer automáticamente los perfiles de los propietarios.

Se proporciona una plantilla: copia mcp.env.examplemcp.env para anular los valores predeterminados de MCP.


🗂️ Estructura del proyecto

reelminner/
├── scraper.py          # Core engine: Reelminner + CLI
├── gui.py              # Tkinter desktop application
├── parsers.py          # Pure extraction helpers (HTML/JSON/music/regex)
├── mcp_server.py       # MCP server (5 tools for AI agents)
├── theme.py            # Dark‑theme styling for the GUI
├── build_exe.py        # PyInstaller build script
├── Reelminner.spec  # PyInstaller spec (one‑file EXE)
├── run_qa.py           # End‑to‑end QA harness with data‑quality gates
├── requirements.txt    # Runtime dependencies
├── requirements-dev.txt# Dev / test dependencies
├── mcp.env.example     # MCP env template
├── .mcp.json           # MCP client configuration
├── assets/             # Icons (icon.ico)
├── docs/               # SKILL.md, E2E test/fix plan
├── skills/             # Agent skill definition
├── tests/              # pytest suite + corpus.txt
└── results/            # Scrape outputs (git‑ignored)

🧪 Pruebas y control de calidad

# Unit / integration tests
pytest -q

# End‑to‑end data‑quality run (uses your saved session)
python run_qa.py                 # full run over tests/corpus.txt
python run_qa.py --quick         # 1 URL, headless, fast iteration
python run_qa.py --url <reel>    # custom single URL
python run_qa.py --report-only   # show last qa_report.json

El entorno de control de calidad aplica umbrales como tasa de análisis, tasa de verificación, tasa de no vacío, tasa de bloqueo y tiempo máximo de ejecución, y escribe results/qa/qa_report.json + qa_results.csv.


📦 Creación de un EXE independiente

En Windows, produce un .exe portátil (los usuarios finales no necesitan Python):

pip install pyinstaller
python build_exe.py

Salida: dist/Reelminner.exe (compilación de un solo archivo mediante Reelminner.spec).


Reelminner se proporciona solo para uso educativo y autorizado/personal.

  • El scraping de Instagram puede violar sus Términos de servicio. Úsalo solo en contenido que poseas o para el que tengas permiso de acceso.

  • Respeta los límites de tasa (--delay, menos --workers) y no lo uses para spam, acoso o extracción comercial masiva.

  • Eres responsable de cómo usas esta herramienta y de cumplir con las leyes aplicables (incl. GDPR / normativas de privacidad) en tu jurisdicción.

  • Los autores no están afiliados a Instagram/Meta y no aceptan responsabilidad alguna.


🆘 Solución de problemas y preguntas frecuentes

playwright dice que el navegador no está instalado / las páginas no se abren → Asegúrate de haber ejecutado tanto pip install -r requirements.txt como playwright install chromium. Sin la descarga de Chromium, nada se iniciará.

La mayoría de los campos están vacíos, o recibo BLOCKED / RATE_LIMITED → Inicia sesión (python scraper.py --login) o importa cookies, luego reduce la velocidad: --delay 4 y menos trabajadores (-w 1). Instagram limita más el tráfico anónimo/no autenticado, por lo que una sesión autenticada es el factor de éxito más importante.

Un reel devuelve NO_DATA → La publicación puede ser privada, eliminada o bloqueada por región, o Instagram mostró un muro de inicio de sesión. Inténtalo de nuevo con una sesión iniciada.

La ventana de la GUI no se abre o las fuentes se ven mal → La GUI usa el tkinter integrado de Python. En Windows es la más pulida. En Linux/macOS instala el paquete Tk si la ventana no se inicia (p. ej. sudo apt install python3-tk).

ModuleNotFoundError al ejecutar un script → Probablemente estás fuera del repositorio o de su entorno virtual. cd a la carpeta del proyecto y activa el venv (.venv\Scripts\activate en Windows, source .venv/bin/activate en macOS/Linux) antes de ejecutar python scraper.py.

¿Cómo raspo muchos reels a la vez? → Pon una URL por línea en un archivo de texto y ejecuta python scraper.py -f urls.txt -o out.csv.

¿Puede un agente de IA usar esto? → Sí: ejecuta python mcp_server.py y apunta cualquier cliente MCP (Claude Desktop, Cursor, etc.) al .mcp.json incluido. Consulta Servidor MCP.


🤝 Contribuciones

  1. Haz un fork del repositorio y crea una rama de características.

  2. pip install -r requirements-dev.txt

  3. Añade/ajusta pruebas en tests/; ejecuta pytest y python run_qa.py --quick.

  4. Abre una solicitud de extracción (pull request) describiendo el cambio y el resultado del control de calidad.


📄 Licencia

Publicado bajo la Licencia MIT — consulta LICENSE.


🏷️ Nombre

El nombre público final del proyecto es Reelminner ("Reel miner"). Los nombres en clave internos anteriores se han retirado. Si haces un fork, puedes renombrarlo como quieras: solo actualiza el título en gui.py y este README.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ilovekushgola/reelminner'

If you have feedback or need assistance with the MCP directory API, please join our Discord server