Cómo scrapear pines y tableros de Pinterest en 2026: guía para desarrolladores

Guía práctica para scrapear pines y tableros públicos de Pinterest con proxies residenciales rotativos. Cubre la Resource API interna, paginación con bookmarks, sesiones sticky y prácticas éticas.

How to Scrape Pinterest Pins and Boards in 2026: A Developer's Guide
En este artículo

Scrapear Pinterest es uno de los desafíos más interesantes para equipos que construyen datasets de tendencias visuales, investigación de moda, análisis de e-commerce o entrenamiento de modelos de visión. Pinterest alberga más de 240.000 pines públicos por minuto según estimaciones de la industria, y gran parte de ese contenido —pines, tableros y resultados de búsqueda— es accesible sin login. Sin embargo, la plataforma combina rate limits agresivos por IP, bot scoring y localización geográfica de resultados, lo que convierte cualquier scraper ingenuo en un objetivo fácil para sus sistemas anti-bot.

Antes de continuar, una advertencia obligatoria. Este artículo cubre únicamente el acceso a datos públicos, no personales de Pinterest. Debes respetar los Términos de Servicio de Pinterest y las leyes aplicables, incluyendo el CFAA en Estados Unidos y el GDPR en la Unión Europea. No extraigas datos personales identificables, no eludas autenticación para acceder a contenido privado y considera siempre la API oficial antes de construir infraestructura de scraping en producción.

Por qué scrapear Pinterest en 2026 sigue siendo un problema técnico

Pinterest es una plataforma visual con una arquitectura de renderizado híbrido. Las páginas públicas de pines y tableros se sirven con HTML inicial, pero la mayor parte del contenido dinámico —feeds, resultados de búsqueda, pines relacionados— se carga vía llamadas XHR a lo que internamente se conoce como la Resource API. Esto significa que un scraper que solo parsee HTML inicial captura apenas una fracción del contenido disponible.

El segundo obstáculo es la localización geográfica. Pinterest adapta los resultados de búsqueda y las recomendaciones según la ubicación de la IP del solicitante. Una búsqueda de "outfits de otoño" desde una IP en Madrid devuelve pines distintos a la misma búsqueda desde una IP en São Paulo. Para construir datasets representativos necesitas controlar el país de salida, algo que solo proxies con geo-targeting ofrecen de forma fiable.

El tercer factor es el bot scoring por IP. Pinterest aplica límites de frecuencia por dirección IP y puntuaciones de riesgo basadas en patrones de tráfico. Un solo datacenter IP que hace 50 requests/segundo a /resource/ recibe un bloqueo en cuestión de minutos. Las IPs residenciales rotativas distribuyen la carga entre miles de direcciones reales, reduciendo drásticamente la probabilidad de bloqueo.

Superficies públicas vs. contenido detrás de login

No todo en Pinterest es scrapeable de forma legítima. Es fundamental distinguir entre lo público y lo que requiere autenticación:

Superficie¿Pública?Método de acceso
Página de un pin individual (/pin/{id}/)HTML + Resource API
Feed de un tablero público (/{usuario}/{tablero}/)BoardFeedResource
Resultados de búsqueda (/search/pins/?q=)SearchResource
Home feed personalizadoNoRequiere login
Pines guardados de un usuarioParcialUserPinsResource (solo públicos)
Mensajes y notificacionesNoRequiere login — no scrapear

La regla práctica: si puedes ver el contenido en una ventana de incógnito sin iniciar sesión, es público. Si te redirige a un formulario de login, no es accesible legítimamente sin autenticación.

La API oficial de Pinterest v5

Pinterest ofrece una API oficial v5 orientada a anunciantes y gestores de cuentas. Permite acceder a pines, tableros y métricas de campañas con OAuth 2.0. El problema para quienes construyen datasets de investigación es que la API v5 está diseñada para gestionar tu propia cuenta, no para explorar contenido público a escala. Los endpoints de búsqueda pública son limitados y los rate limits (~1.000 requests cada 2 minutos por app en el tier estándar) son restrictivos para volúmenes altos.

