2026년 Pinterest 핀과 보드 스크래핑 완전 가이드

Pinterest의 내부 Resource API를 활용해 공개 핀과 보드 데이터를 수집하는 개발자 중심 가이드입니다. 프록시 회전, 페이지네이션, 안티봇 우회 전략과 윤리적 스크래핑까지 실용 코드와 함께 다룹니다.

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

주의: 이 가이드는 Pinterest의 이용약관(ToS), 미국의 컴퓨터 사기 및 남용 방지법(CFAA), 그리고 EU의 일반 개인정보 보호법(GDPR)을 존중하는 공개 데이터 접근만을 다룹니다. 로그인이 필요한 비공개 콘텐츠, 개인정보, 저작권 보호 콘텐츠를 무단 수집하지 마십시오. 상업적 사용 전에는 반드시 법무팀과 검토하십시오.

2026년에도 Pinterest 핀과 보드 스크래핑은 시각적 트렌드 데이터셋을 구축하려는 개발자들에게 핵심 과제입니다. Pinterest는 월 5억 명 이상의 활성 사용자를 보유한 시각 검색 플랫폼으로, 패션·홈데코·푸드 트렌드 분석에 풍부한 공개 데이터를 제공합니다. 하지만 강력한 안티봇 시스템, 로컬라이징된 검색 결과, 복잡한 내부 API 구조 때문에 단순 HTTP 클라이언트로는 데이터를 안정적으로 수집하기 어렵습니다. 이 가이드에서는 Pinterest의 공개 표면 — 핀, 보드 피드, 검색 결과 — 에 집중하여, 회전 residential 프록시와 함께 Pinterest 스크래핑 파이프라인을 구축하는 방법을 실용 코드로 설명합니다.

Pinterest 공개 표면 vs 로그인 월: Pinterest 핀과 보드 스크래핑의 범위

Pinterest의 데이터는 접근 권한에 따라 두 영역으로 나뉩니다. Pinterest 핀과 보드 스크래핑을 설계할 때 이 경계를 명확히 이해하는 것이 첫 번째 단계입니다.

  • 공개 표면 (로그인 불필요): 공개 보드의 핀 피드, 핀 상세 페이지, 공개 검색 결과, 프로필/보드 페이지. 이 영역은 robots.txt가 허용하는 한 일반적으로 접근 가능합니다.
  • 로그인 월 (login-walled): 홈 피드 추천, 개인화된 추천, 비공개 보드, 저장된 핀 목록. 이 영역은 인증이 필요하며, 자동화된 접근은 ToS 위반 소지가 큽니다.

Pinterest는 공개 데이터 접근을 위한 Pinterest API v5를 공식적으로 제공합니다. 하지만 v5 API는 주로 광고 관리와 핀 생성에 초점이 맞춰져 있으며, 검색 결과 스크래핑이나 보드 피드의 대량 수집에는 rate limit(분당 1,000회 요청 등)과 엔드포인트 제한이 있습니다. 공개 보드의 핀 메타데이터를 대규모로 수집하려면 Pinterest의 내부 Resource API를 이해해야 합니다.

Pinterest 내부 Resource API 구조 이해

Pinterest 웹 프런트엔드는 https://www.pinterest.com/resource/ 경로 아래에 JSON 기반 내부 API를 사용합니다. 각 요청은 ?source_url= 파라미터와 URL 인코딩된 JSON data 파라미터로 구성됩니다. 주요 리소스 엔드포인트는 다음과 같습니다.

리소스엔드포인트용도
PinResource/resource/PinResource/get/개별 핀 메타데이터 (id, title, 이미지 URL, 링크)
BoardFeedResource/resource/BoardFeedResource/get/보드 내 핀 목록 페이지네이션
SearchResource/resource/SearchResource/get/키워드 검색 결과
BoardResource/resource/BoardResource/get/보드 메타데이터 (이름, 설명, 팔로워 수)

이 엔드포인트들은 일반 웹 요청과 동일한 세션 컨텍스트에서 작동하며, 다음 헤더가 필수적입니다.

  • X-Pinterest-PWS-Handler — 프런트엔드 핸들러 식별자 (예: www/[username]/[slug].js)
  • X-APP-VERSION — Pinterest 웹앱 버전 (예: abc123, 페이지 HTML에서 추출 가능)
  • csrftoken — 쿠키에서 가져오는 CSRF 토큰, X-CSRFToken 헤더로도 전송
  • User-Agent — 최신 브라우저 UA 문자열 (핑거프린팅 위험 감소)

예를 들어 BoardFeedResource 요청은 다음과 같은 형태를 취합니다:

GET /resource/BoardFeedResource/get/?source_url=%2Fboard%2Fusername%2Fboard-slug%2F&data=%7B%22options%22%3A%7B%22board_id%22%3A%224980123456789012%22%2C%22page_size%22%3A25%2C%22bookmarks%22%3A%5B%5D%7D%2C%22context%22%3A%7B%7D%7D

bookmarks 배열은 커서 기반 페이지네이션에 사용됩니다. 응답의 resource_response.bookmark 필드에 다음 페이지 커서가 포함되며, -end- 값이 반환되면 페이지네이션이 종료됩니다.

안티봇 현실과 프록시 전략

Pinterest는 IP당 요청 빈도를 추적하고 봇 스코어링을 수행합니다. 단일 IP에서 짧은 시간에 수백 건의 Resource API 요청이 발생하면 HTTP 429(Too Many Requests) 또는 403이 반환됩니다. 또한 Pinterest의 검색 결과와 추천은 사용자의 지역에 따라 현지화됩니다. 예를 들어 미국 IP에서 검색한 "fall fashion" 결과와 일본 IP에서의 결과는 다릅니다.

이러한 이유로 Pinterest 스크래핑에는 회전 residential 프록시가 필수적입니다. Residential IP는 실제 ISP에서 할당된 IP이므로 데이터센터 IP보다 봇 스코어가 낮습니다. 지역 타겟팅(예: -country-US)을 통해 특정 국가의 로컬라이징된 검색 결과를 일관되게 수집할 수 있습니다.

ProxyHat residential 프록시를 사용하면 게이트웨이 gate.proxyhat.com:8080을 통해 HTTP 프록시 연결을 설정하고, 사용자명에 지역 및 세션 플래그를 포함할 수 있습니다. 자세한 연결 정보는 ProxyHat 문서를 참조하십시오.

Python으로 BoardFeedResource 페이지네이션하기

다음은 Python requests 라이브러리를 사용해 ProxyHat residential 프록시를 통해 Pinterest 보드 피드를 페이지네이션하는 예제입니다. sticky 세션(-session-)을 사용해 CSRF 토큰 연속성을 유지하고, -country-US로 미국 지역 결과를 수집합니다.

import requests
import json
import time
import urllib.parse

# ProxyHat residential proxy 설정
PROXY = "http://user-country-US-session-pinterest01: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/131.0.0.0 Safari/537.36",
    "X-Pinterest-PWS-Handler": "www/[username]/[slug].js",
    "X-APP-VERSION": "abc123def456",
    "Accept": "application/json",
    "Accept-Language": "en-US,en;q=0.9",
}

board_slug = "username/board-slug"
board_id = "4980123456789012"
bookmarks = []
all_pins = []
max_pages = 10

for page in range(max_pages):
    options = {
        "board_id": board_id,
        "page_size": 25,
        "bookmarks": bookmarks,
    }
    data_param = json.dumps({"options": options, "context": {}})
    source_url = f"/board/{board_slug}/"

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

    url = "https://www.pinterest.com/resource/BoardFeedResource/get/"
    resp = requests.get(url, headers=headers, params=params, proxies=proxies, timeout=30)

    if resp.status_code == 429:
        print(f"Rate limited at page {page}, waiting 60s...")
        time.sleep(60)
        continue

    if resp.status_code != 200:
        print(f"Error {resp.status_code} at page {page}")
        break

    payload = resp.json()
    results = payload.get("resource_response", {}).get("data", [])

    for pin in results:
        pin_data = {
            "id": pin.get("id"),
            "title": pin.get("title", ""),
            "description": pin.get("description", ""),
            "image_url": pin.get("images", {}).get("orig", {}).get("url", ""),
            "link": pin.get("link", ""),
        }
        all_pins.append(pin_data)

    bookmark = payload.get("resource_response", {}).get("bookmark", "")
    if not bookmark or bookmark == "-end-":
        print("Reached end of board feed.")
        break

    bookmarks = [bookmark]
    time.sleep(2)  # pacing: 요청 간 2초 대기

print(f"Collected {len(all_pins)} pins from board.")
for p in all_pins[:3]:
    print(json.dumps(p, indent=2, ensure_ascii=False))

이 코드는 bookmarks 커서를 사용해 최대 10페이지(페이지당 25핀, 최대 250핀)를 수집합니다. 429 응답 시 60초 대기 후 재시도하는 단순 백오프를 포함합니다. 실제 운영 환경에서는 지수 백오프와 회전 세션 전환을 추가하는 것이 좋습니다.

Node.js로 Pinterest 검색 결과 수집하기

Node.js 환경에서는 axios와 ProxyHat HTTP 게이트웨이(포트 8080)를 사용해 SearchResource를 호출할 수 있습니다. 다음 예제는 키워드 검색 결과의 첫 페이지를 수집합니다.

const axios = require('axios');

const PROXY_HOST = 'gate.proxyhat.com';
const PROXY_PORT = 8080;
const PROXY_USER = encodeURIComponent('user-country-US-session-pinterest02');
const PROXY_PASS = encodeURIComponent('pass');
const PROXY_URL = `http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`;

const headers = {
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
  'X-Pinterest-PWS-Handler': 'www/search/[scope].js',
  'X-APP-VERSION': 'abc123def456',
  'Accept': 'application/json',
  'Accept-Language': 'en-US,en;q=0.9',
};

async function searchPins(keyword, maxPages = 5) {
  const allResults = [];
  let bookmarks = [];

  for (let page = 0; page < maxPages; page++) {
    const options = {
      query: keyword,
      page_size: 25,
      bookmarks: bookmarks,
    };
    const dataParam = JSON.stringify({ options, context: {} });
    const sourceUrl = `/search/pins/?q=${encodeURIComponent(keyword)}`;

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

    try {
      const resp = await axios.get(
        'https://www.pinterest.com/resource/SearchResource/get/',
        {
          headers,
          params,
          proxy: { host: PROXY_HOST, port: PROXY_PORT, auth: { username: 'user-country-US-session-pinterest02', password: 'pass' } },
          timeout: 30000,
        }
      );

      const data = resp.data.resource_response?.data || [];
      data.forEach((pin) => {
        allResults.push({
          id: pin.id,
          title: pin.title || '',
          image_url: pin.images?.orig?.url || '',
          link: pin.link || '',
        });
      });

      const bookmark = resp.data.resource_response?.bookmark;
      if (!bookmark || bookmark === '-end-') break;
      bookmarks = [bookmark];

      await new Promise((r) => setTimeout(r, 2000)); // 2초 pacing
    } catch (err) {
      console.error(`Page ${page} error: ${err.message}`);
      if (err.response?.status === 429) {
        await new Promise((r) => setTimeout(r, 60000));
      }
      break;
    }
  }

  return allResults;
}

searchPins('minimalist home decor').then((r) => {
  console.log(`Collected ${r.length} search results.`);
  r.slice(0, 3).forEach((p) => console.log(JSON.stringify(p, null, 2)));
});

페이지네이션, 세션, 페이싱 및 핑거프린팅 위험 관리

Bookmark 커서 페이지네이션

Pinterest의 Resource API는 offset 기반이 아닌 bookmark 커서 기반 페이지네이션을 사용합니다. 각 응답에 포함된 bookmark 문자열을 다음 요청의 bookmarks 배열에 넣어 다음 페이지를 가져옵니다. -end-가 반환되면 더 이상 데이터가 없다는 의미입니다. 커서는 세션에 종속적이므로, 동일한 sticky 세션을 유지하지 않으면 커서가 무효화될 수 있습니다.

Sticky 세션으로 CSRF 토큰 연속성 유지

Pinterest Resource API는 CSRF 토큰을 쿠키로 발급합니다. IP가 회전할 때마다 새 쿠키/토큰이 발급되면 세션 컨텍스트가 끊어집니다. ProxyHat의 -session- 플래그를 사용하면 동일한 residential IP를 sticky 세션으로 유지할 수 있어, 한 페이지네이션 시퀀스 동안 CSRF 토큰 연속성을 보장합니다.

# sticky 세션으로 동일 IP 유지
http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080

페이지네이션 시퀀스가 끝나면 세션 ID를 변경하여 새 IP로 회전합니다. 이렇게 하면 한 보드 수집에 하나의 IP를 사용하고, 다음 보드는 다른 IP로 수집해 IP당 요청 밀도를 낮춥니다.

페이싱

요청 간 최소 2초 대기를 권장합니다. 단일 IP에서 분당 30~60회 이상의 요청은 봇 스코어 상승으로 이어집니다. 대규모 수집 시 여러 sticky 세션을 병렬로 운영하고 각 세션당 요청 속도를 제한하는 것이 효과적입니다.

User-Agent 및 헤더 위생

핑거프린팅 위험을 줄이려면 최신 브라우저 UA 문자열을 사용하고, Accept, Accept-Language, Sec-Fetch-* 헤더를 일관되게 전송하십시오. 헤더가 누락되거나 불일치하면 봇 탐지 점수가 올라갑니다. 자세한 핑거프린팅 기법은 MDN User-Agent 문서를 참조하십시오.

ProxyHat 설정 및 활용 가이드

ProxyHat residential 프록시는 Pinterest 스크래핑에 이상적인 조건을 제공합니다. 다음은 주요 설정 요소입니다.

  • 게이트웨이: gate.proxyhat.com (HTTP: 포트 8080, SOCKS5: 포트 1080)
  • 지역 타겟팅: user-country-US:pass — 미국 IP로 로컬라이징된 검색 결과 수집
  • 도시 타겟팅: user-country-DE-city-berlin:pass — 특정 도시 수준 타겟팅
  • Sticky 세션: user-session-abc123:pass — 페이지네이션 중 동일 IP 유지
  • 조합: user-country-US-session-board01:pass — 지역 + 세션 동시 적용

ProxyHat의 요금제는 사용량 기반으로 설계되어 있어, 소규모 실험부터 대규모 프로덕션까지 유연하게 확장할 수 있습니다. 지원되는 국가 및 도시 목록은 프록시 위치 페이지에서 확인하십시오. 웹 스크래핑 및 SERP 추적 use case에 대한 자세한 가이드는 웹 스크래핑SERP 추적 페이지를 참조하십시오.

윤리적 스크래핑과 공식 API 사용 시기

Pinterest 스크래핑을 설계할 때 윤리적 가이드라인을 준수하는 것은 법적 리스크를 줄일 뿐만 아니라 데이터 품질과 수집 안정성에도 도움이 됩니다. 다음 원칙을 권장합니다.

  1. 공개 비개인 핀 데이터만 수집: 공개 보드의 핀 메타데이터(제목, 이미지 URL, 링크)는 수집 대상으로 적합합니다. 사용자 프로필 정보, 이메일, 비공개 보드 데이터는 수집하지 마십시오.
  2. robots.txt 존중: https://www.pinterest.com/robots.txt를 확인하고 허용된 경로만 수집하십시오.
  3. 요청 속도 제한: Pinterest 서버에 부하를 주지 않도록 적절한 페이싱을 유지하십시오.
  4. 저작권 존중: 핀 이미지 자체를 다운로드하여 재사용하는 것은 저작권 침해 소지가 있습니다. 메타데이터와 썸네일 URL만 수집하고, 이미지 사용은 원본 출처를 따르십시오.
  5. 프로덕션 환경에서는 공식 API 우선: 상업적 서비스를 구축하는 경우, Pinterest API v5를 우선적으로 평가하십시오. 공식 API는 안정성과 법적 보호를 제공하며, rate limit 내에서 핀 관리, 보드 조회, 분석 데이터에 접근할 수 있습니다. 내부 Resource API 스크래핑은 공식 API로 접근할 수 없는 공개 검색 결과의 대량 수집이 필요한 경우에 한정하는 것이 좋습니다.

핵심 원칙: 공개 데이터에 대한 접근은 광범위하게 허용되지만, 각 플랫폼의 ToS와 현지법을 준수하는 것이 장기적 지속 가능성의 기초입니다. 스크래핑 코드는 언제든 차단될 수 있으므로, 비즈니스 크리티컬한 파이프라인은 공식 API 기반으로 구축하십시오.

Key Takeaways

  • Pinterest의 공개 표면(핀, 보드 피드, 검색 결과)은 로그인 없이 접근 가능하지만, 홈 피드 추천과 비공개 보드는 로그인이 필요하며 ToS 위반 리스크가 큽니다.
  • 내부 Resource API(/resource/BoardFeedResource/get/ 등)는 ?source_url=과 URL 인코딩된 JSON data 파라미터, 그리고 X-Pinterest-PWS-Handler, X-APP-VERSION, csrftoken 헤더를 필요로 합니다.
  • 검색 결과와 추천이 지역별로 현지화되므로, -country-US 지역 타겟팅이 포함된 회전 residential 프록시가 필수적입니다.
  • Bookmark 커서 페이지네이션과 sticky -session- 플래그를 조합해 CSRF 토큰 연속성을 유지하면서 IP당 요청 밀도를 낮춰야 합니다.
  • 프로덕션 환경에서는 Pinterest API v5를 우선 평가하고, 내부 API 스크래핑은 공식 API로 커버되지 않는 공개 검색 데이터 수집에 한정하십시오.

시작할 준비가 되셨나요?

AI 필터링으로 148개국 이상에서 5천만 개 이상의 레지덴셜 IP에 액세스하세요.

가격 보기레지덴셜 프록시
← 블로그로 돌아가기