كيفية استخراج بيانات بينتيريست (دبابيس ولوحات) في 2026: دليل المطورين

دليل عملي للمطورين لاستخراج الدبابيس واللوحات العامة من بينتيريست باستخدام البروكسيات السكنية، مع أمثلة كود Python وNode.js، وأفضل الممارسات لتجنب الحجب.

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

تنويه قانوني: هذه المقالة مخصصة لاستخراج البيانات العامة المتاحة بدون تسجيل دخول فقط. يجب احترام شروط خدمة بينتيريست (Terms of Service) والقوانين المعمول بها مثل قانون الاحتيال وإساءة استخدام الكمبيوتر (CFAA) في الولايات المتحدة، واللائحة العامة لحماية البيانات (GDPR) في الاتحاد الأوروبي. لا تستخدم هذه التقنيات لاستخراج بيانات شخصية أو محتوى محمي بتسجيل الدخول دون إذن صريح.

إذا كنت تبني مجموعات بيانات للاتجاهات البصرية أو تحليل المحتوى، فمن المرجح أنك واجهت صعوبة في استخراج بيانات بينتيريست (دبابيس ولوحات) في 2026. بينتيريست منصة غنية بالبيانات البصرية، لكنها تحمي بنيتها التحتية بأنظمة مكافحة البوتات وقيود لكل عنوان IP. في هذا الدليل، نغطي كل ما تحتاجه: من فهم واجهة Resource API الداخلية، إلى تنفيذ كود عملي مع بروكسيات سكنية دوارة، إلى أفضل الممارسات الأخلاقية.

كيفية استخراج بيانات بينتيريست (دبابيس ولوحات) في 2026 — نظرة عامة

بينتيريست يعرض ثلاثة أنواع من الأسطح العامة التي يمكن الوصول إليها بدون تسجيل دخول: صفحات الدبابيس الفردية، خلاصات اللوحات (Board Feeds)، ونتائج البحث. هذه الأسطح تعرض بيانات منظمة عن الصور والعناوين والروابط — وهي ما يحتاجه معظم مطوري البيانات. في المقابل، الخلاصة الرئيسية (Home Feed) والتوصيات الشخصية تتطلب تسجيل دخول ولا يمكن الوصول إليها بشكل عام.

واجهة Pinterest API v5 الرسمية متاحة لكنها محدودة: تتطلب مصادقة OAuth، وتفرض قيود معدل لكل رمز (token)، ولا تعرض كل الحقول المتاحة في الواجهة الداخلية. لهذا السبب، يلجأ المطورون إلى واجهة Resource API الداخلية لاستخراج بيانات أكثر تفصيلاً من الأسطح العامة.

بنية بينتيريست: الأسطح العامة مقابل المحتوى المغلق

قبل كتابة أي كود، من الضروري فهم ما يمكن الوصول إليه بشكل عام وما لا يمكن:

السطحيتطلب تسجيل دخول؟طريقة الوصولالبيانات المتاحة
صفحة دبوس فرديلاResource API أو HTMLid، عنوان، صورة، رابط، وصف، لوحة
خلاصة لوحة (Board Feed)لاBoardFeedResourceقائمة دبابيس مع ترقيم صفحات
نتائج البحثلاSearchResourceدبابيس مطابقة للاستعلام
الخلاصة الرئيسية (Home Feed)نعممحتوى مخصص (مغلق)
التوصياتنعممخصص (مغلق)

القاعدة الأساسية: إذا كان المحتوى يظهر في نافذة التصفح الخفي (incognito) بدون تسجيل دخول، فهو عام. إذا طلب منك بينتيريست تسجيل الدخول لعرضه، فهو مغلق ولا يجب استخراجه دون إذن.

واجهة Resource API الداخلية في بينتيريست

بينتيريست يستخدم واجهة داخلية تُسمى Resource API لتحميل البيانات بشكل غير متزامن في المتصفح. هذه الواجهة متاحة أيضاً لطلبات HTTP المباشرة. إليك النقاط الأساسية:

نقاط النهاية الرئيسية

  • PinResource: /resource/PinResource/get/ — يسترجع بيانات دبوس فردي عبر معرف الدبوس.
  • BoardFeedResource: /resource/BoardFeedResource/get/ — يسترجع قائمة دبابيس من لوحة معينة مع دعم ترقيم الصفحات.
  • SearchResource: /resource/SearchResource/get/ — يسترجع نتائج البحث عن دبابيس مطابقة لاستعلام.

معاملات الطلب