Para casos de uso de producción con tu propia cuenta —gestión de pines, analítica de campañas— la API oficial es la opción correcta. Para construir datasets de tendencias visuales a partir de contenido público, el scraping de superficies públicas sigue siendo la vía más flexible, siempre dentro de los límites legales y éticos.

La Resource API interna de Pinterest

El núcleo técnico del scraping de Pinterest es entender su Resource API. Cuando navegas por un tablero o haces una búsqueda, el navegador realiza llamadas XHR a endpoints con la siguiente estructura:

GET https://www.pinterest.com/resource/BoardFeedResource/get/?source_url=%2Fusuario%2Ftablero%2F&data=%7B%22options%22%3A%7B%22board_id%22%3A%221234567890%22%2C%22page_size%22%3A25%2C%22bookmarks%22%3A%5B%22YXNkZmdoamts%3D%22%5D%7D%7D

Los componentes clave son:

  • source_url: la URL de la página que el usuario "estaría viendo", codificada en porcentaje. Por ejemplo /usuario/tablero/ o /search/pins/?q=outfits.
  • data: un objeto JSON codificado en URL que contiene options con parámetros como board_id, query, page_size y bookmarks.
  • Headers requeridos: X-Pinterest-PWS-Handler (identifica el handler del backend), X-APP-VERSION (versión del cliente web), csrftoken (token CSRF extraído de cookies), y un User-Agent realista.

Los endpoints más útiles para scraping de datos públicos son:

  • /resource/PinResource/get/ — datos de un pin individual por ID.
  • /resource/BoardFeedResource/get/ — feed paginado de pines de un tablero.
  • /resource/SearchResource/get/ — resultados de búsqueda de pines.
  • /resource/BaseSearchResource/get/ — búsqueda combinada de pines, tableros y usuarios.

Cada respuesta JSON contiene un array resource_response.data con los pines y un array bookmarks que funciona como cursor para la siguiente página.

Anti-bot, rate limits y por qué necesitas proxies residenciales rotativos

Pinterest implementa múltiples capas de protección. La primera es un rate limit por IP que, según observaciones de la comunidad de scraping, bloquea direcciones que superan aproximadamente 30-50 requests por minuto sostenidos contra endpoints /resource/. La segunda es un sistema de bot scoring que evalúa headers, timing, fingerprint del navegador TLS y consistencia geográfica. La tercera es la localización: los resultados de SearchResource varían según el país de la IP solicitante.

Un proxy datacenter típico (AWS, DigitalOcean, OVH) tiene dos problemas inmediatos: su rango de IPs está catalogado como datacenter y su ubicación geográfica suele ser fija. Pinterest marca estas IPs con una puntuación de riesgo alta, lo que resulta en respuestas vacías, redirecciones a muros de login o bloqueos HTTP 429.

Los proxies residenciales rotativos con geo-targeting resuelven ambos problemas:

  • Cada request sale desde una IP residencial real asignada por un ISP, con baja puntuación de riesgo.
  • La rotación distribuye la carga entre miles de IPs, manteniendo cada IP por debajo del rate limit.
  • El geo-targeting por país (-country-US, -country-DE) controla la localización de los resultados, esencial para datasets de tendencias regionales.

Para sesiones que requieren continuidad del csrftoken —por ejemplo, paginación profunda de un tablero con más de 500 pines— usa sesiones sticky que mantengan la misma IP durante toda la secuencia de requests.

Configuración de ProxyHat para scraping de Pinterest

ProxyHat ofrece un gateway unificado en gate.proxyhat.com con soporte para HTTP (puerto 8080) y SOCKS5 (puerto 1080). El geo-targeting y las sesiones sticky se configuran directamente en el campo de usuario:

  • Rotación por país: user-country-US:pass
  • Geo a nivel de ciudad: user-country-DE-city-berlin:pass
  • Sesión sticky: user-session-abc123:pass
  • Sesión sticky + geo: user-country-US-session-abc123:pass

Consulta la documentación oficial de ProxyHat para el listado completo de países y ciudades soportadas, y revisa nuestra página de precios para elegir el plan adecuado a tu volumen.

