Важное предупреждение. Сбор данных с Pinterest должен respects Terms of Service платформы и применимые законы: Computer Fraud and Abuse Act (CFAA) в США и GDPR в ЕС. Эта статья охватывает только легитимный доступ к публичным данным — пины, доски и поисковые результаты, доступные без авторизации. Не собирайте персональные данные, контент за логином и не нарушайте robots.txt. Для production-нагрузок предпочтительнее официальный Pinterest API v5.
Как скрейпить Pinterest Pins и Boards в 2026: обзор подхода
Pinterest остаётся одним из крупнейших визуальных поисковиков: более 500 миллионов активных пользователей в месяц генерируют массив данных о трендах, дизайне, моде и товарах. Для разработчиков, собирающих датасеты визуального контента, Pinterest — ценный источник. Но платформа активно защищает свои данные: пер-IP rate limits, bot scoring и локализация результатов по гео требуют грамотной инфраструктуры прокси.
Ключевое правило: скрейпить Pinterest можно только публичные поверхности — пины, доски и поисковые выдачи. Домашний feed, рекомендации и персональные данные требуют авторизации и выходят за рамки легитимного доступа. Официальный Pinterest API v5 даёт ограниченный доступ к пинам и доскам аутентифицированного пользователя, но не покрывает массовый сбор трендовых данных.
Технический контекст: почему скрейпинг Pinterest сложен
Pinterest — это не статичный HTML. Это SPA на React с внутренним Resource API, который возвращает JSON напрямую. Понимание архитектуры критично.
Публичные поверхности против login-walled контента
| Поверхность | Доступ | Публичная? |
|---|---|---|
| Пин (отдельная страница) | URL вида /pin/{id}/ | Да, если пин публичный |
| Доска (board feed) | URL вида /{username}/{board}/ | Да, если доска публичная |
| Поиск | /search/pins/?q=запрос | Да, локализованный |
| Home feed | После логина | Нет — login-walled |
| Рекомендации | После логина | Нет — login-walled |
| Pinterest API v5 | OAuth 2.0 | Ограниченный — только свои пины/доски |
Внутренний Resource API
Pinterest использует внутренний API на базе /resource/ эндпоинтов. Основные:
- PinResource —
/resource/PinResource/get/— данные одного пина - BoardFeedResource —
/resource/BoardFeedResource/get/— лента доски с пагинацией - SearchResource —
/resource/BaseSearchResource/get/— поисковая выдача - UserResource —
/resource/UserResource/get/— профиль пользователя
Запросы к Resource API выглядят так:
GET /resource/BoardFeedResource/get/?source_url=%2Fusername%2Fboard-name%2F&data=%7B%22options%22%3A%7B%22board_id%22%3A%22123456789%22%2C%22page_size%22%3A25%2C%22bookmarks%22%3A%5B%22bookmark-token%22%5D%7D%7D
Параметры запроса:
source_url— URL-encoded путь страницы, с которой инициирован запросdata— URL-encoded JSON с опциями (board_id, page_size, bookmarks для пагинации)
Обязательные заголовки
Resource API проверяет набор заголовков. Без них запросы отклоняются или возвращают пустые результаты:
X-Pinterest-PWS-Handler— идентификатор обработчика (например,www/[username]/[board].js)X-APP-VERSION— версия клиентского бандла (меняется при деплоях, нужно парсить из HTML)csrftoken— CSRF-токен из cookiesUser-Agent— реалистичный браузерный UAAccept: application/json— для JSON-ответов
Анти-бот реальность: rate limits и bot scoring
Pinterest применяет многоуровневую защиту:
- Per-IP rate limits — примерно 50–100 запросов в минуту с одного IP до soft-block
- Bot scoring — анализ частоты, заголовков, TLS-фингерпринта, последовательности запросов
- Геолокализация — поисковые результаты и рекомендации локализованы по стране IP
- CAPTCHA — при подозрительной активности показывается interstitial
Вот почему вращение резидентных прокси с гео-таргетингом необходимо. Дата-центр IP-адреса детектируются быстрее — Pinterest блокирует их с высоким false-positive rate. Резидентные IP выглядят как реальные пользователи.
Локализация критична: поиск «wedding dresses» с IP из Германии выдаст другой результат, чем с IP из США. Для репрезентативного датасета используйте -country-US или нужную страну.
Практическая реализация: Python с ProxyHat
Пример пагинации BoardFeedResource с резидентными прокси через ProxyHat gateway. Скрипт собирает пины с публичной доски, парсит id, title, image URL и link.
import requests
import json
from urllib.parse import quote
# ProxyHat residential proxy with US geo and sticky session
proxy_url = "http://user-country-US-session-pinterest01:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
# Realistic headers — X-APP-VERSION must match current bundle
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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": "a1b2c3d", # parse from board page HTML
"X-Requested-With": "XMLHttpRequest",
}
board_slug = "username/board-name"
source_url = f"/{board_slug}/"
# First, fetch the board page to get csrftoken and board_id
session = requests.Session()
session.proxies = proxies
resp = session.get(f"https://www.pinterest.com{source_url}", headers=headers)
csrftoken = session.cookies.get("csrftoken", "")
headers["X-CSRFToken"] = csrftoken
# Extract board_id from initial JSON in page
import re
match = re.search(r'"board_id":"(\d+)"', resp.text)
board_id = match.group(1) if match else None
all_pins = []
bookmarks = [None]
page = 0
while bookmarks and page < 10: # cap at 10 pages
data_param = {
"options": {
"board_id": board_id,
"page_size": 25,
"bookmarks": bookmarks,
}
}
encoded_data = quote(json.dumps(data_param))
encoded_source = quote(source_url)
api_url = f"https://www.pinterest.com/resource/BoardFeedResource/get/?source_url={encoded_source}&data={encoded_data}"
r = session.get(api_url, headers=headers)
payload = r.json()
for pin in payload.get("resource_response", {}).get("data", []):
all_pins.append({
"id": pin.get("id"),
"title": pin.get("title") or pin.get("grid_title"),
"image_url": pin.get("images", {}).get("orig", {}).get("url"),
"link": pin.get("link"),
})
bookmarks = payload.get("resource_response", {}).get("bookmarks", [])
if not bookmarks or bookmarks == [None]:
break
page += 1
# Pacing — 2-3 seconds between requests
import time; time.sleep(2.5)
print(f"Collected {len(all_pins)} pins")
for p in all_pins[:5]:
print(json.dumps(p, indent=2, ensure_ascii=False))
Ключевые моменты этого примера:
- Sticky session (
session-pinterest01) сохраняет один IP на протяжении сбора — это важно для непрерывности csrftoken - US geo — результаты локализованы под американский рынок
- Пагинация через bookmarks — Pinterest использует cursor-based pagination, не offset
- Pacing 2.5 секунды — снижает риск bot scoring
Пример на Node.js через HTTP-шлюз ProxyHat
const axios = require('axios');
const querystring = require('querystring');
const proxyConfig = {
proxy: {
protocol: 'http',
host: 'gate.proxyhat.com',
port: 8080,
auth: {
username: 'user-country-US-session-node01',
password: 'pass'
}
}
};
const headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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': 'a1b2c3d',
'X-Requested-With': 'XMLHttpRequest',
};
async function scrapeBoard(boardSlug) {
const sourceUrl = `/${boardSlug}/`;
// Fetch board page first
const pageResp = await axios.get(`https://www.pinterest.com${sourceUrl}`, {
...proxyConfig,
headers,
});
const cookies = pageResp.headers['set-cookie'] || [];
const csrfCookie = cookies.find(c => c.startsWith('csrftoken='));
const csrftoken = csrfCookie ? csrfCookie.split(';')[0].split('=')[1] : '';
headers['X-CSRFToken'] = csrftoken;
const boardIdMatch = pageResp.data.match(/"board_id":"(\d+)"/);
const boardId = boardIdMatch ? boardIdMatch[1] : null;
let bookmarks = [null];
let allPins = [];
let page = 0;
while (bookmarks.length && page < 10) {
const dataParam = JSON.stringify({
options: { board_id: boardId, page_size: 25, bookmarks }
});
const params = new URLSearchParams({
source_url: sourceUrl,
data: dataParam
});
const apiUrl = `https://www.pinterest.com/resource/BoardFeedResource/get/?${params.toString()}`;
const resp = await axios.get(apiUrl, { ...proxyConfig, headers });
const payload = resp.data;
const pins = payload.resource_response?.data || [];
pins.forEach(pin => {
allPins.push({
id: pin.id,
title: pin.title || pin.grid_title,
image_url: pin.images?.orig?.url,
link: pin.link
});
});
bookmarks = payload.resource_response?.bookmarks || [];
if (!bookmarks.length || bookmarks[0] === null) break;
page++;
await new Promise(r => setTimeout(r, 2500));
}
console.log(`Collected ${allPins.length} pins`);
return allPins;
}
scrapeBoard('username/board-name').catch(console.error);
Распространённые ошибки и edge cases
1. Устаревший X-APP-VERSION
Pinterest деплоит новый бандл несколько раз в неделю. Если X-APP-VERSION не совпадает с текущим, Resource API возвращает 401 или пустой ответ. Решение: парсите версию из HTML при каждом старте сессии.
# Extract X-APP-VERSION from board page
version_match = re.search(r'"app_version":"([a-z0-9]+)"', resp.text)
if version_match:
headers["X-APP-VERSION"] = version_match.group(1)
2. Потеря csrftoken при ротации IP
Если каждый запрос идёт с нового IP, csrftoken, привязанный к сессии, теряет валидность. Используйте sticky sessions через -session-{id} в username ProxyHat. Это держит один IP на протяжении всей сессии.
3. Игнорирование robots.txt
Проверьте https://www.pinterest.com/robots.txt перед запуском. Соблюдайте директивы для путей, которые платформа явно запрещает.
4. Нереалистичный User-Agent
Использование python-requests/2.x.x или устаревших UA — мгновенный флаг. Синхронизируйте UA с заголовками, которые реальный браузер отправляет.
5. Слишком высокая частота запросов
Без pacing 50+ запросов в минуту с одного IP вызывают soft-block. Держите 1 запрос каждые 2–3 секунды на сессию.
Настройка ProxyHat: прокси для Pinterest-скрейпинга
ProxyHat предоставляет резидентные, мобильные и дата-центр прокси через единый gateway. Для Pinterest-скрейпинга рекомендуются резидентные прокси с гео-таргетингом.
Конфигурация
| Параметр | Значение |
|---|---|
| Gateway | gate.proxyhat.com |
| HTTP порт | 8080 |
| SOCKS5 порт | 1080 |
| Гео-таргетинг | В username: user-country-US |
| Sticky session | В username: user-session-{id} |
| Город | user-country-US-city-newyork |
Примеры URL
# HTTP, US, sticky session
http://user-country-US-session-pinterest01:pass@gate.proxyhat.com:8080
# SOCKS5, Germany, sticky session
socks5://user-country-DE-session-search01:pass@gate.proxyhat.com:1080
# HTTP, US, city-level
http://user-country-US-city-sanfrancisco:pass@gate.proxyhat.com:8080
Подробнее о тарифах — на странице цен ProxyHat. Список доступных локаций — на странице локаций. Документация по интеграции — на docs.proxyhat.com.
Стратегии ротации IP для Pinterest
Per-request rotation
Каждый запрос — новый IP. Подходит для массового сбора отдельных пинов или поисковых запросов. Минус: csrftoken не сохраняется, нужно получать новый для каждого запроса.
# Per-request rotation — no session flag
http://user-country-US:pass@gate.proxyhat.com:8080
Sticky sessions
Один IP на протяжении сессии. Необходимо для BoardFeedResource пагинации, где bookmarks и csrftoken привязаны к IP.
# Sticky session — same IP for entire crawl
http://user-country-US-session-board-abc123:pass@gate.proxyhat.com:8080
Гибридный подход
Используйте sticky sessions для пагинации доски, затем меняйте session ID для следующей доски. Это балансирует стабильность и распределение нагрузки.
Производительность и метрики
При планировании production-сбора отслеживайте:
- Success rate — целевой показатель ≥95% для резидентных прокси
- Latency — резидентные прокси добавляют 200–800ms к запросу
- Concurrency — 50–100 concurrent sessions на ProxyHat без деградации
- Rate per IP — держите ≤30 запросов в минуту на один IP
- Uptime — 99.9% для gateway ProxyHat
Этический скрейпинг и когда использовать официальный API
Скрейпинг — инструмент, а не лицензия на безграничный сбор. Следуйте принципам:
- Соблюдайте Terms of Service. Не собирайте контент, явно запрещённый ToS Pinterest.
- Не собирайте персональные данные. GDPR требует законного основания для обработки персональных данных. Если данные идентифицируют человека — не собирайте без согласия.
- Соблюдайте robots.txt. Это не юридическое требование, но индустриальный стандарт. Читайте robots.txt Pinterest перед запуском.
- Ограничивайте частоту. Не перегружайте инфраструктуру платформы. Pacing 2–3 секунды — минимум.
- Кешируйте данные. Не запрашивайте один и тот же пин повторно. Храните локально.
Когда использовать официальный Pinterest API v5
Официальный Pinterest API v5 — правильный выбор для:
- Управления собственными пинами и досками
- Аналитики рекламных кампаний
- Интеграции с e-commerce платформами (Pinterest Catalog)
- Production-приложений с SLA и поддержкой
Скрейпинг уместен для исследовательских задач — анализ трендов, сбор датасетов для ML, конкурентный анализ цен — где официальный API не предоставляет нужных данных. Подробнее о применении — в use-case по web scraping и SERP-трекингу.
Ключевые выводы
1. Только публичные данные. Пины, доски и поиск доступны без логина. Home feed и рекомендации — login-walled.
2. Resource API — основной канал. Эндпоинты
/resource/возвращают JSON. Парсите X-APP-VERSION и csrftoken из HTML.3. Резидентные прокси с гео — необходимость. Дата-центр IP блокируются. Используйте
-country-USи-session-{id}для стабильности.4. Pacing и fingerprint hygiene. 2–3 секунды между запросами, реалистичный UA, sticky session для csrftoken.
5. Этика прежде всего. Соблюдайте ToS, GDPR, robots.txt. Для production — официальный API v5.
FAQ
Что такое скрейпинг Pinterest Pins и Boards в 2026?
Это программный сбор публичных данных Pinterest — пинов, досок и поисковых результатов — через внутренний Resource API платформы. Pinterest SPA на React отдаёт JSON через эндпоинты вида /resource/PinResource/get/ и /resource/BoardFeedResource/get/. Скрейпинг позволяет собирать датасеты визуального контента для трендового анализа и ML, но требует резидентных прокси из-за анти-бот защиты.
Почему скрейпинг Pinterest важен для пользователей прокси?
Pinterest применяет per-IP rate limits (50–100 запросов/мин), bot scoring и геолокализацию результатов. Без ротации IP запросы блокируются после короткой серии. Резидентные прокси с гео-таргетингом (например, -country-US) обеспечивают стабильный доступ и корректную локализацию поисковых данных. Sticky sessions сохраняют csrftoken валидным при пагинации BoardFeedResource.
Какой тип прокси лучше всего подходит для скрейпинга Pinterest?
Резидентные прокси — оптимальный выбор. Дата-центр IP-адреса детектируются Pinterest с высоким false-positive rate. Резидентные IP выглядят как реальные пользователи, обеспечивают success rate ≥95% и поддерживают гео-таргетинг по стране и городу. Мобильные прокси дают ещё более высокий уровень доверия, но стоят дороже. Для большинства задач достаточно резидентных с sticky session.
Как избежать блокировок при скрейпинге Pinterest?
Соблюдайте pacing (1 запрос каждые 2–3 секунды на IP), используйте sticky sessions для сохранения csrftoken, парсите актуальный X-APP-VERSION из HTML, отправляйте реалистичные заголовки (User-Agent, X-Pinterest-PWS-Handler, Accept), ротируйте резидентные IP с гео-таргетингом и не превышайте 30 запросов в минуту на один IP. Для пагинации досок используйте cursor-based bookmarks, не offset.
Можно ли использовать официальный Pinterest API вместо скрейпинга?
Да, Pinterest API v5 подходит для управления собственными пинами, досками и рекламной аналитикой. Однако он не предоставляет доступ к публичным доскам других пользователей или массовым поисковым данным. Для исследовательских задач — трендовый анализ, датасеты для ML, конкурентный мониторинг — скрейпинг публичных поверхностей остаётся единственным вариантом. Соблюдайте ToS и GDPR при любом подходе.






