Volver al blog

Cómo raspar Instagram: perfiles, publicaciones, comentarios y más

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

30-Jun-2026

TL;DR:

  • Instagram rinde desde sus propias API JSON internas — así que llámalas directamente. La página de perfil se hidrata mediante web_profile_info; las publicaciones y comentarios provienen del endpoint GraphQL. Obtienes ese JSON desde una sesión renderizada en lugar de raspar el DOM.
  • Dos cosas hacen que las llamadas a la API funcionen: el encabezado x-ig-app-id y las cookies de la propia página. Carga instagram.com primero para que la sesión tenga cookies, luego fetch() la API desde dentro de la página con credentials: 'include' y el encabezado app-id.
  • La región y un navegador real no son opcionales. Instagram pesa fuertemente la reputación de IP y las huellas dactilares; la misma llamada que se detiene desde una salida regresa limpia desde otra. Fija proxyCountry y ejecuta en un navegador anti-detección.
  • Recibes objetos estructurados de vuelta, no HTML. web_profile_info devuelve el objeto completo user — seguidores, seguidos, conteo de publicaciones, verificación, biografía — exactamente como lo consume el front-end propio de Instagram.
  • Un patrón cubre perfiles, publicaciones y comentarios. Crea una sesión, accede al endpoint interno correspondiente, analiza el JSON. La superficie cambia; la técnica no.
  • Gratis para comenzar. Las nuevas cuentas de Scrapeless incluyen tiempo de ejecución gratuito de Scraping Browser — regístrate en app.scrapeless.com.

Introducción: raspa Instagram desde sus propias APIs

Las páginas web de Instagram son contenedores de React hidratados desde endpoints JSON internos. Raspar el DOM renderizado es la forma difícil y frágil de hacerlo — los selectores cambian y la mayoría de los datos ni siquiera están en la marca inicial. La forma fiable es llamar a los mismos endpoints que llama el front-end: web_profile_info para un perfil, la consulta GraphQL para una publicación y sus comentarios. Ellos devuelven JSON limpio y estructurado.

El detalle es que esos endpoints solo responden a una solicitud que parece haber venido de la aplicación web de Instagram. Eso significa tres cosas: la solicitud lleva el encabezado x-ig-app-id, incluye las cookies de la sesión, y se origina de una IP y huella dactilar de navegador en la que Instagram confía. Si fallas en alguna, obtendrás un cuerpo vacío o un checkpoint.

Esta guía funciona en Scrapeless Scraping Browser — Chromium anti-detección con egress residencial — conectado a Puppeteer a través de CDP. Cargas instagram.com para obtener una sesión real, luego llamas a sus APIs internas desde dentro de la página. La extracción de perfil a continuación fue capturada en vivo. Solo datos públicos.


Lo Que Puedes Hacer Con Esto

  • Obtener un perfil — seguidores, seguidos, conteo de publicaciones, verificación, biografía, enlaces externos.
  • Recuperar una sola publicación mediante shortcode con sus medios, leyenda y conteos.
  • Coleccionar los comentarios de una publicación con autor, texto y conteos de me gusta.
  • Explorar las publicaciones de un usuario buscando en el endpoint de la línea de tiempo.
  • Enriquecer perfiles a gran escala haciendo un bucle en la llamada del perfil sobre una lista de handles.

Por Qué Scrapeless Scraping Browser

Scrapeless Scraping Browser es un navegador en la nube personalizable y anti-detección diseñado para rastreadores web y agentes de IA. Para Instagram específicamente, trae:

  • Chromium desarrollado por nosotros — un navegador real que inicia la sesión y mantiene las cookies que necesitan las llamadas a la API.
  • Impresion de huellas dactilares anti-detección — la solicitud se lee como la aplicación web de Instagram, por lo que los endpoints internos responden en lugar de devolver un checkpoint.
  • Proxies residenciales en más de 195 países — fija la salida por país; la región correcta es lo que obtiene una respuesta limpia.
  • TTL de sesión configurable — mantiene la sesión activa a través de múltiples llamadas a los endpoints.
  • Una conexión estándar Puppeteer — crea una sesión con el SDK, luego puppeteer.connect() a través de CDP; el resto es Puppeteer normal.