كل طلب يتطلب معاملين رئيسيين في سلسلة الاستعلام (query string):

  • source_url= — المسار الذي يمثل السياق، مثل /travel/destinations/ للوحة أو /search/pins/?q=coffee للبحث.
  • data= — كائن JSON مشفر بعنوان URL (URL-encoded) يحتوي على options (مثل board_slug، page_size، bookmarks) و context.

الترويسات المطلوبة

بينتيريست يتحقق من عدة ترويسات لتمييز الطلبات الشرعية عن البوتات:

  • X-Pinterest-PWS-Handler: يشير إلى مسار المعالج في الواجهة الأمامية، مثل www/[username]/[slug].js.
  • X-APP-VERSION: نسخة التطبيق الحالية (تتغير دورياً — استخرجها من صفحة HTML).
  • csrftoken: رمز CSRF المتاح في ملفات تعريف الارتباط (cookies) للصفحة الأولية.
  • User-Agent: ترويسة متصفح حقيقية وصالحة — راجع توثيق MDN لفهم بنيتها.

ملاحظة مهمة: X-APP-VERSION و csrftoken يتغيران بمرور الوقت. أفضل ممارسة هي إجراء طلب GET أولي لصفحة HTML، واستخراج هذه القيم منها قبل إرسال طلبات Resource API.

الحماية ضد البوتات: لماذا تحتاج إلى بروكسيات سكنية

بينتيريست يطبق قيود معدل لكل عنوان IP ونظام تسجيل (bot scoring) يحلل أنماط الطلبات. إذا أرسلت طلبات كثيرة من عنوان IP واحد، ستواجه استجابات 429 (Too Many Requests) أو 403 (Forbidden) خلال وقت قصير — غالباً بعد 50-100 طلب متتالي.

التحدي الإضافي هو أن نتائج البحث والتوصيات في بينتيريست مترجمة جغرافياً. البحث عن نفس الاستعلام من عنوان IP في ألمانيا قد يعطي نتائج مختلفة عن عنوان IP في الولايات المتحدة. لذلك، إذا كنت تبني مجموعة بيانات شاملة، تحتاج إلى بروكسيات سكنية مع استهداف جغرافي.

البروكسيات السكنية تقدم عنوان IP حقيقية من مزود خدمة إنترنت فعلي (ISP)، مما يجعل طلباتك تبدو كأنها من مستخدم حقيقي. هذا يقلل من احتمالية الحجب بشكل كبير مقارنة ببروكسيات مراكز البيانات (datacenter) التي يسهل التعرف عليها.

مع ProxyHat، يمكنك تحديد الدولة والمدينة في اسم المستخدم:

http://user-country-US:pass@gate.proxyhat.com:8080
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080

للحصول على قائمة المواقع المتاحة، راجع صفحة المواقع.

تطبيق عملي: استخراج بيانات لوحة باستخدام Python

المثال التالي يستخدم مكتبة requests في Python لترقيم صفحات BoardFeedResource عبر بوابة ProxyHat السكنية. نستخدم جلسة لاصقة (sticky session) لضمان استمرارية ملفات تعريف الارتباط و csrftoken.

import requests
import json
import time

# ProxyHat residential proxy — US geo + sticky session
proxy_url = "http://user-country-US-session-pinboard1:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}

# Step 1: Fetch the board HTML page to extract tokens
board_url = "https://www.pinterest.com/travel/destinations/"
session = requests.Session()
session.proxies = proxies

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": "text/html,application/xhtml+xml",
}

resp = session.get(board_url, headers=headers)
if resp.status_code != 200:
    print(f"Initial fetch failed: HTTP {resp.status_code}")
    exit(1)

# Extract X-APP-VERSION and csrftoken from HTML/cookies
app_version = "a1b2c3d"  # Parse from resp.text in production
csrftoken = session.cookies.get("csrftoken", "")

# Step 2: Paginate BoardFeedResource
api_headers = {
    "User-Agent": headers["User-Agent"],
    "X-Pinterest-PWS-Handler": "www/[username]/[slug].js",
    "X-APP-VERSION": app_version,
    "Accept": "application/json",
    "Referer": board_url,
}
if csrftoken:
    api_headers["X-CSRFToken"] = csrftoken

bookmarks = []
all_pins = []

