免責事項:本記事は公開データへのアクセスのみを対象としています。Pinterestの利用規約(Terms of Service)を遵守し、米国のCFAA(Computer Fraud and Abuse Act)やEUのGDPR(General Data Protection Regulation)など適用される法令を確認してください。ログインが必要なデータや個人情報の収集は本記事の範囲外です。
2026年版:Pinterestのピンとボードのスクレイピング方法とは
Pinterestのピンとボードのスクレイピングは、視覚コンテンツとトレンドデータセットを構築する開発者にとって重要な技術です。公開されているピン、ボードフィード、検索結果は、公式APIの制限を補うデータソースとして利用できます。本ガイドでは、Pinterestの内部Resource APIの構造、アンチボット対策の実態、レジデンシャルプロキシを使った実装例を解説します。
Pinterestのスクレイピングを成功させるには、公開サーフェスとログイン壁の違いを理解し、適切なプロキシローテーションとペースリングを組み合わせる必要があります。詳細なユースケースについては、ウェブスクレイピングのユースケースを参照してください。
公開サーフェス vs ログイン壁:何が取得できるか
Pinterestには、ログインなしでアクセスできる公開サーフェスと、ログインが必要なプライベートサーフェスがあります。スクレイピングの対象は前者のみです。
公開データ(ログイン不要)
- 個別ピンページ:
/pin/{id}/— 画像URL、タイトル、説明文、リンク先URLが公開 - ボードフィード:
/{username}/{board-slug}/— ボード内のピン一覧が公開 - 検索結果:
/search/pins/?q={query}— クエリに基づく公開ピン - ユーザープロフィール: 公開ボード一覧とピン数
ログイン壁の背後にあるもの(対象外)
- ホームフィード(パーソナライズされたレコメンド)
- 秘密のボード(Secret boards)
- ユーザーの保存履歴やアクティビティ
公式Pinterest API v5の制限
Pinterestは公式API v5を提供していますが、アクセスにはOAuth認証が必要で、レート制限やエンドポイントの範囲に制約があります。公式APIの詳細はPinterest API v5ドキュメントを参照してください。本番環境では公式APIを優先すべきですが、公開ピンデータの大規模収集や、APIではカバーできない検索結果の取得には、公開サーフェースのスクレイピングが補完手段となります。
Pinterestの内部Resource APIの構造
PinterestのWebフロントエンドは、内部の「Resource API」と呼ばれるJSONエンドポイント群を使用してデータを取得しています。これらは公開サーフェースのレンダリングに使われるエンドポイントで、ブラウザの開発者ツールで確認できます。
主要なResourceエンドポイント
| エンドポイント | 用途 | 主なパラメータ |
|---|---|---|
/resource/PinResource/get/ | 個別ピンの詳細取得 | id |
/resource/BoardFeedResource/get/ | ボード内ピン一覧 | board_id, page_size, bookmarks |
/resource/SearchResource/get/ | 検索結果の取得 | query, scope |
/resource/BaseSearchResource/get/ | 新版検索(2024以降) | query, search_filter |
リクエストの構造
Resource APIの呼び出しは、?source_url=パラメータとURLエンコードされたJSON dataパラメータを伴います。例えばBoardFeedResourceを呼び出す場合、リクエストURLは以下のようになります:
GET /resource/BoardFeedResource/get/?source_url=%2Fuser%2Fboard%2F&data=%7B%22options%22%3A%7B%22board_id%22%3A%22123456789%22%2C%22page_size%22%3A25%2C%22bookmarks%22%3A%5B%22YXNkZmdoamts%22%5D%7D%7D
必須ヘッダー
Resource APIへのリクエストでは、以下のヘッダーが重要です:
- X-Pinterest-PWS-Handler: フロントエンドのハンドラー名(例:
www/[username]/[board].js) - X-APP-VERSION: フロントエンドのバージョン番号(ブラウザから取得可能)
- csrftoken: Cookieから取得するCSRFトークン
- User-Agent: リアルなブラウザのUA文字列
CSRFトークンはCookieベースで発行されるため、セッションをまたいで同じIPとCookieを使い続ける必要があります。ここでスティッキーセッションプロキシが重要になります。
アンチボットの実態とプロキシの必要性
Pinterestは、IPごとのレート制限とボットスコアリングによってスクレイピングを検出します。単一IPから短時間に大量リクエストを送ると、HTTP 429(Too Many Requests)や403(Forbidden)が返されます。実際、1IPあたり1分間に約50〜100リクエストを超えるとレート制限に抵触する傾向があります。
また、Pinterestの検索結果とレコメンデーションはローカライズされています。米国のIPから検索した結果と日本のIPから検索した結果は異なります。トレンドデータセットを特定地域に絞って収集するには、ジオターゲティング付きのプロキシが不可欠です。
なぜレジデンシャルプロキシなのか
データセンタープロキシのIPレンジは、Pinterestのアンチボットシステムによって比較的容易に識別されます。一方、レジデンシャルプロキシはISPに割り当てられた実際の住宅IPを使用するため、通常のユーザートラフィックと区別が困難です。プロキシサーバーのタイプ別の特徴はWikipediaでも確認できます。
ProxyHatのレジデンシャルプロキシでは、ユーザー名に国コードを指定することでジオターゲティングが可能です。例: user-country-US:pass。利用可能なロケーションはプロキシロケーション一覧で確認できます。
実装例1:PythonでBoardFeedResourceをページネーション
以下のPython例は、ProxyHatのHTTPゲートウェイを経由してBoardFeedResourceを呼び出し、bookmarkベースのページネーションでピンを取得します。レジデンシャルプロキシで米国IPを指定し、スティッキーセッションでCSRFトークンの継続性を確保しています。
import requests
import json
from urllib.parse import quote
# ProxyHat HTTP gateway — 米国IP + スティッキーセッション
proxy_url = "http://user-country-US-session-pint001:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
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]/[board].js",
"X-APP-VERSION": "b6d0c2e", # ブラウザから最新版を取得
"Accept": "application/json",
}
session = requests.Session()
session.proxies = proxies
# 初回リクエストでCookieとcsrftokenを取得
init_resp = session.get("https://www.pinterest.com/exampleuser/example-board/", headers=headers)
csrftoken = session.cookies.get("csrftoken", "")
headers["X-CSRFToken"] = csrftoken
board_id = "1234567890123456789"
bookmarks = [""]
all_pins = []
for page in range(5): # 最大5ページ
data = {
"options": {
"board_id": board_id,
"page_size": 25,
"bookmarks": bookmarks,
}
}
params = {
"source_url": "/exampleuser/example-board/",
"data": json.dumps(data),
}
resp = session.get(
"https://www.pinterest.com/resource/BoardFeedResource/get/",
headers=headers,
params=params,
timeout=30,
)
result = resp.json()
pins = result.get("resource_response", {}).get("data", [])
if not pins:
break
for pin in pins:
all_pins.append({
"id": pin.get("id"),
"title": pin.get("title", ""),
"image_url": pin.get("images", {}).get("orig", {}).get("url", ""),
"link": pin.get("link", ""),
})
bookmarks = result.get("resource_response", {}).get("bookmark", [""])
if not bookmarks or bookmarks == [""]:
break
import time
time.sleep(2) # ペースリング
print(f"取得したピン数: {len(all_pins)}")
for p in all_pins[:3]:
print(json.dumps(p, ensure_ascii=False, indent=2))
上記の例では、各ピンからid、title、image_url、linkを抽出しています。Pinterestのピンオブジェクトは非常に大きく、元画像URLやリッチメタデータを含むため、必要なフィールドだけを取り出すのが効率的です。
実装例2:Node.jsでHTTPゲートウェイ経由のスクレイピング
Node.js環境では、axiosとhttps-proxy-agentを組み合わせてProxyHatのHTTPゲートウェイ(ポート8080)を利用できます。
const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
const proxyAgent = new HttpsProxyAgent(
"http://user-country-US-session-pint002:pass@gate.proxyhat.com:8080"
);
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/[username]/[board].js",
"X-APP-VERSION": "b6d0c2e",
"Accept": "application/json",
};
async function scrapeBoard(boardId, maxPages = 5) {
const client = axios.create({
httpsAgent: proxyAgent,
headers,
timeout: 30000,
});
// 初回アクセスでCookie取得
const initResp = await client.get("https://www.pinterest.com/exampleuser/example-board/");
const setCookie = initResp.headers["set-cookie"] || [];
const csrfMatch = setCookie
.find(c => c.startsWith("csrftoken="))
?.match(/csrftoken=([^;]+)/);
const csrftoken = csrfMatch ? csrfMatch[1] : "";
headers["X-CSRFToken"] = csrftoken;
let bookmarks = [""];
const allPins = [];
for (let page = 0; page < maxPages; page++) {
const data = {
options: {
board_id: boardId,
page_size: 25,
bookmarks,
},
};
const params = new URLSearchParams({
source_url: "/exampleuser/example-board/",
data: JSON.stringify(data),
});
const resp = await client.get(
"https://www.pinterest.com/resource/BoardFeedResource/get/?" + params.toString()
);
const result = resp.data;
const pins = result?.resource_response?.data || [];
if (pins.length === 0) break;
for (const pin of pins) {
allPins.push({
id: pin.id,
title: pin.title || "",
image_url: pin.images?.orig?.url || "",
link: pin.link || "",
});
}
bookmarks = result?.resource_response?.bookmark || [""];
if (!bookmarks[0]) break;
await new Promise(r => setTimeout(r, 2000));
}
console.log(`取得したピン数: ${allPins.length}`);
return allPins;
}
scrapeBoard("1234567890123456789").catch(console.error);
ページネーション、スティッキーセッション、ペースリングのベストプラクティス
Bookmark(カーソル)ページネーション
PinterestのResource APIは、従来のオフセットベースではなく、bookmarkベースのカーソルページネーションを使用します。各レスポンスのresource_response.bookmarkに次ページのカーソルが含まれており、これを次リクエストのoptions.bookmarksに渡します。空のbookmarkが返されたら最終ページです。
スティッキーセッションでcsrftokenの継続性を確保
CSRFトークンはCookieに紐づいて発行されるため、リクエストごとにIPが変わるとCookieとIPの不整合が生じ、Pinterestがリクエストを拒否する可能性があります。ProxyHatでは、ユーザー名に-session-{id}を指定することで、同じセッションIDの間は同じ出口IPを維持できます。
# 同じセッションIDで同じIPを維持
proxy_url = "http://user-country-US-session-pint001:pass@gate.proxyhat.com:8080"
セッションの有効期間は通常10〜30分程度です。長時間の収集タスクでは、セッションIDを定期的に変更し、新しいCookieとCSRFトークンを取得し直す設計にしてください。
ペースリング
- 1リクエストあたり2〜5秒の待機を推奨
- 1IPあたり1分間に50リクエスト以下を維持
- エラー(429/403)を受信した場合は指数バックオフで待機時間を延長
- 複数ボードを並行収集する場合は、各スレッドに異なるセッションIDとプロキシIPを割り当てる
User-Agentの衛生管理
固定の古いUAや、ヘッドレスブラウザ特有のUA文字列はフィンガープリントのリスクを高めます。最新のChrome/FirefoxのUA文字列を使用し、必要に応じてAccept-Languageヘッダーをジオターゲットに合わせて設定してください。米国IPの場合はen-US,en;q=0.9、日本IPの場合はja,en;q=0.9などを設定します。
プロキシタイプの比較
| プロキシタイプ | Pinterestスクレイピングへの適性 | 特徴 |
|---|---|---|
| レジデンシャル | 最適 | ISP発行の住宅IP。検出されにくく、ジオターゲティング対応。 |
| モバイル | 高 | 携帯キャリアのIP。検出リスクは最低だがコストが高い。 |
| データセンター | 低 | IPレンジがブロックされやすい。大規模収集には不向き。 |
ProxyHatではレジデンシャル、モバイル、データセンタープロキシを提供しています。料金についてはProxyHatの料金ページを参照してください。技術的な接続詳細はProxyHatドキュメントで確認できます。
倫理的スクレイピングと公式APIの優先
スクレイピングは強力な技術ですが、責任を持って使用することが不可欠です。以下のガイドラインを守ってください。
倫理的スクレイピングの原則
- 公開・非個人データのみを収集する: ピンの画像URL、タイトル、リンク先など公開情報のみ。ユーザーの個人情報や非公開ボードにはアクセスしない。
- robots.txtを尊重する: Pinterestのrobots.txtを確認し、禁止されているパスをクロールしない。
- サーバーに負荷をかけない: 適切なペースリングとリトライ制限を設定する。
- データの利用目的を明確にする: 収集したデータの利用がGDPRやCCPAなど適用法令に合致することを確認する。
本番環境では公式APIを優先
本番システムや商用サービスでは、可能な限りPinterest API v5を使用してください。公式APIはレート制限やエンドポイントの制約がありますが、ToSに準拠し、安定性が保証されています。スクレイピングは、公式APIではカバーできない公開データの補完収集や、初期のトレンド分析に限定するのが安全なアプローチです。
SERP追跡や検索結果のモニタリングにプロキシを活用する方法については、SERPトラッキングのユースケースも参考になります。
Key Takeaways(重要ポイント)
- Pinterestの公開ピン・ボード・検索結果はログイン不要でアクセス可能。ホームフィードや秘密ボードは対象外。
- 内部Resource API(BoardFeedResource、SearchResource等)は
?source_url=とJSONdataパラメータで呼び出す。必須ヘッダーはX-Pinterest-PWS-Handler、X-APP-VERSION、csrftoken。- アンチボット対策として、レジデンシャルプロキシでジオターゲティング(
-country-US)とスティッキーセッション(-session-{id})を組み合わせる。- bookmarkベースのカーソルページネーションを使用し、2〜5秒のペースリングで429エラーを回避する。
- 倫理的スクレイピングを徹底し、本番環境ではPinterest API v5を優先する。
FAQ
Pinterestのピンとボードのスクレイピングとは何ですか?
Pinterestのピンとボードのスクレイピングとは、公開されているピン、ボードフィード、検索結果からデータをプログラムで取得する技術です。画像URL、タイトル、リンク先URLなどの公開メタデータを収集し、トレンド分析や視覚コンテンツデータセットの構築に利用します。ログイン壁の背後にあるデータは対象外です。
なぜPinterestスクレイピングにプロキシが必要なのですか?
PinterestはIPごとにレート制限とボットスコアリングを実施しており、単一IPから短時間に大量リクエストを送ると429や403エラーが発生します。レジデンシャルプロキシを使用することで、リクエストを複数の住宅IPに分散させ、検出リスクを低減できます。また、検索結果がローカライズされているため、ジオターゲティング付きプロキシで特定地域のデータを取得できます。
Pinterestスクレイピングに最適なプロキシタイプは何ですか?
レジデンシャルプロキシが最適です。ISP発行の住宅IPを使用するため、Pinterestのアンチボットシステムに通常のユーザートラフィックとして認識されやすく、データセンタープロキシと比べてブロックリスクが大幅に低くなります。モバイルプロキシはさらに検出リスクが低いですが、コストが高いため、大規模収集にはレジデンシャルが費用対効果に優れています。
Pinterestスクレイピングでブロックを回避するにはどうすればよいですか?
スティッキーセッションプロキシでCSRFトークンの継続性を確保し、1リクエストあたり2〜5秒のペースリングを維持し、最新のブラウザUser-Agentと適切なAccept-Languageヘッダーを使用してください。1IPあたり1分間50リクエスト以下を維持し、429エラーを受信した場合は指数バックオフで待機時間を延長してください。
Pinterest API v5とスクレイピングのどちらを使うべきですか?
本番環境や商用サービスではPinterest API v5を優先してください。公式APIはToSに準拠し、安定性が保証されています。スクレイピングは、公式APIではカバーできない公開データの補完収集や、初期のトレンド分析、研究目的に限定するのが安全なアプローチです。いずれの場合もPinterestの利用規約と適用法令を遵守してください。






