Jak scrapować piny i tablice Pinterest w 2026: Przewodnik dla programistów

Kompletny przewodnik po scrapowaniu publicznych pinów i tablic Pinterest z wykorzystaniem proxy residencjalnych. Przykłady kodu w Python i Node.js, paginacja bookmark, sesje sticky i najlepsze praktyki etyczne.

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

Zastrzeżenie prawne: Ten artykuł dotyczy wyłącznie dostępu do publicznie dostępnych danych na Pinterest. Musisz przestrzegać Warunków Korzystania (ToS) Pinterest, a w USA — ustawy CFAA (Computer Fraud and Abuse Act), a w UE — RODO (GDPR). Nie zachęcamy do omijania zabezpieczeń, logowania się bez autoryzacji ani gromadzenia danych osobowych bez podstawy prawnej. Jeśli Pinterest oferuje oficjalne API spełniające Twoje potrzeby — użyj go.

Visual-content i trend datasets rosną w wartości, a Pinterest pozostaje jednym z najbogatszych źródeł danych wizualnych na świecie — ponad 500 milionów aktywnych użytkowników miesięcznie wg Pinterest Newsroom. Jeśli budujesz pipeline do analizy trendów, katalogów produktów czy badań rynku, scrapowanie Pinterest może dostarczyć ustrukturyzowanych danych o pinach, tablicach i wynikach wyszukiwania. Ten przewodnik pokazuje, jak scraper Pinterest zbudować produkcyjnie w 2026 roku — z proxy, paginacją i etycznymi ramami.

Jak scrapować piny i tablice Pinterest w 2026: Podstawy

Scrapowanie Pinterest w 2026 wymaga zrozumienia trzech warstw: publicznych powierzchni danych, wewnętrznego Resource API oraz infrastruktury anti-bot. Piny i tablice widoczne bez logowania są dostępne na poziomie stron HTML oraz przez wewnętrzne endpointy JSON. Home feed i rekomendacje spersonalizowane są za loginem — ich scrapowanie narusza ToS i jest technicznie oraz prawnie ryzykowne.

Oficjalne Pinterest API v5 oferuje dostęp do pinów, tablic i statystyk konta, ale jest ograniczone do danych własnego profilu lub kont z wyraźną autoryzacją OAuth. Nie pozwala na masowe przeszukiwanie publicznych tablic innych użytkowników ani na pobieranie wyników wyszukiwania w skali — co czyni Pinterest API scraping uzupełnieniem, nie zastępstwem scrapingu publicznych danych.

Publiczne powierzchnie vs dane za loginem

PowierzchniaDostępTyp danychLegalność scrapowania
Pina (pin page)Publiczna bez logowaniaObraz, tytuł, opis, link, tagiDozwolone (publiczne, nieosobiste)
Tablica (board feed)Publiczna bez logowaniaLista pinów z metadanymiDozwolone (publiczne)
Wyniki wyszukiwaniaPubliczne bez logowaniaPiny dopasowane do zapytaniaDozwolone (publiczne, zlokalizowane)
Home feedZa loginemSpersonalizowane rekomendacjeRyzykowne — narusza ToS
Profil użytkownika (prywatny)Za loginem / niepublicznyPrywatne tabliceNiedozwolone

Kontekst techniczny: Resource API Pinterest

Pinterest jest aplikacją SPA (single-page application) opartą na React/Redux. Wszystkie dane ładują się przez wewnętrzne endpointy JSON pod ścieżką /resource/<NazwaZasobu>/get/. Te endpointy nie są udokumentowane publicznie, ale są wywoływane przez frontend przy każdej nawigacji — więc są częścią normalnego ruchu przeglądarki.

Kluczowe endpointy Resource API

  • PinResource/resource/PinResource/get/ — pobiera metadane pojedynczego pina (id, tytuł, obraz, link, opis).
  • BoardFeedResource/resource/BoardFeedResource/get/ — paginowana lista pinów z tablicy. Zwraca obiekty pinów z polami id, title, images, link, description.
  • SearchResource/resource/SearchResource/get/ — wyniki wyszukiwania z lokalizacją geograficzną wpływającą na ranking.
  • BoardResource/resource/BoardResource/get/ — metadane tablicy (nazwa, liczba followerów, liczba pinów).