for page in range(5):
    data_param = json.dumps({
        "options": {
            "board_slug": "travel/destinations",
            "page_size": 25,
            "bookmarks": bookmarks,
        },
        "context": {},
    })

    params = {
        "source_url": "/travel/destinations/",
        "data": data_param,
    }

    api_url = "https://www.pinterest.com/resource/BoardFeedResource/get/"
    resp = session.get(api_url, headers=api_headers, params=params)

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

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

    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", ""),
        })

    # Bookmark-based pagination
    bookmarks = payload.get("resource_response", {}).get("bookmark")
    if not bookmarks:
        break

    # Pacing: 2-5 seconds between requests
    time.sleep(3)

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

هذا المثال يجمع حتى 125 دبوساً (5 صفحات × 25 دبوس) من لوحة عامة. لاحظ استخدام -session-pinboard1 في اسم المستخدم لضمان أن جميع الطلبات تأتي من نفس عنوان IP، مما يحافظ على استمرارية الجلسة و csrftoken.

مثال Node.js: البحث عبر بوابة HTTP

المثال التالي يستخدم Node.js مع https-proxy-agent لاستدعاء SearchResource عبر بوابة ProxyHat على المنفذ 8080:

// npm install https-proxy-agent
const { HttpsProxyAgent } = require('https-proxy-agent');

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

const query = 'coffee';
const dataParam = JSON.stringify({
  options: { query, page_size: 25, bookmarks: [] },
  context: {},
});

const url = 'https://www.pinterest.com/resource/SearchResource/get/?' +
  'source_url=' + encodeURIComponent('/search/pins/?q=' + query) +
  '&data=' + encodeURIComponent(dataParam);

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',
  'X-Pinterest-PWS-Handler': 'www/search/[query].js',
  'X-APP-VERSION': 'a1b2c3d',
  'Accept': 'application/json',
};

async function scrapeSearch() {
  const resp = await fetch(url, { headers, agent });
  if (!resp.ok) throw new Error(`HTTP ${resp.status}`);

  const payload = await resp.json();
  const pins = payload.resource_response?.data || [];

  pins.forEach(pin => {
    console.log({
      id: pin.id,
      title: pin.title || '',
      image: pin.images?.orig?.url || '',
      link: pin.link || '',
    });
  });

  // Bookmark for next page
  return payload.resource_response?.bookmark;
}

scrapeSearch().catch(console.error);

كلا المثالين يستخدمان gate.proxyhat.com:8080 كبوابة HTTP. إذا كنت تفضل SOCKS5، استخدم المنفذ 1080 مع البروتوكول socks5://. راجع توثيق ProxyHat لتفاصيل التكوين الكاملة.

ترقيم الصفحات والجلسات والوتيرة

ترقيم الصفحات عبر Bookmarks

بينتيريست لا يستخدم ترقيم صفحات رقمي تقليدي (page=1, page=2). بدلاً من ذلك، يستخدم نظام bookmarks — مؤشرات (cursors) غير شفافة تعيد الاستجابة في حقل bookmark. تمرر هذه المؤشرات في الطلب التالي ضمن options.bookmarks. عندما تكون قائمة bookmarks فارغة أو غير موجودة، فهذا يعني أنك وصلت إلى نهاية البيانات.

الجلسات اللاصقة (Sticky Sessions)

عند استخراج البيانات من لوحة واحدة أو بحث واحد، استخدم جلسة لاصقة بتمرير -session-abc123 في اسم المستخدم. هذا يضمن أن جميع طلباتك تأتي من نفس عنوان IP، مما يحافظ على استمرارية csrftoken وملفات تعريف الارتباط. عند الانتقال إلى لوحة أو بحث جديد، غيّر اسم الجلسة للحصول على عنوان IP جديد:

# Session 1 — Board A
http://user-country-US-session-boardA:pass@gate.proxyhat.com:8080

# Session 2 — Board B (new IP)
http://user-country-US-session-boardB:pass@gate.proxyhat.com:8080

الوتيرة (Pacing)

الوتيرة المناسبة ضرورية لتجنب الحجب. نوصي بما يلي:

  • تأخير 2-5 ثوانٍ بين كل طلب متتالي.
  • حد أقصى 100 طلب لكل جلسة قبل التبديل إلى جلسة جديدة.
  • تأخير 10-30 ثانية بين الصفحات إذا لاحظت استجابات بطيئة أو أخطاء 429.
  • لا تتجاوز 50 طلباً متزامناً (concurrent) من نفس الجلسة.

نظافة User-Agent

استخدم User-Agent متصفح حقيقي ومحدث. لا تستخدم User-Agent افتراضية للمكتبات مثل python-requests/2.x. الأفضل هو مطابقة User-Agent مع الترويسات الأخرى (Accept، Accept-Language، Sec-Ch-Ua) لتقليل بصمة البصمة (fingerprint risk). يمكن الرجوع إلى توثيق MDN لفهم بنية User-Agent الصحيحة.