Ejemplo en Python: paginación de BoardFeedResource

El siguiente ejemplo extrae pines públicos de un tablero usando BoardFeedResource, rotando IPs residenciales por país y manteniendo una sesión sticky para preservar el csrftoken durante toda la paginación.

import requests
import json
from urllib.parse import quote

# ProxyHat: sesión sticky + geo US
proxy_url = "http://user-country-US-session-pinboard01:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Accept-Language": "en-US,en;q=0.9",
    "X-APP-VERSION": "c8f1a3e",
    "X-Pinterest-PWS-Handler": "boards/[username]/[board].js",
    "Referer": "https://www.pinterest.com/usuario/tablero/",
}

session = requests.Session()
session.proxies = proxies

# 1. Visitar la página del tablero para obtener cookies y csrftoken
board_page = session.get("https://www.pinterest.com/usuario/tablero/", headers=headers, timeout=30)
csrftoken = session.cookies.get("csrftoken", "")
headers["X-CSRFToken"] = csrftoken

# 2. Extraer board_id del HTML (simplificado)
import re
match = re.search(r'"board_id":"(\d+)"', board_page.text)
board_id = match.group(1) if match else "1234567890"

# 3. Paginar BoardFeedResource con bookmarks
all_pins = []
bookmarks = [None]
max_pages = 20

for page in range(max_pages):
    options = {
        "board_id": board_id,
        "page_size": 25,
        "current_page": page,
        "bookmarks": bookmarks,
    }
    data_param = json.dumps({"options": options, "context": {}})
    source_url = quote("/usuario/tablero/", safe="")
    url = (
        f"https://www.pinterest.com/resource/BoardFeedResource/get/"
        f"?source_url={source_url}&data={quote(data_param, safe='')}"
    )

    resp = session.get(url, headers=headers, timeout=30)
    if resp.status_code == 429:
        print(f"Rate limited en página {page}. Esperando 60s...")
        import time; time.sleep(60)
        continue

    payload = resp.json()
    pins = payload.get("resource_response", {}).get("data", [])
    if not pins:
        print("No hay más pines.")
        break

    for pin in pins:
        all_pins.append({
            "id": pin.get("id"),
            "title": pin.get("title", ""),
            "description": pin.get("description", ""),
            "image_url": pin.get("images", {}).get("orig", {}).get("url", ""),
            "link": pin.get("link", ""),
            "board": pin.get("board", {}).get("name", ""),
        })

    bookmarks = payload.get("resource_response", {}).get("bookmarks", [])
    if not bookmarks or bookmarks == ["end"]:
        print("Fin de paginación.")
        break

    # Pacing: 1-2 segundos entre requests
    import time; time.sleep(1.5)

print(f"Total de pines extraídos: {len(all_pins)}")

Cada pin truncado contiene los campos esenciales: id, title, image_url, link y board. Para datasets de visión por computador, image_url apunta al CDN de Pinterest y puede descargarse con una request HTTP estándar.

Ejemplo en Node.js: búsqueda de pines con SearchResource

Para equipos que trabajan en JavaScript/TypeScript, el mismo patrón funciona sobre el gateway HTTP de ProxyHat en el puerto 8080:

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent').HttpsProxyAgent;

const proxy = 'http://user-country-US-session-search01:PASSWORD@gate.proxyhat.com:8080';
const agent = new HttpsProxyAgent(proxy);

const query = 'minimalist interior design';
const sourceUrl = encodeURIComponent(`/search/pins/?q=${encodeURIComponent(query)}`);

const dataParam = encodeURIComponent(JSON.stringify({
  options: { query, page_size: 25, bookmarks: [] },
  context: {}
}));

const url = `https://www.pinterest.com/resource/SearchResource/get/?source_url=${sourceUrl}&data=${dataParam}`;

const headers = {
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
  'Accept': 'application/json, text/javascript, */*; q=0.01',
  'X-APP-VERSION': 'c8f1a3e',
  'X-Pinterest-PWS-Handler': 'search/[query].js',
  'Referer': 'https://www.pinterest.com/search/pins/?q=minimalist%20interior%20design',
};

