Avertissement légal : Le scraping de Pinterest ne doit concerner que des données publiques et non personnelles. Respectez les Conditions d'utilisation de Pinterest, le Computer Fraud and Abuse Act (CFAA) aux États-Unis et le RGPD dans l'Union européenne. N'accédez jamais à des données login-walled sans autorisation. Privilégiez l'API officielle pour les cas d'usage en production.
Vous voulez construire un jeu de données de tendances visuelles à partir de Pinterest — pins, boards, résultats de recherche — mais vous butez sur les rate limits, les CAPTCHAs et les blocages d'IP. Ce guide explique comment scraper les pins et boards Pinterest en 2026 de manière fiable, avec des exemples de code exécutables et des proxies résidentiels rotatifs. Nous couvrons les surfaces publiques, l'API interne Resource de Pinterest, les stratégies anti-blocage et les limites éthiques.
Comprendre les surfaces de données Pinterest : public vs login-walled
Pinterest expose plusieurs surfaces de données, mais toutes ne sont pas accessibles sans authentification :
- Pins publics — visibles sur les pages de pins individuelles (
/pin/{id}/) sans connexion. Incluent titre, description, image, lien source et board parent. - Boards publics — feeds de pins accessibles sur
/{username}/{board_slug}/sans login. Paginés via l'API interne BoardFeedResource. - Résultats de recherche —
/search/pins/?q={query}retourne des pins publics, mais le contenu est localisé (les résultats varient par pays). - Home feed et recommandations personnalisées — login-walled. Nécessitent un compte connecté ; leur scraping viole généralement les Conditions d'utilisation.
L'API officielle Pinterest v5 existe, mais elle reste limitée : elle donne accès aux boards et pins de votre propre compte, pas à la recherche publique de pins de tiers. Pour construire des datasets de tendances visuelles sur des pins publics tiers, l'API interne non documentée est la seule voie réaliste — d'où l'importance d'un scraping responsable et mesuré.
L'API interne Resource de Pinterest : anatomy d'un endpoint
Pinterest utilise une architecture d'API interne appelée « Resource API ». Tous les endpoints suivent le même schéma :
GET /resource/{ResourceName}/get/?source_url={url_encoded_path}&data={url_encoded_json}
Les trois endpoints les plus utiles pour le scraping de données publiques :
- PinResource —
/resource/PinResource/get/— récupère un pin individuel par ID. - BoardFeedResource —
/resource/BoardFeedResource/get/— pagine les pins d'un board public. - SearchResource —
/resource/SearchResource/get/— exécute une recherche de pins publics.
Le paramètre data contient un objet JSON encodé en URL avec les paramètres de pagination. Par exemple, pour BoardFeedResource :
{"options":{"board_id":"1234567890","page_size":25,"bookmarks":["bookmark-cursor-string"]}}
Les headers requis pour que l'API réponde correctement :
| Header | Rôle | Exemple |
|---|---|---|
X-Pinterest-PWS-Handler | Identifie le handler côté serveur | www/[username]/[board_slug].js |
X-APP-VERSION | Version du frontend (change régulièrement) | 9ab3c4f |
csrftoken | Token anti-CSRF, lié au cookie csrftoken | Valeur du cookie csrftoken |
Le csrftoken est défini dans un cookie Set-Cookie lors de la première requête. Il doit être réutilisé dans les requêtes suivantes avec le même IP — d'où l'importance des sessions sticky.
Anti-bot : rate limits, bot scoring et localisation géographique
Pinterest applique plusieurs couches de protection :
- Rate limits par IP — environ 50–100 requêtes par minute par IP avant soft-block (HTTP 429 ou page de défi).
- Bot scoring — Pinterest école les patterns de navigation (headers, TLS fingerprint, cadence). Un User-Agent incohérent ou l'absence de headers navigateur augmente le score.
- Localisation — les résultats de recherche et les recommandations de pins sont géolocalisés. Une requête depuis une IP française renvoie des résultats différents d'une IP américaine.
Pour scraper Pinterest de manière fiable, les proxies résidentiels rotatifs avec géo-ciblage sont essentiels. Les datacenter proxies sont rapidement détectés car leurs plages d'IP appartiennent à des AS connus (AWS, OVH, DigitalOcean). Les IPs résidentielles proviennent de FAI réels et ont un score de confiance beaucoup plus élevé.
Le géo-ciblage est crucial : si vous voulez des tendances visuelles pour le marché US, forcez -country-US dans votre identifiant proxy. Pour le marché français, utilisez -country-FR.
Comparaison des types de proxies pour le scraping Pinterest
| Type | Détection | Vitesse | Géo-ciblage | Coût approx. | Recommandé pour Pinterest |
|---|---|---|---|---|---|
| Datacenter | Élevée | Rapide (50–100ms) | Limité | $0.5–$2 / GB | Non — blocage rapide |
| Résidentiel rotatif | Faible | Moyen (200–500ms) | Pays / ville | $3–$8 / GB | Oui — recherche & boards |
| Mobile 4G/5G | Très faible | Variable | Pays / opérateur | $10–$20 / GB | Oui — haute fiabilité |
Consultez notre page de tarification pour les options disponibles.
Exemple Python : paginer BoardFeedResource via ProxyHat
Cet exemple récupère les pins d'un board public avec pagination par bookmark, en utilisant le proxy HTTP ProxyHat sur gate.proxyhat.com:8080 et une session sticky pour préserver le csrftoken.
import requests
import json
from urllib.parse import quote
# Configuration ProxyHat — session sticky pour continuité du csrftoken
proxy_url = "http://user-country-US-session-pinterest01:pass@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",
"X-Pinterest-PWS-Handler": "www/[username]/[board_slug].js",
"X-APP-VERSION": "9ab3c4f",
"Referer": "https://www.pinterest.com/",
}
board_id = "1234567890"
bookmarks = []
all_pins = []
for page in range(5): # max 5 pages = ~125 pins
data_param = json.dumps({
"options": {
"board_id": board_id,
"page_size": 25,
"bookmarks": bookmarks,
}
})
url = (
"https://www.pinterest.com/resource/BoardFeedResource/get/"
f"?source_url=/%2F&data={quote(data_param)}"
)
resp = requests.get(url, headers=headers, proxies=proxies, timeout=30)
if resp.status_code == 429:
print(f"Rate limit atteint page {page}, pause 60s")
break
payload = resp.json()
resource_resp = payload.get("resource_response", {})
pins = resource_resp.get("data", [])
for pin in pins:
all_pins.append({
"id": pin.get("id"),
"title": pin.get("title", ""),
"image_url": pin.get("images", {}).get("orig", {}).get("url", ""),
"link": pin.get("link", ""),
})
bookmarks = resource_resp.get("bookmark")
if not bookmarks:
break # fin de pagination
import time; time.sleep(2) # pacing entre pages
print(f"{len(all_pins)} pins récupérés")
for p in all_pins[:3]:
print(json.dumps(p, indent=2))
Chaque pin renvoyé contient un id (string), un title, un images.orig.url (URL de l'image en pleine résolution) et un link (URL source canonique). Le champ bookmark dans la réponse contient le curseur de pagination à renvoyer dans la requête suivante.
Exemple Node.js : recherche de pins via SearchResource
Cet exemple utilise le proxy HTTP ProxyHat sur le port 8080 pour exécuter une recherche de pins publics et extraire les premiers résultats.
const axios = require("axios");
const querystring = require("querystring");
const proxyUrl = "http://user-country-US-session-pinterest02:pass@gate.proxyhat.com:8080";
async function searchPins(query, pageSize = 25) {
const dataParam = JSON.stringify({
options: {
query,
page_size: pageSize,
bookmarks: [],
},
});
const params = querystring.stringify({
source_url: `/search/pins/?q=${encodeURIComponent(query)}`,
data: dataParam,
});
const config = {
url: `https://www.pinterest.com/resource/SearchResource/get/?${params}`,
method: "GET",
proxy: {
host: "gate.proxyhat.com",
port: 8080,
auth: {
username: "user-country-US-session-pinterest02",
password: "pass",
},
},
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",
"X-Pinterest-PWS-Handler": "www/search/pins.js",
"X-APP-VERSION": "9ab3c4f",
"Referer": "https://www.pinterest.com/",
},
timeout: 30000,
};
try {
const resp = await axios(config);
const pins = resp.data.resource_response.data || [];
return pins.map((p) => ({
id: p.id,
title: p.title || "",
image_url: p.images?.orig?.url || "",
link: p.link || "",
}));
} catch (err) {
console.error("Erreur:", err.response?.status, err.message);
return [];
}
}
(async () => {
const results = await searchPins("minimalist home decor 2026");
console.log(`${results.length} pins trouvés`);
results.slice(0, 3).forEach((p) => console.log(JSON.stringify(p, null, 2)));
})();
Avec axios, la directive proxy route tout le trafic HTTP via le gateway ProxyHat. L'authentification est envoyée en Basic Auth dans le header Proxy-Authorization.
Pagination par bookmark, sessions sticky et hygiène anti-fingerprint
Bookmark / cursor pagination
Pinterest n'utilise pas de pagination par offset (page=2). Chaque réponse contient un champ bookmark (ou resource_response.bookmark) — une chaîne opaque à renvoyer dans options.bookmarks de la requête suivante. Quand bookmark est vide ou null, la pagination est terminée.
Conservez les bookmarks entre les pages dans la même session sticky. Un changement d'IP en milieu de pagination peut invalider le bookmark et provoquer des doublons ou des erreurs 403.
Sessions sticky via -session-
Ajoutez -session-{id} dans votre identifiant proxy pour maintenir la même IP sortante pendant toute la durée d'une tâche de scraping :
http://user-country-US-session-pinterest01:pass@gate.proxyhat.com:8080
La session reste active tant que vous gardez le même ID de session. Utilisez un ID différent par tâche parallèle pour répartir les requêtes sur plusieurs IPs.
Pacing et cadence
- Insérez un délai de 2–5 secondes entre chaque page.
- Limitez à 50 requêtes/minute par session/IP pour rester sous le radar.
- Évitez les bursts de requêtes simultanées — un humain ne charge pas 10 pages en 1 seconde.
User-Agent et headers
Utilisez un User-Agent de navigateur réel et cohérent (Chrome, Firefox, Safari). Ne mélangez pas un UA Chrome avec des headers Accept Firefox. Incluez systématiquement :
Accept: application/jsonAccept-Language: en-US,en;q=0.9(oufr-FRselon le géo)Referer: https://www.pinterest.com/Sec-Fetch-Dest: empty,Sec-Fetch-Mode: cors
Le csrftoken doit être extrait du cookie de la première réponse et réinjecté dans le header csrftoken des requêtes suivantes. Utilisez un requests.Session() en Python ou un cookie jar en Node.js pour gérer cela automatiquement.
Erreurs courantes et edge cases
- HTTP 429 (Too Many Requests) — rate limit atteint. Augmentez le délai ou changez de session proxy.
- HTTP 403 ou page de défi — bot scoring élevé. Vérifiez vos headers et changez d'IP résidentielle.
- Réponse vide ou
resource_response.data = []— bookmark invalide ou board privé. Vérifiez que le board est bien public. X-APP-VERSIONobsolète — Pinterest met à jour cette valeur régulièrement. Inspectez une requête réelle dans le navigateur pour récupérer la version courante.- Résultats de recherche localisés — si vous scrapez depuis une IP non-US, les résultats peuvent différer. Forcez
-country-USpour des résultats cohérents.
Scraping éthique et quand utiliser l'API officielle
Le scraping de Pinterest doit respecter des limites claires :
- Données publiques uniquement — pins, boards et résultats de recherche visibles sans connexion. N'accédez jamais aux home feeds, recommandations personnalisées ou données de comptes privés.
- Données non personnelles — évitez de collecter des informations identifiantes (profils utilisateurs, données de localisation personnelle) au-delà de ce qui est strictement nécessaire.
- Respectez
robots.txt— consultezhttps://www.pinterest.com/robots.txtavant de scraper un chemin. - Volume modéré — ne répliquez pas la base de données entière de Pinterest. Un dataset de tendances nécessite quelques milliers de pins, pas des millions.
- Préférez l'API officielle en production — si votre cas d'usage le permet (gestion de vos propres boards, analytics de votre compte), utilisez l'API Pinterest v5 qui est stable, documentée et conforme aux Conditions d'utilisation.
Pour des cas d'usage de recherche de pins publics tiers (tendances visuelles, datasets de design, analyse de marché), le scraping de l'API interne reste la seule option, mais doit être fait avec parcimonie et respect.
Points clés à retenir
- Pinterest expose trois surfaces publiques scrapables : pins individuels, boards publics et résultats de recherche. Le home feed est login-walled.
- L'API interne Resource (
/resource/{Name}/get/) accepte un paramètredataJSON encodé en URL et nécessite les headersX-Pinterest-PWS-Handler,X-APP-VERSIONetcsrftoken.- La pagination se fait par
bookmark— pas d'offset. Conservez la même session sticky pour ne pas invalider le curseur.- Les proxies résidentiels avec géo-ciblage (
-country-US) sont indispensables : les datacenter proxies sont bloqués en minutes.- Pacing de 2–5s entre pages, max 50 req/min par IP, User-Agent cohérent avec les headers.
- En production, préférez l'API officielle v5 quand elle couvre votre cas d'usage.
Pour aller plus loin, consultez notre guide de scraping web, notre cas d'usage SERP tracking, la liste des localisations proxy disponibles, et la documentation ProxyHat.