الأخطاء الشائعة وحالات الحافة

  • نسيان تحديث X-APP-VERSION: هذه القيمة تتغير كل بضعة أيام. إذا استخدمت قيمة قديمة، قد ترفض بينتيريست طلبك. استخرجها دائماً من صفحة HTML حديثة.
  • تجاهل csrftoken: بعض نقاط النهاية تتطلب رمز CSRF صالح. احصل عليه من ملفات تعريف الارتباط بعد الطلب الأولي.
  • عدم احترام robots.txt: تحقق دائماً من https://www.pinterest.com/robots.txt قبل الاستخراج. راجع قانون CFAA لفهم المخاطر القانونية.
  • استخراج بيانات شخصية: لا تستخرج بيانات مستخدمين محددين (أسماء، صور شخصية) دون أساس قانوني. هذا قد ينتهك GDPR في الاتحاد الأوروبي.
  • عدم التعامل مع الاستجابات الفارغة: أحياناً تعيد Resource API استجابة 200 لكن بحقل data فارغ. تعامل مع هذه الحالة بدلاً من افتراض وجود بيانات.
  • الإفراط في التزامن: 100 جلسة متزامنة قد تبدو فكرة جيدة، لكنها تزيد من خطر الكشف. ابدأ بـ 10-20 جلسة متزامنة واضبط تدريجياً.

الاعتبارات الأخلاقية ومتى تستخدم واجهة برمجة التطبيقات الرسمية

استخراج البيانات العامة من بينتيريست قانوني وممكن، لكن يجب ممارسته بمسؤولية:

  • استخرج البيانات العامة فقط: الدبابيس واللوحات ونتائج البحث المتاحة بدون تسجيل دخول. لا تحاول تجاوز حواجز تسجيل الدخول.
  • احترم robots.txt: اقرأ ملف robots.txt الخاص ببينتيريست واتبع قواعده.
  • لا تستخرج بيانات شخصية: معلومات المستخدمين الشخصية محمية بموجب GDPR و CCPA. استخرج بيانات الدبابيس والصور فقط.
  • استخدم الوتيرة المناسبة: لا ترسل طلبات تؤثر على أداء المنصة. تأخير 2-5 ثوانٍ بين الطلبات هو الحد الأدنى.
  • افضل واجهة برمجة التطبيقات الرسمية للإنتاج: إذا كنت تبني منتجاً تجارياً يعتمد على بيانات بينتيريست، استخدم Pinterest API v5 الرسمية. توفر استقراراً وضمانات لا توفرها واجهة Resource API الداخلية التي قد تتغير دون إشعار.

للاستخدامات البحثية ومجموعات البيانات الصغيرة، استخراج الأسطح العامة عبر Resource API مع بروكسيات سكنية هو حل عملي. للاستخدامات الإنتاجية واسعة النطاق، واجهة برمجة التطبيقات الرسمية هي الخيار الأكثر استدامة.

لاستكشاف المزيد من حالات استخدام استخراج البيانات، راجع صفحة حالات استخدام استخراج الويب و تتبع نتائج محركات البحث. للاطلاع على أسعار البروكسيات السكنية، راجع صفحة التسعير.

النقاط الرئيسية

  • بينتيريست يعرض ثلاثة أسطح عامة: الدبابيس الفردية، خلاصات اللوحات، ونتائج البحث — كلها متاحة عبر Resource API بدون تسجيل دخول.
  • واجهة Resource API الداخلية تستخدم معاملات source_url و data (JSON مشفر)، وتتطلب ترويسات X-Pinterest-PWS-Handler و X-APP-VERSION و csrftoken.
  • البروكسيات السكنية مع استهداف جغرافي ضرورية لأن نتائج البحث والتوصيات مترجمة جغرافياً.
  • استخدم جلسات لاصقة (-session-) لضمان استمرارية الجلسة، وتبديل الجلسات عند الانتقال إلى هدف جديد.
  • الوتيرة المناسبة (2-5 ثوانٍ بين الطلبات) ونظافة User-Agent تقللان من خطر الحجب.
  • للاستخدامات الإنتاجية، فضل واجهة Pinterest API v5 الرسمية للاستقرار والضمانات.

¿Listo para empezar?

Accede a más de 50M de IPs residenciales en más de 148 países con filtrado impulsado por IA.

Ver preciosProxies residenciales
← Volver al Blog