Każde żądanie do Resource API wymaga:

  • Parametru ?source_url= — zakodowany URL ścieżki, np. ?source_url=%2Fboard%2Fuser%2Fboard-name%2F
  • Parametru data= — URL-encoded JSON z opcjami paginacji, np. {"bookmarks":["..."],"board_id":"123","page_size":25}
  • Nagłówka X-Pinterest-PWS-Handler — identyfikator handlera frontendu
  • Nagłówka X-APP-VERSION — wersja aplikacji (zmienia się okresowo)
  • Cookie csrftoken — token CSRF wymagany dla żądań modyfikujących, ale obecny też w żądaniach GET

Anti-bot i strategia proxy

Pinterest stosuje per-IP rate limiting i bot scoring oparty na sygnałach takich jak: częstotliwość żądań, powtarzalność nagłówków, brak interakcji JavaScript, geolokalizacja IP vs język żądania. Po przekroczeniu progu (często ~50–100 żądań/min z jednego IP) Pinterest zwraca HTTP 429 lub stronę CAPTCHA.

Rotujące proxy residencjalne są konieczne z dwóch powodów:

  1. Rate limiting per-IP — każdy IP ma limit żądań; rotacja IP pozwala rozproszyć obciążenie.
  2. Lokalizacja wyników — wyszukiwanie i rekomendacje Pinterest są zlokalizowane. Pin pokazywany w USA może różnić się od tego w Niemczech. Geo-targetowanie (-country-US, -country-DE) daje kontrolę nad tym, jakie dane otrzymujesz.

Dla ProxyHat konfiguracja proxy residencjalnego z geo-targetowaniem wygląda następująco:

# HTTP proxy z geo-targetowaniem na USA
http://user-country-US:pass@gate.proxyhat.com:8080

# HTTP proxy z geo-targetowaniem na Niemcy i sesją sticky
http://user-country-DE-session-abc123:pass@gate.proxyhat.com:8080

# SOCKS5 proxy
socks5://user-country-US:pass@gate.proxyhat.com:1080

Szczegóły konfiguracji znajdziesz w dokumentacji ProxyHat oraz na stronie lokalizacji proxy.

Implementacja: Python — paginacja BoardFeedResource

Poniższy przykład pobiera piny z publicznej tablicy przez BoardFeedResource, używając proxy residencjalnego ProxyHat z geo-targetowaniem na USA. Implementuje paginację bookmark — Pinterest używa kursorów opartych na base64-encoded stringach zamiast offsetów.

import requests
import json
from urllib.parse import quote, urlencode

PROXY = "http://user-country-US:pass@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/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": "board/[username]/[slug].js",
    "X-APP-VERSION": "d4c1f3e",
    "Referer": "https://www.pinterest.com/",
}

BOARD_SLUG = "username/board-name"
SOURCE_URL = f"/{BOARD_SLUG}/"

bookmarks = [""]
all_pins = []
page = 0

while bookmarks and page < 10:  # limit stron dla bezpieczeństwa
    data = json.dumps({
        "bookmarks": bookmarks,
        "board_id": "1234567890",
        "page_size": 25,
        "currentFilter": -1,
        "field_set_key": "react_grid_pin",
    })

    params = {
        "source_url": SOURCE_URL,
        "data": data,
    }

    url = "https://www.pinterest.com/resource/BoardFeedResource/get/"

    resp = requests.get(url, params=params, headers=HEADERS,
                        proxies=proxies, timeout=30)

    if resp.status_code == 429:
        print(f"Rate limited na stronie {page}, czekam...")
        import time
        time.sleep(60)
        continue

    resp.raise_for_status()
    payload = resp.json()

    resource_response = payload.get("resource_response", {})
    pins = resource_response.get("data", [])

    if not pins:
        break

    for pin in pins:
        pin_obj = {
            "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"),
            "description": pin.get("description", "")[:200],
        }
        all_pins.append(pin_obj)

    bookmarks = resource_response.get("bookmark")
    if not bookmarks or bookmarks == [""]:
        break

    page += 1
    import time
    time.sleep(2)  # pacing — 2s między żądaniami

print(f"Pobrano {len(all_pins)} pinów")
for p in all_pins[:3]:
    print(json.dumps(p, indent=2))

Kluczowe elementy tego kodu:

  • Geo-targetowanie -country-US — wyniki odpowiadają rynku amerykańskiemu
  • Pacing — 2 sekundy między żądaniami zmniejsza ryzyko rate limit
  • Bookmark pagination — kursory z odpowiedzi, nie offset liczbowy
  • Truncated pin object — ekstrakcja id, title, image_url, link, description

Implementacja: Node.js — wyszukiwanie przez SearchResource

Drugi przykład w Node.js używa HTTP gateway ProxyHat na porcie 8080 do scrapowania wyników wyszukiwania przez SearchResource.

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

const PROXY_URL = 'http://user-country-US:pass@gate.proxyhat.com:8080';
const agent = new HttpsProxyAgent.HttpsProxyAgent(PROXY_URL);

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',
  'Accept-Language': 'en-US,en;q=0.9',
  'X-Pinterest-PWS-Handler': 'search/[scope].js',
  'X-APP-VERSION': 'd4c1f3e',
  'Referer': 'https://www.pinterest.com/',
};

async function searchPins(query, maxPages = 5) {
  const sourceUrl = `/search/pins/?q=${encodeURIComponent(query)}`;
  let bookmarks = [''];
  const allPins = [];

  for (let page = 0; page < maxPages; page++) {
    const data = JSON.stringify({
      bookmarks: bookmarks,
      query: query,
      page_size: 25,
      scope: 'pins',
    });

    const params = new URLSearchParams({
      source_url: sourceUrl,
      data: data,
    });

    const url = `https://www.pinterest.com/resource/SearchResource/get/?${params}`;

    try {
      const resp = await axios.get(url, {
        headers: HEADERS,
        httpsAgent: agent,
        timeout: 30000,
      });

      const resourceResponse = resp.data.resource_response || {};
      const pins = resourceResponse.data || [];

      if (pins.length === 0) break;

      pins.forEach(pin => {
        allPins.push({
          id: pin.id,
          title: pin.title || pin.grid_title,
          image_url: pin.images?.orig?.url,
          link: pin.link,
        });
      });

      bookmarks = resourceResponse.bookmark ? [resourceResponse.bookmark] : [];
      if (!bookmarks[0]) break;

      await new Promise(r => setTimeout(r, 2000)); // 2s pacing
    } catch (err) {
      if (err.response?.status === 429) {
        console.log('Rate limited, czekam 60s...');
        await new Promise(r => setTimeout(r, 60000));
        page--; // retry
        continue;
      }
      throw err;
    }
  }

  return allPins;
}

(async () => {
  const pins = await searchPins('minimalist interior design');
  console.log(`Pobrano ${pins.length} pinów`);
  console.log(JSON.stringify(pins.slice(0, 3), null, 2));
})();

Paginacja bookmark, sesje sticky i higiena fingerprint

Bookmark pagination

Pinterest nie używa tradycyjnego offsetu liczbowego. Zamiast tego zwraca pole bookmark — base64-encoded ciąg znaków reprezentujący pozycję kursora. Przekazujesz go w kolejnym żądaniu w tablicy bookmarks. Gdy bookmark jest pusty lub brakuje — osiągnięto koniec danych.

Ważne: bookmark może zawierać token -end- sygnalizujący koniec wyników. Sprawdzaj tę wartość.

Sesje sticky dla csrftoken

Cookie csrftoken jest ustawiane przy pierwszym żądaniu i powiązane z sesją. Jeśli używasz rotacji IP per-request, każde żądanie dostanie nowy csrftoken, co może wyglądać podejrzanie. Dla ciągłości sesji używaj sticky sessions:

# Sticky session — ten sam IP przez całą sesję
http://user-session-pinterest-board-abc:pass@gate.proxyhat.com:8080

Sticky session utrzymuje ten sam IP przez konfigurowalny czas (zwykle 10–30 minut), co pozwala zachować ciągłość csrftoken i innych cookies. Po zakończeniu sesji lub po wygaśnięciu, ProxyHat przydziela nowy IP.

User-Agent i higiena nagłówków

Fingerprint risk rośnie, gdy nagłówki są niespójne. Najlepsze praktyki:

  • Używaj realistycznego, aktualnego User-Agent (Chrome 120+ na Windows/macOS/Linux)
  • Dopasuj Accept-Language do geo-targetowania proxy — en-US dla USA, de-DE dla Niemiec
  • Utrzymuj X-APP-VERSION aktualnym — sprawdź aktualną wersję w żądaniach przeglądarki
  • Ustaw Referer na https://www.pinterest.com/
  • Nie wysyłaj nagłówków bot-like (python-requests/2.x, axios/1.x)

Pacing i rate limiting

Rekomendowane tempo: 1 żądanie na 2–3 sekundy na IP. Przy 100 IP przez rotujące proxy, daje to ~20–30 żądań/s — wystarczająco dla większości pipeline'ów. Przy 429 (Too Many Requests) — pauzuj 60s i retry. Przy 403 lub CAPTCHA — zmień IP i zredukuj tempo.

Najczęstsze błędy i przypadki brzegowe

  • Ignorowanie X-APP-VERSION — Pinterest odrzuca żądania z nieaktualną wersją. Sprawdzaj aktualną wersję w DevTools co kilka tygodni.
  • Brak source_url — endpoint zwraca błąd bez poprawnego source_url odpowiadającego ścieżce frontendu.
  • Offset zamiast bookmark — próba paginacji offsetowej nie działa; zawsze używaj zwróconego bookmark.
  • Niespójne geo i język — proxy w DE z Accept-Language: en-US wygląda podejrzanie. Dopasuj je.
  • Zbyt szybkie żądania — 10+ req/s z jednego IP = natychmiastowy ban. Pacing 2–3s jest bezpieczny.
  • Piny bez obrazu — niektóre piny (np. wideo, artykuły) mogą nie mieć images.orig.url. Obsłuż None/null.

Etyczne scrapowanie i kiedy użyć oficjalnego API

Scrapowanie publicznych danych z Pinterest jest legalne, gdy:

  • Gromadzisz nieosobiste dane pinów — obrazy, tytuły, linki, tagi
  • Przestrzegasz robots.txt — sprawdź robots.txt Pinterest
  • Nie gromadzisz danych osobowych bez podstawy prawnej (GDPR Art. 6)
  • Nie obciążasz infrastruktury Pinterest nadmiernie — pacing i limit concurrency
  • Nie omijasz zabezpieczeń (CAPTCHA, login walls)

Kiedy użyć oficjalnego API zamiast scrapowania:

  • Gdy budujesz aplikację dla użytkowników Pinterest (zarządzanie ich własnymi tablicami)
  • Gdy potrzebujesz statystyk i analityki konta
  • Gdy gromadzisz dane z własnego konta firmowego
  • Gdy potrzebujesz SLA i stabilności produkcyjnej

Oficjalne Pinterest API v5 ma limity rate limit ~1000 żądań/min dla zapytań odczytu — wystarczające dla większości zastosowań zarządzania kontem. Dla masowego gromadzenia danych o trendach z publicznych tablic i wyszukiwania, scraping publicznych powierzchni z proxy residencjalnymi pozostaje praktyczną opcją.

Zobacz też nasze przypadki użycia: web scraping i SERP tracking, oraz cennik ProxyHat.

Kluczowe wnioski

Podsumowanie:

  • Scrapuj tylko publiczne piny, tablice i wyniki wyszukiwania — unikaj home feed i danych za loginem.
  • Resource API (/resource/.../get/) z parametrami source_url i data jest głównym kanałem danych.
  • Rotujące proxy residencjalne z geo-targetowaniem są konieczne — wyniki są zlokalizowane, a rate limit jest per-IP.
  • Bookmark pagination, sticky sessions dla csrftoken i pacing 2–3s to fundamenty stabilnego pipeline'u.
  • Przestrzegaj ToS, GDPR, CFAA i robots.txt — dla produkcji rozważ oficjalne API v5.

FAQ

Czym jest scrapowanie pinów i tablic Pinterest w 2026?

To proces automatycznego pobierania publicznie dostępnych danych z pinów, tablic i wyników wyszukiwania Pinterest poprzez wewnętrzne Resource API lub parsowanie HTML. W 2026 wymaga proxy residencjalnych z geo-targetowaniem, paginacji bookmark i higieny fingerprint, ponieważ Pinterest zaostrzył anti-bot scoring i per-IP rate limiting.

Dlaczego proxy są potrzebne do scrapowania Pinterest?

Pinterest stosuje rate limiting per-IP (często ~50–100 żądań/min) oraz bot scoring oparty na geolokalizacji, nagłówkach i wzorcu ruchu. Bez rotujących proxy residencjalnych szybko otrzymasz HTTP 429 lub CAPTCHA. Dodatkowo wyniki wyszukiwania i rekomendacje są zlokalizowane — geo-targetowanie (np. -country-US) daje kontrolę nad rynkiem, z którego pochodzą dane.

Który typ proxy działa najlepiej dla scrapowania Pinterest?

Proxy residencjalne z geo-targetowaniem są optymalne — pochodzą z ISP, wyglądają jak ruch realnych użytkowników i wspierają targeting kraj/miasto. Proxy datacenter są łatwiej wykrywane przez anti-bot Pinterest. Mobile proxies są alternatywą dla bardzo wysokiej niezawodności, ale są droższe. ProxyHat oferuje wszystkie trzy typy — zobacz cennik.

Jak unikać blokad podczas scrapowania Pinterest?

Stosuj pacing 2–3s między żądaniami, rotuj IP per-request lub używaj sticky sessions dla ciągłości csrftoken, dopasuj Accept-Language do geo proxy, utrzymuj aktualny X-APP-VERSION, używaj realistycznego User-Agent i obsługuj HTTP 429 z backoff 60s. Nigdy nie omijaj CAPTCHA ani login walls — to narusza ToS.

Czy scrapowanie Pinterest jest legalne?

Scrapowanie publicznie dostępnych, nieosobistych danych (piny, obrazy, tytuły) jest ogólnie legalne, ale zależy od jurysdykcji. W USA CFAA ogranicza dostęp do danych chronionych zabezpieczeniami technicznymi. W UE RODO (GDPR) wymaga podstawy prawnej dla danych osobowych. Zawsze sprawdzaj ToS Pinterest, robots.txt i skonsultuj się z prawnikiem dla zastosowań komercyjnych.

Często zadawane pytania

Czym jest scrapowanie pinów i tablic Pinterest w 2026?

To proces automatycznego pobierania publicznie dostępnych danych z pinów, tablic i wyników wyszukiwania Pinterest poprzez wewnętrzne Resource API lub parsowanie HTML. W 2026 wymaga proxy residencjalnych z geo-targetowaniem, paginacji bookmark i higieny fingerprint, ponieważ Pinterest zaostrzył anti-bot scoring i per-IP rate limiting.

Dlaczego proxy są potrzebne do scrapowania Pinterest?

Pinterest stosuje rate limiting per-IP (często ~50–100 żądań/min) oraz bot scoring oparty na geolokalizacji, nagłówkach i wzorcu ruchu. Bez rotujących proxy residencjalnych szybko otrzymasz HTTP 429 lub CAPTCHA. Dodatkowo wyniki wyszukiwania i rekomendacje są zlokalizowane — geo-targetowanie (np. -country-US) daje kontrolę nad rynkiem, z którego pochodzą dane.

Który typ proxy działa najlepiej dla scrapowania Pinterest?

Proxy residencjalne z geo-targetowaniem są optymalne — pochodzą z ISP, wyglądają jak ruch realnych użytkowników i wspierają targeting kraj/miasto. Proxy datacenter są łatwiej wykrywane przez anti-bot Pinterest. Mobile proxies są alternatywą dla bardzo wysokiej niezawodności, ale są droższe. ProxyHat oferuje wszystkie trzy typy.

Jak unikać blokad podczas scrapowania Pinterest?

Stosuj pacing 2–3s między żądaniami, rotuj IP per-request lub używaj sticky sessions dla ciągłości csrftoken, dopasuj Accept-Language do geo proxy, utrzymuj aktualny X-APP-VERSION, używaj realistycznego User-Agent i obsługuj HTTP 429 z backoff 60s. Nigdy nie omijaj CAPTCHA ani login walls — to narusza ToS.

Czy scrapowanie Pinterest jest legalne?

Scrapowanie publicznie dostępnych, nieosobistych danych (piny, obrazy, tytuły) jest ogólnie legalne, ale zależy od jurysdykcji. W USA CFAA ogranicza dostęp do danych chronionych zabezpieczeniami technicznymi. W UE RODO (GDPR) wymaga podstawy prawnej dla danych osobowych. Zawsze sprawdzaj ToS Pinterest, robots.txt i skonsultuj się z prawnikiem dla zastosowań komercyjnych.

Gotowy, aby zacząć?

Dostęp do ponad 50 mln rezydencjalnych IP w ponad 148 krajach z filtrowaniem AI.

Zobacz cenyProxy rezydencjalne
← Powrót do Bloga