Как скрейпить Pinterest Pins и Boards в 2026: руководство для разработчиков

Практическое руководство по сбору публичных данных Pinterest с помощью резидентных прокси: внутренний Resource API, пагинация, обход анти-бота, примеры на Python и Node.js.

How to Scrape Pinterest Pins and Boards in 2026: A Developer's Guide

Важное предупреждение. Сбор данных с 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 v5OAuth 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-токен из cookies
  • User-Agent — реалистичный браузерный UA
  • Accept: 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-скрейпинга рекомендуются резидентные прокси с гео-таргетингом.

Конфигурация

ПараметрЗначение
Gatewaygate.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 к запросу
  • Concurrency50–100 concurrent sessions на ProxyHat без деградации
  • Rate per IP — держите ≤30 запросов в минуту на один IP
  • Uptime99.9% для gateway ProxyHat

Этический скрейпинг и когда использовать официальный API

Скрейпинг — инструмент, а не лицензия на безграничный сбор. Следуйте принципам:

  1. Соблюдайте Terms of Service. Не собирайте контент, явно запрещённый ToS Pinterest.
  2. Не собирайте персональные данные. GDPR требует законного основания для обработки персональных данных. Если данные идентифицируют человека — не собирайте без согласия.
  3. Соблюдайте robots.txt. Это не юридическое требование, но индустриальный стандарт. Читайте robots.txt Pinterest перед запуском.
  4. Ограничивайте частоту. Не перегружайте инфраструктуру платформы. Pacing 2–3 секунды — минимум.
  5. Кешируйте данные. Не запрашивайте один и тот же пин повторно. Храните локально.

Когда использовать официальный 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 при любом подходе.

Готовы начать?

Доступ к более чем 50 млн резидентных IP в 148+ странах с AI-фильтрацией.

Смотреть ценыРезидентные прокси
← Вернуться в Блог