2026'da Pinterest pinleri ve panoları nasıl scrape edilir sorusu, görsel içerik ve trend veri setleri oluşturan geliştiriciler için giderek daha kritik hâle geliyor. Pinterest, milyarlarca pin ve pano barındıran bir görsel keşif platformudur ve bu içeriklerin önemli bir kısmı herkese açıktır. Ancak platform, otomatik erişime karşı katı anti-bot mekanizmaları uygular; bu nedenle başarılı bir Pinterest scraper kurmak, doğru proxy stratejisi, dahili API bilgisine ve dikkatli pacing gerektirir.
Yasal Uyarı: Bu rehber yalnızca herkese açık, kişisel olmayan pin verilerine erişimi ele alır. Pinterest'in Kullanım Şartları'na, ABD'de CFAA'ya ve AB'de GDPR'ye uygun davranmanız zorunludur. Login duvarı arkasındaki kişisel verileri toplamayın, robots.txt kurallarına saygı gösterin ve üretim ortamında resmi Pinterest API v5'i tercih edin.
2026'da Pinterest Pinleri ve Panoları Nasıl Scrape Edilir: Temel Yaklaşım
Pinterest'de scrape edilebilir üç ana herkese açık yüzey vardır: pin sayfaları (tek bir pinin görüntülendiği sayfa), pano beslemeleri (bir kullanıcı panosundaki pinlerin listesi) ve arama sonuçları. Bu yüzeylerin HTML'i, sunucu tarafında render edilmiş olsa da, asıl yapısal veri Pinterest'in dahili Resource API'si üzerinden JSON formatında gelir.
Buna karşılık, ana sayfa beslemesi (home feed) login duvarı arkasındadır ve kişiselleştirilmiş öneri algoritmalarıyla çalışır. Bu nedenle anonim erişilemez ve bu rehberin kapsamı dışındadır.
Resmi Pinterest API v5 ile Sınırlar
Pinterest, resmi olarak Pinterest API v5'i sunar. Ancak bu API öncelikli reklam ve iş hesapları için tasarlanmıştır. Ücretsiz tier'da günlük istek limitleri düşüktür (yaklaşık 10 istek/dakika yazma, okuma için sınırlı kotalar) ve pin arama, pano keşfi gibi özellikler kısıtlıdır. Görsel trend veri seti oluşturmak için gereken ölçekte (günde on binlerce pin) resmi API yetersiz kalır.
| Yöntem | Erişilebilir Veri | Rate Limit | Anti-Bot Riski | Uygun Senaryo |
|---|---|---|---|---|
| Resmi API v5 | Sahip olduğunuz pinler/panolar | Düşük (~10/dk) | Yok | Üretim, kendi hesabınız |
| Resource API (scrape) | Herkese açık pinler, panolar, arama | Orta-Yüksek | Yüksek | Trend araştırması, veri seti |
| HTML Scrape | Sınırlı, kırılgan | Düşük | Çok Yüksek | Önerilmez |
Pinterest'in Dahili Resource API'sini Anlamak
Pinterest'in web arayüzü, sayfa yüklendikten sonra veriyi dahili Resource API uç noktalarından çeker. Bu uç noktalar /resource/<ResourceName>/get/ formatındadır. En yaygın kullanılanlar:
- PinResource — tek bir pinin detaylarını döner (
/resource/PinResource/get/) - BoardFeedResource — bir panodaki pinlerin listesini sayfalı olarak döner
- SearchResource — arama sorgusu sonuçlarını döner
Bu uç noktalara istek atarken iki önemli parametre gerekir:
?source_url=— kullanıcının "bulunduğu" sayfanın URL yolu (örneğin/board/username/board-name/)data=— URL-encoded JSON parametresi; içindeoptionsnesnesi ve sayfalama içinbookmarksalanı bulunur
Gerekli HTTP başlıkları şunlardır:
X-Pinterest-PWS-Handler: www\[username, board\].js
X-APP-VERSION: 9b8c7a6 (herkesçe açık sürüm hash'i)
csrftoken: <cookie'ten alınan token>
User-Agent: Mozilla/5.0 ... (gerçek bir tarayıcı UA'sı)
Accept: application/json
csrftoken, Pinterest'in ilk sayfa ziyaretinde set ettiği bir çerezdir. Resource API isteklerinde bu token'ı göndermeniz gerekir. Bu, sticky session kullanımını zorunlu kılar — aynı IP ve çerez setini korumak için proxy tarafında -session- bayrağı kullanmalısınız.
Anti-Bot Gerçekleri ve Neden Rotasyonlu Residential Proxy Gerekir
Pinterest, IP başına istek hızını sıkı şekilde sınırlar. Tek bir IP'den dakikada 50–100 istek'i aşan trafik, bot skorlama sistemine takılır ve sonuç olarak 403 veya 429 yanıtları alırsınız. Ayrıca Pinterest'in arama ve öneri sonuçları coğrafi olarak lokalizedir — bir Almanya IP'sinden yapılan arama ile bir ABD IP'sinden yapılan arama farklı pinler döner.
Bu nedenle, doğru Pinterest scraper kurulumu için şu proxy özellikleri gerekir:
- Residential proxy'ler: Veri merkezi IP'leri Pinterest tarafından kolayca tespit edilir ve bloke edilir. Residential IP'ler gerçek İSS'lerden gelir ve bot skorlamasında daha düşük risk taşır.
- Coğrafi hedefleme:
-country-USveya-country-DEbayrakları ile arama sonuçlarının tutarlılığını sağlayın. - IP rotasyonu: Her istekte yeni IP alarak per-IP rate limit'i aşın; ancak
csrftokensürekliliği için sticky session kullanın.
ProxyHat'in residential proxy ağı, 100+ lokasyon üzerinde coğrafi hedefleme sunar. Fiyatlandırma sayfası'nda trafik bazlı paketleri inceleyebilirsiniz.
Python ile BoardFeedResource Sayfalama Örneği
Aşağıdaki örnek, bir Pinterest panosundaki pinleri BoardFeedResource üzerinden sayfalı olarak çeker. ProxyHat HTTP gateway'i üzerinden rotasyonlu residential proxy kullanır.
import requests
import json
from urllib.parse import quote
PROXY = "http://user-country-US-session-pin001:PASSWORD@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": "www\\[username, board\\].js",
"X-APP-VERSION": "9b8c7a6",
"X-Requested-With": "XMLHttpRequest",
}
def fetch_board_pins(username, board_slug, max_pages=10):
base_url = "https://www.pinterest.com/resource/BoardFeedResource/get/"
bookmarks = []
all_pins = []
# Önce ana sayfayı ziyaret et ve csrftoken al
session = requests.Session()
session.proxies = PROXIES
session.headers.update(HEADERS)
board_page = f"https://www.pinterest.com/{username}/{board_slug}/"
session.get(board_page)
csrf = session.cookies.get("csrftoken", "")
session.headers["X-CSRFToken"] = csrf
for page in range(max_pages):
options = {
"board_id": "",
"board_url": f"/{username}/{board_slug}/",
"page_size": 25,
"current_page": page,
"bookmarks": bookmarks,
}
data_param = quote(json.dumps({"options": options, "context": {}}))
source_url = quote(f"/{username}/{board_slug}/")
params = {"source_url": source_url, "data": data_param}
resp = session.get(base_url, params=params, timeout=30)
if resp.status_code != 200:
print(f"Sayfa {page}: HTTP {resp.status_code} — duraklatılıyor")
break
payload = resp.json()
pins = payload.get("resource_response", {}).get("data", [])
if not pins:
break
for pin in pins:
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("bookmark", [])
if not bookmarks:
break
return all_pins
pins = fetch_board_pins("username", "board-name", max_pages=5)
print(f"Toplam {len(pins)} pin çekildi")
for p in pins[:3]:
print(json.dumps(p, indent=2, ensure_ascii=False))
Bu örnekte dikkat edilecek noktalar: -session-pin001 bayrağı, tüm isteklerde aynı IP'yi koruyarak csrftoken sürekliliğini sağlar. Eğer 429 hatası alırsanız, session ID'yi değiştirin (örneğin -session-pin002) ve 60 saniye bekleyin.
Node.js ile HTTP Gateway Üzerinden Pinterest Arama
Aşağıdaki Node.js örneği, ProxyHat'in gate.proxyhat.com:8080 HTTP gateway'i üzerinden SearchResource uç noktasını çağırır:
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');
const proxyUrl = 'http://user-country-US-session-search01:PASSWORD@gate.proxyhat.com:8080';
const agent = new HttpsProxyAgent(proxyUrl);
const 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\\[search\\].js',
'X-APP-VERSION': '9b8c7a6',
'X-Requested-With': 'XMLHttpRequest',
};
async function searchPins(query, maxPages = 5) {
const client = axios.create({ httpsAgent: agent, timeout: 30000 });
let bookmarks = [];
const results = [];
// İlk sayfa ziyareti ile csrftoken al
const pageResp = await client.get('https://www.pinterest.com/search/pins/?q=' + encodeURIComponent(query), { headers });
const csrf = (pageResp.headers['set-cookie'] || [])
.find(c => c.startsWith('csrftoken='))
?.split('=')[1]?.split(';')[0] || '';
headers['X-CSRFToken'] = csrf;
for (let page = 0; page < maxPages; page++) {
const options = {
query,
scope: 'pins',
page_size: 25,
bookmarks,
};
const dataParam = encodeURIComponent(JSON.stringify({ options, context: {} }));
const sourceUrl = encodeURIComponent(`/search/pins/?q=${encodeURIComponent(query)}`);
const resp = await client.get('https://www.pinterest.com/resource/SearchResource/get/', {
params: { source_url: sourceUrl, data: dataParam },
headers,
});
if (resp.status !== 200) {
console.log(`Sayfa ${page}: HTTP ${resp.status} — duraklatılıyor`);
break;
}
const data = resp.data.resource_response?.data || [];
if (!data.length) break;
data.forEach(pin => {
results.push({
id: pin.id,
title: pin.title || pin.grid_title || '',
image_url: pin.images?.orig?.url || '',
link: pin.link || '',
});
});
bookmarks = resp.data.resource_response?.bookmark || [];
if (!bookmarks.length) break;
await new Promise(r => setTimeout(r, 2000)); // 2 saniye pacing
}
return results;
}
searchPins('minimalist interior design', 3)
.then(pins => console.log(JSON.stringify(pins, null, 2)))
.catch(err => console.error('Hata:', err.message));
Sayfalama, Sticky Session ve Fingerprint Riski
Bookmark/Cursor Sayfalama
Pinterest, sayfalama için geleneksel offset yerine bookmark tabanlı cursor sayfalama kullanır. Her Resource API yanıtı, bir bookmark alanı içerir. Bir sonraki sayfa için bu bookmark'ı options.bookmarks alanına koymanız gerekir. Bookmark boş bir dizi dönerse, son sayfaya ulaşmışsınız demektir.
Bookmark'lar opak string'lerdir — içeriğini parse etmeye çalışmayın, sadece sonraki isteğe iletin.
Sticky Session ile csrftoken Sürekliliği
csrftoken, Pinterest'in ilk sayfa ziyaretinde set ettiği bir çerezdir. Resource API isteklerinde bu token'ı göndermeniz gerekir. Eğer her istekte IP değişirse, token geçersiz hâle gelebilir. Bu nedenle ProxyHat kullanıcı adında -session-abc123 bayrağını kullanın:
# Aynı IP ve session'ı koru
http://user-country-US-session-myboard01:PASSWORD@gate.proxyhat.com:8080
Session ID'yi pano başına benzersiz yapın (örneğin -session-board-kitchen-ideas). Bu, her pano için ayrı bir IP ve çerez seti kullanmanızı sağlar.
Pacing ve Rate Limit Yönetimi
Pinterest'in per-IP rate limit'ini aşmamak için her istek arasında 1.5–3 saniye bekleme öneririz. Aşağıdaki pacing stratejilerini kullanın:
- Sabit gecikme: Her istek arasına 2 saniye koyun (basit, etkili).
- Rastgele gecikme: 1.5–4 saniye arası rastgele bekleme (daha doğal görünüm).
- Üstel geri çekilme: 429 aldıysanız, 30 → 60 → 120 saniye bekle ve session ID'yi değiştir.
ProxyHat ile 100 eşzamanlı oturum çalıştırabilirsiniz — her session farklı bir IP kullanır. Bu, toplam throughput'u artırırken per-IP rate limit'i aşmaz. Daha fazla bilgi için web scraping kullanım senaryosu sayfamıza bakın.
User-Agent ve Fingerprint Hygiene
Pinterest, User-Agent başlığındaki tutarsızlıkları bot sinyali olarak değerlendirir. Aşağıdaki kurallara uyun:
- Tek bir session boyunca aynı User-Agent'ı kullanın — değiştirmeyin.
- Gerçek bir tarayıcı UA'sı kullanın;
python-requests/2.xgibi varsayılan UA'ları asla göndermeyin. Accept,Accept-Language,Accept-Encodingbaşlıklarını gerçek tarayıcı değerleriyle eşleştirin.- JavaScript çalıştırmadığınız için
sec-ch-uabaşlıklarını göndermeyin — bu, başlık ile davranış arasında tutarsızlık yaratır ve bot skorunu artırır.
Etik Scraping ve Resmi API Kullanımı
Pinterest scrape etmeden önce şu etik soruları kendinize sorun:
- Veri herkese açık mı? Login gerektirmeyen pinler, panolar ve arama sonuçları genellikle herkese açıktır.
- Veri kişisel mi? Bir pinin açıklaması veya yorumları kişisel veri içerebilir. GDPR kapsamında kişisel veri toplamak yasal yükümlülükler doğurur.
- Robots.txt'ye saygı duyuyor musunuz? Pinterest'in
robots.txtdosyasını kontrol edin ve engellenen yolları scrape etmeyin. - Resmi API yeterli mi? Eğer sadece kendi hesabınızın verilerine veya sınırlı sayıda pin bilgisine ihtiyacınız varsa, Pinterest API v5'i kullanın. Daha güvenilir, rate limit'leri net ve ToS'a tam uyumludur.
Üretim sistemleri için tavsiyemiz: önce resmi API'yi deneyin, yetersiz kaldığında ve yalnızca herkese açık veri için scrape yapın. SERP takibi ve trend analizi için SERP tracking kullanım senaryomuzu inceleyebilirsiniz. ProxyHat kurulum detayları için dokümantasyon'a başvurun.
Key Takeaways:
- Pinterest'in dahili Resource API'si (
/resource/<Name>/get/) herkese açık pin, pano ve arama verisini JSON olarak döner.csrftokensürekliliği için ProxyHat-session-bayrağı ile sticky session kullanın.- Per-IP rate limit (~50–100 istek/dakika) aşmamak için 1.5–3 saniye pacing uygulayın.
- Arama ve öneri sonuçları lokalize olduğundan
-country-USgibi coğrafi hedefleme kullanın.- Üretim için resmi Pinterest API v5'i tercih edin; scrape yalnızca herkese açık veri için son çare olsun.
SSS
Aşağıda, Pinterest scraping ile ilgili en sık sorulan soruları yanıtlıyoruz.