Obtén tu clave de API en el plan gratuito en app.scrapeless.com.


Requisitos Previos

  • Node.js 18 o más reciente
  • Una cuenta de Scrapeless y clave de API — regístrate en app.scrapeless.com
  • Familiaridad básica con Puppeteer y JSON

Instalar

bash Copy
npm install @scrapeless-ai/sdk puppeteer-core
bash Copy
export SCRAPELESS_API_KEY="tu_token_api_aqui"

Paso 1 — Crea una sesión y carga Instagram

El SDK crea la sesión en la nube; Puppeteer se conecta a través de CDP. Navegar primero a instagram.com es lo que le da a la sesión las cookies que espera la API interna:

javascript Copy
import { Scrapeless } from '@scrapeless-ai/sdk';
import puppeteer from 'puppeteer-core';

const client = new Scrapeless({ apiKey: process.env.SCRAPELESS_API_KEY });

const { browserWSEndpoint } = await client.browser.create({
  proxyCountry: 'US',   // fija la salida — la región afecta si la API responde
  sessionTTL: 180,
});

const browser = await puppeteer.connect({ browserWSEndpoint });
const page = await browser.newPage();
javascript Copy
await page.goto('https://www.instagram.com/', {
  waitUntil: 'domcontentloaded',
  timeout: 60000,
});

Si una llamada se detiene o devuelve vacío, cambia proxyCountry antes de cambiar cualquier otra cosa: la región es la causa más común.


Paso 2 — Raspar un perfil de web_profile_info

Con la sesión caliente, fetch() el endpoint de perfil desde dentro de la página. Los dos detalles esenciales son el encabezado x-ig-app-id y credentials: 'include' (así las cookies de la página se envían junto):

javascript Copy
const user = await page.evaluate(async (username) => {
  const res = await fetch(
    `https://i.instagram.com/api/v1/users/web_profile_info/?username=${username}`,
    {
      headers: { 'x-ig-app-id': '936619743392459' }, // el id público de la aplicación web
      credentials: 'include',
    },
  );
  const data = JSON.parse(await res.text());
  return data.data.user;
}, 'nasa');

console.log({
  username: user.username,
  full_name: user.full_name,
  verified: user.is_verified,
  followers: user.edge_followed_by.count,
  following: user.edge_follow.count,
  posts: user.edge_owner_to_timeline_media.count,
});
// {
//   username: 'nasa',
//   full_name: 'NASA',
//   verified: true,
//   followers: 104420451,
//   following: 91,
//   posts: 4817
// }

Eso devuelve el objeto completo user de Instagram tal cual — la misma estructura que su propio front-end renderiza.

Consigue tu clave API en el plan gratuito: app.scrapeless.com


Paso 3 — Publicaciones y comentarios desde GraphQL

Las publicaciones individuales y sus comentarios provienen del endpoint GraphQL de Instagram. La estructura es la misma: fetch() desde dentro de la página — pero es un POST con el shortcode de la publicación en las variables:

javascript Copy
const shortcode = 'C1234567abc'; // de instagram.com/p/<shortcode>/

const post = await page.evaluate(async (shortcode) => {
  const variables = JSON.stringify({ shortcode });
  // doc_id identifica la consulta GraphQL persistida que la aplicación web utiliza
  const body = `variables=${encodeURIComponent(variables)}&doc_id=YOUR_DOC_ID`;
  const res = await fetch('https://www.instagram.com/graphql/query', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body,
    credentials: 'include',
  });
  return JSON.parse(await res.text());
}, shortcode);

El doc_id es el id de la consulta persistida que el front-end de Instagram envía; captura el actual desde el panel de red de una vista real de publicación. A partir de la respuesta, puedes leer el objeto de medios (xdt_shortcode_media) para el pie de foto, las URLs de medios y los bordes de comentarios.


Lo que obtienes de regreso

La llamada al perfil devuelve el objeto user de Instagram. La estructura a continuación es una captura real; los conteos cambian con el tiempo:

json Copy
{
  "username": "nasa",
  "full_name": "NASA",
  "is_verified": true,
  "is_private": false,
  "biography": "Haciendo lo que parece imposible, posible...",
  "external_url": "https://...",
  "edge_followed_by": { "count": 104420451 },
  "edge_follow": { "count": 91 },
  "edge_owner_to_timeline_media": { "count": 4817 }
}
// Captura real de web_profile_info (@nasa). El objeto de usuario completo lleva docenas de campos más; lee los que necesites.

Algunas observaciones honestas:

  • El objeto user es grande. Incluye banderas comerciales, campos de agente IA, conteos de destacados y más: lee solo los que necesitas e ignora el resto.
  • Los conteos están en edge_*.count. Seguidores, seguidos y publicaciones están anidados bajo edge_followed_by, edge_follow y edge_owner_to_timeline_media.
  • Las cuentas privadas devuelven la estructura del perfil, pero no los medios. Comprueba is_private antes de esperar publicaciones.
  • La región importa tanto como los encabezados. Establece proxyCountry; una región desafortunada es la causa usual de un cuerpo vacío.

Conclusión: llama a las APIs que Instagram ya expone

Raspar Instagram de manera limpia significa llamar a sus endpoints JSON internos desde dentro de una sesión real y caliente: web_profile_info para perfiles, GraphQL para publicaciones y comentarios, con el encabezado x-ig-app-id y las propias cookies de la página. Ejecutar Scrapeless Scraping Browser es lo que hace que esas llamadas respondan: Chromium anti-detección más egreso residencial, así que Instagram trata la solicitud como si fuera su propia aplicación web. Para el mismo patrón SDK sobre CDP en otra superficie social, consulta la guía de raspado de TikTok; la página del producto Scraping Browser y la documentación cubren toda la superficie SDK. Establece la región, calienta la sesión, envía el encabezado app-id y lee el JSON.


¿Listo para construir tu pipeline de datos impulsado por IA?

Únete a nuestra comunidad para reclamar un plan gratuito y conectar con desarrolladores que construyen pipelines de datos sociales: Discord · Telegram.

Regístrate en app.scrapeless.com para obtener tiempo de ejecución gratuito de Scraping Browser y adapta los patrones anteriores a los perfiles, publicaciones y hashtags que tu flujo de trabajo necesita. Consulta precios para escalar.


Preguntas Frecuentes

P: ¿Es legal raspar Instagram?
Recopilar datos visibles públicamente es generalmente permitido, pero se aplican los Términos de Servicio de Instagram y las reglas varían según la jurisdicción. Raspa solo datos públicos, revisa los Términos de Servicio y consulta a un abogado para tu caso de uso.

P: ¿Por qué la API de perfil devuelve un cuerpo vacío o un punto de control?
Generalmente es una de tres cosas: falta del encabezado x-ig-app-id, no hay cookies de sesión (saltaste cargar instagram.com primero) o una región de salida que Instagram desconfía. Envía el encabezado, usa credentials: 'include' y fija proxyCountry.

P: ¿Necesito iniciar sesión?
Para perfiles y publicaciones públicos, los puntos finales de la aplicación web responden a una sesión anónima pero calentada. Raspar como usuario conectado es un camino diferente y de mayor riesgo; esta guía se mantiene en datos públicos.

P: ¿De dónde proviene el doc_id para las publicaciones?
Es el id de consulta persistida que el frontend de Instagram envía a GraphQL. Lee el valor actual desde el panel de red en una vista de publicación real; cambia con el tiempo.

P: ¿Necesito un proxy?
Sí. Instagram pondera mucho la reputación de IP; fija la salida residencial con proxyCountry para que los puntos finales internos respondan.

P: ¿Cuántas solicitudes puedo hacer?
Mantén un enfoque modesto: un puñado de sesiones por región y un retraso entre llamadas, para que la señal de reputación de IP se mantenga limpia.

P: ¿Puedo ejecutar esto sin un agente de IA?
Sí. Es el SDK de Scrapeless más Puppeteer simple sobre CDP; no se requiere agente.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar