Pinterestのピンとボードをスクレイピングする方法 2026 — 開発者向け実践ガイド

Pinterestの公開ピン・ボード・検索結果を residential proxy 経由で取得する方法を解説。内部 Resource API の扱い方、ページネーション、指紋リスク回避、倫理的スクレイピングまで網羅した開発者向けガイド。

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

Pinterestのピンとボードをスクレイピングする方法 2026 — はじめに

本記事は Pinterestのピンとボードをスクレイピングする方法 2026 をテーマに、公開ピン・ボードフィード・検索結果を residential proxy 経由で取得する実践手順を開発者向けに解説します。ビジュアルコンテンツとトレンドデータセットの構築、価格・流行の監視、SERP/ソーシャル調査を想定しています。

法的・利用規約に関する注意: Pinterestの利用規約(Terms of Service)は自動収集を制限する条項を含みます。米国では CFAA(Computer Fraud and Abuse Act)、EUでは GDPR が適用される場合があります。本記事は公開・非個人のピンデータへのアクセスのみを対象とし、ログイン必須のホームフィードや個人データの収集は推奨しません。本番環境では公式 Pinterest API v5 の利用を最優先してください。

Pinterestの公開面とログイン壁の違い

Pinterestには大きく分けて二つのデータ面があります。一方は公開面(個別ピンページ、公開ボードフィード、検索結果ページ)で、これらはログインなしでブラウザから閲覧可能です。もう一方はログイン壁の奥にあるパーソナライズされたホームフィードや推薦フィードで、こちらはアカウントごとに最適化され、スクレイピングは利用規約上も技術的にも推奨されません。

公式の Pinterest API v5 は本番用途では最も安全な経路ですが、アクセス範囲が限られており、ボードのピン一覧や検索結果の網羅的な取得には向かない場合があります。そのため、公開ピンとボードフィードを対象とした軽量な調査用途では、Pinterestの内部 Resource API を経由するアプローチが開発者の間で広く使われています。

Pinterestの内部 Resource API を理解する

ブラウザでPinterestを開くと、フロントエンドは /resource/<ResourceName>/get/ 形式の内部エンドポイントを呼び出します。代表的なものを以下に挙げます。

  • PinResource/resource/PinResource/get/:単一ピンのメタデータ取得。
  • BoardFeedResource/resource/BoardFeedResource/get/:ボード内のピン一覧(ページネーション付き)。
  • SearchResource/resource/SearchResource/get/:キーワード検索結果。

これらのエンドポイントは ?source_url= パラメータ(例: /search/pins/?q=keyword)と、URLエンコードされた JSONdata パラメータを受け取ります。リクエストには以下のヘッダーが実質的に必須です。

  • X-Pinterest-PWS-Handler — フロントエンドが内部ルーティングに使う識別子。
  • X-APP-VERSION — アプリのビルドバージョン(定期的に更新されます)。
  • csrftoken — クッキー経由で発行されるCSRFトークン。

レスポンスは JSON で、ピン配列と bookmark カーソルを含みます。このカーソルを使って次ページを取得するのが基本パターンです。

アンチボットの現実と residential proxy の必要性

PinterestはIPごとのレート制限とボットスコアリングを組み合わせて自動収集を検知します。データセンタIPは検出されやすく、短時間で 403/429 が返ります。さらに検索結果と推薦フィードは地理的にローカライズされるため、米国のトレンドを調べるのに日本のIPを使うと結果が偏ります。

このため、回転する residential proxy と地理指定(例: -country-US)の組み合わせが実用的です。ProxyHat のゲートウェイ gate.proxyhat.com:8080 を使えば、ユーザー名フラグで国・都市・セッションを制御できます。

プロキシタイプ検出耐性地理指定Pinterest向き
datacenter低い限定的不向き(高速ブロック)
residential(回転)高い国/都市推奨(公開ピン収集)
mobile非常に高い高難度サイト向け

実装例1: Python で BoardFeedResource をページネーション

ProxyHat の residential proxy を requests 経由で使い、ボードのピン一覧を取得する例です。セッション固定(-session-)で csrftoken の連続性を保ちつつ、bookmark カーソルでページ送りします。

import requests, json, urllib.parse

PROXY = "http://user-country-US-session-b1: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/124.0 Safari/537.36",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "X-Requested-With": "XMLHttpRequest",
    "X-APP-VERSION": "a1b2c3d",  # 現行ビルドに置き換える
}

board = "username/board-slug"
bookmark = None
pins = []

for page in range(5):
    data = {
        "options": {"board_id": None, "board_url": board, "page_size": 25},
        "context": {}
    }
    if bookmark:
        data["options"]["bookmarks"] = [bookmark]
    params = {
        "source_url": f"/{board}/",
        "data": json.dumps(data, separators=(",", ":"))
    }
    url = "https://www.pinterest.com/resource/BoardFeedResource/get/"
    r = requests.get(url, headers=headers, params=params,
                     proxies=proxies, timeout=20)
    r.raise_for_status()
    payload = r.json()
    results = payload.get("resource_response", {}).get("data", [])
    for pin in results:
        pins.append({
            "id": pin.get("id"),
            "title": pin.get("title") or pin.get("grid_title"),
            "image": (pin.get("images", {}) or {}).get("orig", {}).get("url"),
            "link": pin.get("link")
        })
    bm = payload.get("resource", {}).get("next_page_pin")
    bookmark = bm or (payload.get("resource_response", {}).get("bookmark"))
    if not bookmark:
        break

print(f"取得ピン数: {len(pins)}")
print(json.dumps(pins[0], ensure_ascii=False, indent=2))

取得したピンオブジェクトは、idtitle、画像URL、外部リンクを持つ軽量構造に正規化できます。本番では1ボードあたり数百〜数千ピンになるため、ペース配分が重要です。

実装例2: Node.js で HTTP ゲートウェイ経由の取得

Node.js でも同じ Resource API を HTTP プロキシ gate.proxyhat.com:8080 経由で叩けます。ここでは axioshttps-proxy-agent を使います。

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

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

const headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                + '(KHTML, like Gecko) Chrome/124.0 Safari/537.36',
  'Accept': 'application/json, text/javascript, */*; q=0.01',
  'X-Requested-With': 'XMLHttpRequest',
  'X-APP-VERSION': 'a1b2c3d'
};

async function fetchSearch(q) {
  const data = { options: { query: q, page_size: 25 }, context: {} };
  const params = new URLSearchParams({
    source_url: `/search/pins/?q=${encodeURIComponent(q)}`,
    data: JSON.stringify(data)
  });
  const url = `https://www.pinterest.com/resource/SearchResource/get/?${params}`;
  const res = await axios.get(url, { headers, httpsAgent: agent, timeout: 20000 });
  const items = res.data.resource_response.data || [];
  return items.map(p => ({
    id: p.id,
    title: p.title || p.grid_title,
    image: p.images?.orig?.url,
    link: p.link
  }));
}

fetchSearch('minimalist desk').then(console.log).catch(console.error);

ページネーション・指紋リスク・ペース配分

Resource API のページネーションは bookmark カーソルで進みます。レスポンス内の resource.next_page_pin または resource_response.bookmark を次リクエストの options.bookmarks に渡すのが基本です。カーソルが空になったら終端です。

sticky session-session-abc123)は csrftoken の連続性を保つために有用です。同じセッションIDを使い続けると、Pinterest側は同じ「ブラウザ」として扱い、トークン再発行による失敗を減らせます。ただし同じIPで長時間稼働し続けるとスコアリングに引っかかるため、セッションは数十リクエストごとに切り替えるのが現実的です。

  • ペース配分: 1 IPあたり 1〜2 req/秒 程度に抑え、ランダムなスリープを挟む。
  • User-Agent 衛生: 実在する最新ブラウザのUAを使い、ヘッダー順序も含めて模倣する。
  • 指紋リスク: Accept-LanguageSec-CH-UA、TLS指纹を地理と一致させる(例: -country-US なら英語ロケール)。
  • robots.txt 尊重: /robots.txt で禁止されたパスは収集しない。

ProxyHat のセットアップと内部リンク

ProxyHat の residential proxy はユーザー名フラグで国・都市・セッションを制御できます。HTTP は gate.proxyhat.com:8080、SOCKS5 は gate.proxyhat.com:1080 を使用します。

# curl で SOCKS5 経由のピン取得テスト
curl -x socks5://user-country-US-session-t1:pass@gate.proxyhat.com:1080 \
  -H "User-Agent: Mozilla/5.0 ..." \
  "https://www.pinterest.com/resource/PinResource/get/?source_url=/pin/123/&data=%7B%22options%22%3A%7B%22id%22%3A%22123%22%7D%7D"

関連リソース: 料金は /ja/pricing、ロケーション一覧は /ja/locations、ウェブスクレイピングのユースケースは /ja/use-cases/web-scraping、SERP追跡は /ja/use-cases/serp-tracking、技術詳細は 公式ドキュメント を参照してください。

倫理的スクレイピングと公式APIの使い分け

本記事が対象とするのは公開・非個人のピンデータのみです。個人のホームフィード、ログイン必須の推薦、プロフィールの非公開情報は収集しないでください。GDPR下では個人データに該当する可能性のある内容(作成者の識別情報など)は避け、ピン自体の公開メタデータに留めるのが安全です。

本番環境で安定性が求められる場合は、公式 Pinterest API v5 の利用を最優先に検討してください。公式APIは利用規約に準拠し、レート制限も明示的で、長期的な運用コストが最も低くなります。内部 Resource API 経由の収集は、公式APIではカバーできない公開ボード・検索結果の軽量調査用途に限定するのが倫理的にも実務的にも適切です。

Key Takeaways

  • Pinterestの公開ピン・ボード・検索結果は内部 Resource API(/resource/<Name>/get/)で取得可能。
  • 必須ヘッダーは X-Pinterest-PWS-HandlerX-APP-VERSIONcsrftoken。ページネーションは bookmark カーソル。
  • データセンタIPは即ブロック。回転 residential proxy + 地理指定(-country-US 等)が実用的。
  • sticky session(-session-)で csrftoken 連続性を確保しつつ、数十リクエストごとにセッション切替。
  • 本番は公式 Pinterest API v5 を最優先。内部APIは公開・非個人データの軽量調査用途のみ。

始める準備はできましたか?

AIフィルタリングで148か国以上、5,000万以上のレジデンシャルIPにアクセス。

料金を見るレジデンシャルプロキシ
← ブログに戻る