Aviso legal: Este guia trata apenas de acesso a dados públicos no Pinterest. Antes de raspar qualquer plataforma, leia e respeite os Termos de Serviço dela. Nos EUA, o Computer Fraud and Abuse Act (CFAA) pode aplicar-se a acessos não autorizados; na UE, o GDPR rege o tratamento de dados pessoais. Consulte fontes oficiais como a FTC e a Comissão Europeia. Quando existir uma API oficial adequada ao seu caso de uso, prefira-a.
Desenvolvedores que constroem datasets de conteúdo visual e tendências frequentemente precisam coletar pins e boards do Pinterest em escala. Neste artigo explicamos como raspar Pinterest em 2026 — focando em superfícies públicas, na Resource API interna da plataforma, armadilhas anti-bot e estratégias de proxy residencial com geo-targeting. Se você quer um Pinterest scraper robusto e production-ready, este guia cobre o caminho completo.
O que você pode e não pode raspar do Pinterest
O Pinterest expõe diferentes superfícies com níveis distintos de acessibilidade:
- Pins públicos — qualquer pin em board público é acessível via URL
pinterest.com/pin/{id}/sem login. Contém título, descrição, imagem, link de destino e metadados do board. - Feeds de boards públicos — a lista de pins de um board público pode ser paginada via Resource API interna.
- Resultados de busca — buscas públicas retornam pins, boards e anúncios relevantes sem login, mas o conteúdo é localizado por país.
- Home feed personalizado — requer login e é gerado por algoritmo de recomendação. Não é superfície pública.
- Perfis e boards privados — login-walled; raspar esses dados viola ToS e potencialmente o GDPR.
Para produção, a Pinterest API v5 oficial oferece endpoints para pins, boards e métricas de contas autenticadas, com rate limits documentados. É a escolha correta quando você precisa de dados da sua própria conta ou de parceiros autorizados. Para datasets de tendências públicas em larga escala, a API v5 é limitada porque não expõe busca pública nem feeds de boards de terceiros.
Contexto técnico: a Resource API interna do Pinterest
O frontend do Pinterest é uma SPA que carrega dados via uma API interna chamada Resource API. Os endpoints seguem o padrão /resource/{NomeDoResource}/get/ e aceitam parâmetros via query string. Os principais recursos para scraping público são:
| Resource | Uso | Paginação |
|---|---|---|
PinResource | Dados de um pin único por ID | Single object |
BoardFeedResource | Lista de pins de um board | bookmark cursor |
SearchResource | Busca pública por keyword | bookmark cursor |
BoardResource | Metadados de um board | Single object |
As chamadas usam dois parâmetros principais na URL:
source_url— a URL amigável que representa a página (ex.:/board/usuario/nome-do-board/).data— um JSON URL-encoded contendo opções comoboard_id,page_sizeebookmark.
Headers relevantes que o frontend envia e que melhoram a taxa de sucesso:
X-Pinterest-PWS-Handler— identificador do handler do lado do servidor.X-APP-VERSION— versão do bundle do frontend; atualiza frequentemente.csrftoken— token CSRF obtido do cookie inicial.User-Agent— navegador real e atualizado.
Um exemplo de requisição para BoardFeedResource:
GET /resource/BoardFeedResource/get/?source_url=%2Fboard%2Fusuario%2Fboard%2F&data=%7B%22board_id%22%3A%22123456789%22%2C%22page_size%22%3A25%2C%22bookmarks%22%3A%5B%22YXJyYXko...%22%5D%7D HTTP/1.1
Host: www.pinterest.com
X-Pinterest-PWS-Handler: www/[username]/[board].js
X-APP-VERSION: 7e1c1c8
csrftoken: abc123def456
Realidade anti-bot: rate limits e bot scoring
O Pinterest aplica rate limits por IP e heurísticas de bot scoring. Sinais que elevam o risco de bloqueio incluem:
- Muitas requisições do mesmo IP em janelas curtas — tipicamente centenas por minuto.
- Ausência de cookies de sessão e tokens CSRF consistentes.
- User-Agens desatualizados ou incompatíveis com headers aceitos.
- Padrões de navegação não-humanos (sem requisições de assets CSS/JS).
Como busca e recomendações do Pinterest são localizadas por país, raspar de um IP fora do mercado-alvo pode retornar resultados enviesados. Por isso, proxies residenciais rotativos com geo-targeting são essenciais. Com ProxyHat, você força o país no username:
http://user-country-US:pass@gate.proxyhat.com:8080
Para manter a continuidade de csrftoken ao paginar, use sessões sticky com flag -session-:
http://user-country-US-session-pinterest-01:pass@gate.proxyhat.com:8080
Isso preserva o mesmo IP de saída durante a sessão, evitando trocas abruptas que invalidam cookies. Saiba mais sobre localizações disponíveis na página de locations.
Exemplo 1: Python com requests e ProxyHat
Este snippet pagina BoardFeedResource via HTTP gateway da ProxyHat, extraindo campos truncados de cada pin:
import requests
import json
from urllib.parse import quote
PROXY = "http://user-country-US-session-pin01:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": PROXY, "https": PROXY}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "en-US,en;q=0.9",
"X-Pinterest-PWS-Handler": "www/[username]/[board].js",
"X-APP-VERSION": "7e1c1c8",
"X-Requested-With": "XMLHttpRequest",
}
board_slug = "username/board-name"
board_id = "123456789"
source_url = f"/board/{board_slug}/"
def fetch_page(bookmark=None):
data = {
"board_id": board_id,
"page_size": 25,
"bookmarks": [bookmark] if bookmark else [],
}
params = {
"source_url": source_url,
"data": json.dumps(data, separators=(",", ":")),
}
url = "https://www.pinterest.com/resource/BoardFeedResource/get/"
r = requests.get(url, headers=headers, params=params, proxies=proxies, timeout=30)
r.raise_for_status()
payload = r.json()
return payload.get("resource_response", {}).get("data", []), payload.get("resource_response", {}).get("bookmark")
all_pins = []
bookmark = None
for page in range(5):
pins, bookmark = fetch_page(bookmark)
for pin in pins:
image = pin.get("images", {}).get("orig", {})
all_pins.append({
"id": pin.get("id"),
"title": pin.get("title") or pin.get("grid_title"),
"image_url": image.get("url"),
"link": pin.get("link"),
})
if not bookmark:
break
print(json.dumps(all_pins[:3], indent=2))
Resultado truncado esperado:
[
{
"id": "9876543210",
"title": "Minimalist living room ideas",
"image_url": "https://i.pinimg.com/originals/aa/bb/cc/...jpg",
"link": "https://example.com/blog/minimalist-living-room"
}
]
Para casos de uso de web scraping em escala, veja nossa página de use cases.
Exemplo 2: Node.js com axios via HTTP gateway
const axios = require("axios");
const PROXY = "http://user-country-US-session-pin02:PASSWORD@gate.proxyhat.com:8080";
const headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
+ "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Pinterest-PWS-Handler": "www/[username]/[board].js",
"X-APP-VERSION": "7e1c1c8",
"X-Requested-With": "XMLHttpRequest",
};
async function fetchBoardFeed(boardId, bookmark) {
const data = JSON.stringify({
board_id: boardId,
page_size: 25,
bookmarks: bookmark ? [bookmark] : [],
});
const params = new URLSearchParams({
source_url: "/board/username/board-name/",
data,
});
const res = await axios.get(
"https://www.pinterest.com/resource/BoardFeedResource/get/",
{ headers, params, proxy: { host: "gate.proxyhat.com", port: 8080, auth: { username: "user-country-US-session-pin02", password: "PASSWORD" } }, timeout: 30000 }
);
return res.data.resource_response;
}
(async () => {
let bookmark = null;
for (let i = 0; i < 5; i++) {
const resp = await fetchBoardFeed("123456789", bookmark);
for (const pin of resp.data || []) {
const img = (pin.images && pin.images.orig) || {};
console.log({
id: pin.id,
title: pin.title || pin.grid_title,
image_url: img.url,
link: pin.link,
});
}
bookmark = resp.bookmark;
if (!bookmark) break;
}
})();
Paginação por bookmark, pacing e higiene de fingerprint
A Resource API do Pinterest usa cursor bookmark em vez de offset. Cada resposta inclui um novo bookmark que deve ser enviado na próxima requisição. Boas práticas:
- Sticky session por board — mantenha o mesmo IP durante toda a paginação de um board para preservar
csrftokene cookies. - Pacing — espere 1–3 segundos entre páginas; 25 pins por página é o tamanho padrão.
- User-Agent consistente — use um UA moderno e mantenha-o durante toda a sessão.
- Headers aceitos — inclua
Accept-Languagecompatível com o geo do proxy. - Rotatividade entre boards — troque de sessão (e portanto de IP) ao mudar de board.
Dica: se você raspar mais de ~200 requisições por minuto de um único IP, o bot scoring do Pinterest dispara. Distribua o trabalho entre sessões residenciais rotativas.
Comparação: API oficial vs scraping público
| Aspecto | Pinterest API v5 | Scraping público com proxies |
|---|---|---|
| Autenticação | OAuth 2.0 | Cookie/CSRF |
| Busca pública | Não suportada | Sim, via SearchResource |
| Feeds de boards de terceiros | Não | Sim, via BoardFeedResource |
| Rate limit | Documentado (~1.000 req/min por app) | Imposto por IP, não documentado |
| Estabilidade | Alta | Média — quebra com mudanças internas |
| Custo | Gratuito até limites | Custo de proxies |
Scraping ético e quando usar a API oficial
Raspar Pinterest deve limitar-se a dados públicos e não-pessoais: metadados de pins, imagens e links de destino. Evite coletar dados de perfis, contagens de seguidores ou qualquer campo que identifique pessoas físicas — isso pode configurar tratamento de dados pessoais sob o GDPR. Respeite o robots.txt e os Termos de Serviço do Pinterest.
Para produção estável, considere a API v5 oficial sempre que ela cobrir seu caso de uso. Scraping faz sentido quando você precisa de cobertura que a API não oferece — busca pública e feeds de boards de terceiros — e está disposto a manter o scraper contra mudanças internas.
Consulte sempre a documentação da ProxyHat para detalhes atualizados de configuração de proxies e limites de concorrência.
Principais pontos
- Superfícies públicas — pins, boards e busca são acessíveis sem login; home feed e perfis privados exigem login.
- Resource API — endpoints como
BoardFeedResourceeSearchResourceretornam JSON com cursorbookmark. - Proxies residenciais com geo — essenciais porque busca e recomendações são localizadas por país.
- Sticky session — preserva
csrftokendurante paginação; troque de sessão ao mudar de board. - Pacing e UA — 1–3s entre páginas, UA moderno e consistente reduzem bot scoring.
- Ética — apenas dados públicos e não-pessoais; prefira API v5 quando possível.
Pronto para escalar? Veja planos da ProxyHat e comece a raspar com proxies residenciais rotativos.