async function scrapeSearch() {
  const resp = await axios.get(url, { headers, httpsAgent: agent, timeout: 30000 });
  const pins = resp.data.resource_response?.data || [];
  const bookmarks = resp.data.resource_response?.bookmarks || [];

  const truncated = pins.map(p => ({
    id: p.id,
    title: p.title || '',
    image_url: p.images?.orig?.url || '',
    link: p.link || '',
  }));

  console.log(`Pines encontrados: ${truncated.length}`);
  console.log('Bookmarks para siguiente página:', bookmarks);
  return truncated;
}

scrapeSearch().catch(console.error);

Paginación con bookmarks, sesiones sticky y pacing

La paginación de la Resource API usa bookmarks como cursor opaco. Cada respuesta incluye un array bookmarks que debes pasar intacto en la siguiente request dentro de options.bookmarks. Cuando el array está vacío o contiene ["end"], has llegado al final del feed.

Sticky sessions para continuidad de csrftoken

El csrftoken se emite por IP y se valida en cada request a /resource/. Si rotas de IP entre requests dentro de la misma sesión de paginación, Pinterest invalida el token y devuelve un error 403. La solución es usar una sesión sticky que mantenga la misma IP residencial durante toda la secuencia:

# Misma IP durante toda la paginación
proxy_url = "http://user-country-US-session-board-abc123:PASSWORD@gate.proxyhat.com:8080"

Cambia el identificador de sesión (board-abc123) para cada tablero o búsqueda distinta, distribuyendo así la carga entre múltiples IPs residenciales.

Pacing y user-agent hygiene

El bot scoring de Pinterest evalúa el patrón temporal de requests. Requests perfectamente espaciados cada 1.000ms son tan sospechosos como ráfagas de 50 requests/segundo. Aplica jitter aleatorio entre 1.5 y 4 segundos entre requests:

import random, time
time.sleep(random.uniform(1.5, 4.0))

En cuanto al User-Agent, usa uno realista y consistente durante toda la sesión. No rotes User-Agents entre requests: eso es una señal de fingerprinting inmediata. Combina un UA de navegador actual con headers Accept, Accept-Language y sec-ch-ua coherentes. Evita librerías de scraping que dejan huellas TLS detectables (como cabeceras en orden no estándar).

Errores comunes y casos límite

  • Respuestas vacías sin error: Pinterest a veces devuelve resource_response.data = [] sin código de error cuando detecta comportamiento sospechoso. Si recibes tres páginas vacías seguidas, rota de sesión sticky y cambia de IP.
  • X-APP-VERSION obsoleto: la versión del cliente web cambia con cada deploy de Pinterest. Un valor de hace 3 meses genera respuestas degradadas. Extrae el valor actual del HTML de cualquier página pública antes de iniciar tu sesión de scraping.
  • Bookmarks corruptos: si codificas mal el JSON dentro del parámetro data, la API devuelve un error genérico. Usa siempre json.dumps() + urllib.parse.quote() y nunca construyas el JSON a mano.
  • Rate limit 429: si lo recibes, no reintentes inmediatamente. Espera 60-90 segundos, rota de IP y reduce tu pacing. Reintentos agresivos agravan el bloqueo.
  • Redirección a login: significa que la IP actual está marcada. Rota a una nueva IP residencial y reinicia la sesión con un nuevo csrftoken.

Scraping ético y cuándo usar la API oficial

El scraping de Pinterest, como cualquier scraping web, opera en un espacio donde lo técnico, lo legal y lo ético se solapan. Algunas directrices concretas:

  • Solo datos públicos y no personales: extrae metadatos de pines (título, descripción, imagen, enlace, tablero). No extraigas perfiles de usuarios, datos demográficos ni información personal identificable.
  • Respeta robots.txt: revisa https://www.pinterest.com/robots.txt antes de diseñar tu crawler y honra las directivas de disallow.
  • Pacing razonable: mantén una tasa de requests que no degrade la experiencia de otros usuarios. 1-3 requests por segundo por IP es un rango respetuoso.
  • Identifica tu bot cuando proceda: en algunos contextos, un User-Agent descriptivo (como ResearchBot/1.0 (+contact@example.com)) es más transparente que imitar un navegador real. Evalúa el trade-off entre transparencia y evasión de bot scoring según tu caso de uso.
  • Prefer la API oficial para producción: si tu caso de uso es gestionar tu propia cuenta de Pinterest, programar pines o analizar métricas de campañas, la API v5 oficial es la opción correcta, estable y soportada. El scraping debe reservarse para investigación de contenido público a escala, no para operaciones comerciales sobre tu propia cuenta.

Para más contexto sobre los marcos legales, consulta la guía de la GDPR para datos personales en la UE y la documentación del Department of Justice sobre el CFAA.

Puntos clave

  • Pinterest sirve contenido dinámico vía su Resource API interna (/resource/*/get/), no solo vía HTML inicial.
  • Los endpoints clave son PinResource, BoardFeedResource y SearchResource, con parámetros source_url y data codificados.
  • Los resultados de búsqueda y recomendaciones están localizados por IP, lo que requiere proxies residenciales con geo-targeting.
  • Usa sesiones sticky (-session-) para mantener la continuidad del csrftoken durante la paginación con bookmarks.
  • Aplica jitter aleatorio entre 1.5 y 4 segundos y mantén un User-Agent consistente para reducir el riesgo de fingerprinting.
  • Solo extrae datos públicos y no personales; respeta robots.txt y considera la API v5 oficial para producción.

Si necesitas proxies residenciales rotativos con geo-targeting para tu próximo proyecto de scraping de Pinterest, explora los planes de ProxyHat y nuestra lista de ubicaciones disponibles. Para más guías técnicas, visita nuestros casos de uso de web scraping y SERP tracking.

Preguntas frecuentes

¿Qué es scrapear Pinterest y cómo funciona en 2026?

Scrapear Pinterest consiste en extraer datos públicos de pines, tableros y resultados de búsqueda de forma automatizada. En 2026, la mayor parte del contenido dinámico se carga vía la Resource API interna de Pinterest (endpoints /resource/*/get/), que requiere parámetros codificados como source_url y data, además de headers específicos como X-APP-VERSION y csrftoken. Un scraper bien configurado pagina estos endpoints usando bookmarks como cursor.

¿Por qué importa scrapear Pinterest para usuarios de proxies?

Pinterest localiza resultados de búsqueda y recomendaciones según la IP del solicitante y aplica rate limits y bot scoring por dirección IP. Sin proxies residenciales rotativos con geo-targeting, un scraper recibe bloqueos 429 o respuestas vacías en minutos. Los proxies permiten distribuir la carga entre miles de IPs reales y controlar el país de salida para construir datasets de tendencias regionales representativos.

¿Qué tipo de proxy funciona mejor para scrapear Pinterest?

Los proxies residenciales rotativos con geo-targeting son la opción óptima. Las IPs datacenter tienen una puntuación de riesgo alta en Pinterest y se bloquean rápidamente. Los proxies residenciales salen desde IPs reales de ISP con baja puntuación de riesgo. Para paginación profunda que requiere continuidad del csrftoken, usa sesiones sticky que mantengan la misma IP durante toda la secuencia de requests, cambiando de sesión para cada tablero o búsqueda distinta.

¿Cómo evitas bloqueos al scrapear Pinterest?

Para evitar bloqueos al scrapear Pinterest, usa proxies residenciales rotativos con geo-targeting, aplica pacing con jitter aleatorio entre 1.5 y 4 segundos entre requests, mantén un User-Agent consistente durante toda la sesión (no rotes UAs), extrae el X-APP-VERSION actual del HTML antes de iniciar, usa sesiones sticky para preservar el csrftoken durante la paginación, y maneja los códigos 429 esperando 60-90 segundos antes de rotar de IP.

¿Listo para empezar?

Accede a más de 50M de IPs residenciales en más de 148 países con filtrado impulsado por IA.

Ver preciosProxies residenciales
← Volver al Blog