استخراج Target.com باستخدام Python في 2026: 3 طرق تعمل فعلًا

آخر تحديث في July 8, 2026
استخراج Target.com باستخدام Python في 2026: 3 طرق تعمل فعلًا

يبدو Target.com من المواقع التي تبدو سهلة لاستخراج البيانات منها — إلى أن تجرب ذلك فعليًا. إذا كنت قد كتبت يومًا سكربت Python سريعًا باستخدام Requests وBeautifulSoup، ووجّهته إلى صفحة منتج في Target، ثم رأيت حقل السعر يعود إليك بقيمة None، فأنت لست وحدك.

بعد اختبارات لأساليب الاستخراج على معظم مواقع التجزئة الكبرى، أستطيع أن أقول بثقة: Target من أصعبها باستمرار. ومع 208–280 مليون زيارة شهرية، فهو منجم ذهب لبيانات المنتجات — الأسعار، التقييمات، المخزون، المراجعات — لكن مزيج Target بين العرض من جهة العميل باستخدام React واكتشاف الروبوتات من Akamai يعني أن الأسلوب الساذج يفشل تقريبًا فورًا. ومع ذلك، هناك ثلاث طرق Python تعمل فعلًا. سأشرح كل واحدة، وأوضح لماذا تفشل المحاولة الأولى دائمًا، وأعرض لك اختصارًا بلا كود عندما لا تكون Python تستحق هذا العناء.

لماذا تعطيك أول محاولة لاستخراج Target.com باستخدام Python قيمة None

قبل أن ندخل في الحلول، دعنا نفهم المشكلة. هذا هو الكود الذي يكتبه معظم المبتدئين:

import requests
from bs4 import BeautifulSoup

url = "https://www.target.com/p/some-product/-/A-12345678"
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(response.text, "html.parser")

price = soup.select_one('[data-test="current-price"]')
print(price)  # None

النتيجة؟ None. في كل مرة.

المشكلة ليست في كودك. الـHTML الذي تعيده requests.get() من Target هو في الأساس هيكل فارغ — غلاف React يقول: «مرحبًا، حمّل JavaScript هذا لعرض الصفحة الفعلية». أسعار المنتجات، والتقييمات، والمراجعات، والتوفر كلها تُحقن بواسطة JavaScript بعد تحميل الصفحة الأولي. وبما أن مكتبة Requests في Python لا تنفذ JavaScript، فهذه العناصر لا تكون موجودة أصلًا في الاستجابة.

منتديات المطورين مليئة بحالات الاصطدام بهذا الجدار. ويقول تحليل من ScrapeOps بوضوح: «يظهر العنصر على أنه None لأنه يُعرض بواسطة Javascript ولا تستطيع requests سحب HTML المعروض بواسطة Javascript». ويؤكد درس Crawlbase: «عندما ترسل طلب HTTP إلى رابط Target، فإن استجابة HTML تفتقر إلى البيانات المفيدة».

وحتى لو تجاوزت مشكلة JavaScript، فهناك طبقة ثانية: نظام اكتشاف الروبوتات من Akamai في Target يفحص بصمة TLS الخاصة بك ويصنف مكتبة requests في Python قبل تبادل أي بايت واحد من HTML. سنعود إلى ذلك بعد قليل.

لماذا يصعب جدًا استخراج Target.com باستخدام Python

Target ليس مجرد «موقع يستخدم JavaScript». إنه نظام دفاع متعدد الطبقات — وفهم كل طبقة هو ما يساعدك على اختيار طريقة الاستخراج المناسبة.

بيانات المنتجات المعروضة عبر JavaScript

تم بناء Target.com على React. عندما تفتح صفحة منتج أو بحث في متصفح حقيقي، يحدث ما يلي:

  1. يرسل الخادم هيكل HTML بسيطًا
  2. تُحمَّل حِزم JavaScript وتُنفَّذ
  3. يستدعي الواجهة الأمامية واجهة Redsky الداخلية الخاصة بـTarget
  4. تُعرض بيانات المنتج (الأسعار، التقييمات، الصور، التوفر) داخل DOM

إذا تخطيت الخطوات 2–4 — وهذا بالضبط ما يفعله requests.get() — فستحصل على صفحة فارغة. وقد قاس GroupBWT هذا الأمر: الطلبات HTTP الثابتة تلتقط نحو 30% فقط من البيانات المتاحة على Target. أما الـ70% الأخرى فتحتاج إلى تنفيذ JavaScript أو الوصول إلى الـAPI.

صفحات نتائج البحث أسوأ من ذلك. يظهر عدد قليل فقط من المنتجات في HTML الأولي؛ أما البقية فتُحمَّل أثناء التمرير.

دفاعات Target المضادة للروبوتات: أبعد من نصيحة «استخدم Proxies» العامة

تتجاوز معظم أدلة الاستخراج آليات الحماية بعبارة «استخدم بروكسيات فقط». لكن دفاعات Target تستحق شرحًا أدق.

بصمة TLS (الأهم). أثناء مصافحة HTTPS، يرسل عميلك حزمة "Client Hello" تكشف إصدار TLS، ومجموعات التشفير، والملحقات، والمنحنيات الإهليلجية. تُحوَّل هذه العناصر إلى بصمة JA3. مكتبة requests في Python تنتج تجزئة ثابتة ومعروفة8d9f7747675e24454cd9b7ed35c58707 — وتلتقطها قواعد بيانات مكافحة الروبوتات فورًا. يرسل Chrome 16 مجموعة تشفير مرتبة بعناية مع قيم GREASE، بينما يرسل Python أكثر من 60 مجموعة بترتيب غير خاص بالمتصفح. يحدث الحظر قبل تبادل أي محتوى HTTP.

تقييم سمعة عنوان IP. تصنّف Akamai عناوين IP إلى مستويات ثقة. وعناوين مراكز البيانات تحصل، على حد تعبير Scrapfly، على «درجات ثقة سلبية كبيرة لأنها غالبًا تُستخدم بواسطة الروبوتات». أما عناوين IP المنزلية فتحصل على درجات إيجابية. وعلى Target تحديدًا، تُعلَّم نطاقات IP الخاصة بمراكز البيانات فورًا.

بصمة JavaScript. يحقن Akamai JavaScript يجمع مواصفات محرك JS، وقدرات العتاد، وبيانات نظام التشغيل، والخطوط، والإضافات، والبيانات السلوكية (سرعة الكتابة، حركة الفأرة، توقيت النقر). وهذا يولد ملف تعريف _abck — وهو رمز بصمة ذو حالة. ومن دون _abck صالح، يتم حظر الطلبات.

تحديد المعدل. يطلق Target أخطاء 429 عند نحو 30–60 طلبًا في الدقيقة لكل IP. وبعض المستخدمين يذكرون حصولهم على استجابات 200 OK خادعة تحتوي فعليًا على صفحة الحظر «Pardon Our Interruption» — ما يجعل الكشف الآلي أكثر تعقيدًا.

تُقيِّم ScrapeOps صعوبة Target بـ 7/10 إجمالًا. أما تجاوز Akamai تحديدًا فيُقيَّم بـ 9/10.

3 طرق لاستخراج Target.com باستخدام Python (مقارنة جنبًا إلى جنب)

لا توجد مقالة واحدة تقارن بين الطرق الثلاث القابلة للتطبيق في مكان واحد. إليك المقارنة بصراحة:

المعيارRequests + BS4Selenium / Playwrightواجهة Redsky API
التعامل مع عرض JavaScript❌ لا✅ نعم✅ نعم (JSON)
السرعة لكل عنصر⚡ حوالي 0.5–1 ثانية🐢 حوالي 5–10 ثوانٍ⚡ حوالي 0.5–1 ثانية
خطر الحظر من مكافحة الروبوتات⚠️ مرتفع (بصمة TLS)⚠️ متوسط⚠️ متوسط (قد تتغير مفاتيح المصادقة)
تعقيد الإعدادمنخفضمتوسطمتوسط-مرتفع (هندسة عكسية)
اكتمال البياناتحوالي 30% (HTML ثابت فقط)حوالي 95% (الصفحة كاملة)حوالي 90% (JSON منظم)
الأنسب لـبيانات وصفية ثابتة، __TGT_DATA__صفحات المنتجات الكاملة، المراجعاتبيانات المنتجات بالجملة وعلى نطاق واسع

والآن لنبني كل طريقة.

الطريقة 1: استخراج Target.com باستخدام Python Requests وBeautifulSoup

هذه الطريقة لن تمنحك الأسعار المعروضة عبر JavaScript في صفحات البحث. لكنها سريعة وخفيفة، وتستخرج أكثر مما تتوقع — إذا كنت تعرف أين تبحث.

الحيلة: يضمِّن Target بعض بيانات المنتج داخل وسم <script> يحتوي على متغير __TGT_DATA__ مع __PRELOADED_QUERIES__. تتضمن هذه الكتلة JSON أسماء المنتجات، والأوصاف، والميزات، وأحيانًا الأسعار في صفحات المنتج الفردية. يمكنك أيضًا استخراج عناوين المنتجات وروابطها من HTML نتائج البحث.

الخطوة 1: إعداد بيئة Python

أنشئ مجلد المشروع وثبّت الاعتمادات:

mkdir target-scraper && cd target-scraper
python -m venv venv
source venv/bin/activate  # على Windows: venv\Scripts\activate
pip install requests beautifulsoup4 curl_cffi

استخدم curl_cffi بدل requests القياسية هنا. فهي تُحاكي بصمات TLS الخاصة بالمتصفح، وهو العامل الأكبر في تجنب الحظر على Target. وتُظهر الاختبارات معدل تفادي 92% مع curl_cffi مقابل 12% فقط مع requests القياسية — أي تحسن بمقدار 15 ضعفًا.

الخطوة 2: استخراج نتائج بحث Target

صيغة رابط البحث في Target بسيطة: https://www.target.com/s?searchTerm={keyword}

from curl_cffi import requests as cureq
from bs4 import BeautifulSoup
import time, random

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
}

url = "https://www.target.com/s?searchTerm=bluetooth+headphones"
resp = cureq.get(url, headers=headers, impersonate="chrome124")
soup = BeautifulSoup(resp.text, "html.parser")

# تستخدم بطاقات المنتج هذا الوسم data-test
cards = soup.find_all("div", {"data-test": "@web/site-top-of-funnel/ProductCardWrapper"})
for card in cards:
    link_tag = card.find("a")
    title = link_tag.get_text(strip=True) if link_tag else "N/A"
    href = "https://www.target.com" + link_tag["href"] if link_tag and link_tag.get("href") else "N/A"
    print(f"{title} — {href}")

ستحصل على أسماء المنتجات وروابطها. الأسعار؟ على الأرجح لا من هذا الـHTML. وهذا متوقع.

الخطوة 3: استخراج بيانات JSON المضمنة من صفحات المنتج

تضمّن صفحات المنتجات الفردية بيانات أغنى داخل وسم __TGT_DATA__:

import re, json

product_url = "https://www.target.com/p/some-product/-/A-12345678"
resp = cureq.get(product_url, headers=headers, impersonate="chrome124")
soup = BeautifulSoup(resp.text, "html.parser")

# ابحث عن وسم __TGT_DATA__ script
scripts = soup.find_all("script")
for script in scripts:
    if script.string and "__TGT_DATA__" in script.string:
        # استخراج JSON من محتوى الوسم
        match = re.search(r'__TGT_DATA__\s*=\s*({.*?});?\s*$', script.string, re.DOTALL)
        if match:
            tgt_data = json.loads(match.group(1))
            # التنقل داخل بنية JSON للحصول على تفاصيل المنتج
            queries = tgt_data.get("__PRELOADED_QUERIES__", {})
            # بيانات المنتج تكون متداخلة بالداخل — البنية تختلف حسب الصفحة
            print(json.dumps(queries, indent=2)[:500])  # معاينة البنية

تحتوي بنية JSON داخل __TGT_DATA__ على أسماء المنتجات، والأوصاف، والميزات، وغالبًا بيانات التسعير. يختلف التداخل الدقيق، لذا ستحتاج إلى فحص المخرجات والتنقل بينها وفقًا لذلك.

الخطوة 4: التعامل مع الترقيم الصفحي

يستخدم ترقيم صفحات البحث في Target المعامل Nao. الصفحة 1 هي Nao=0، والصفحة 2 هي Nao=24، والصفحة 3 هي Nao=48، وهكذا (يزداد بمقدار 24):

for page in range(0, 120, 24):  # أول 5 صفحات
    paginated_url = f"https://www.target.com/s?searchTerm=bluetooth+headphones&Nao={page}"
    resp = cureq.get(paginated_url, headers=headers, impersonate="chrome124")
    # حلّل واستخرج...
    time.sleep(random.uniform(2, 5))  # كن مهذبًا

الخطوة 5: تخزين البيانات المستخرجة

import csv

with open("target_products.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["title", "url", "price", "description"])
    writer.writeheader()
    for product in products:
        writer.writerow(product)

ما ستحصل عليه: عناوين المنتجات، والروابط، والأوصاف، والبيانات الوصفية المضمّنة. وما لن تحصل عليه بثبات: الأسعار والتقييمات الديناميكية من صفحات نتائج البحث. لذلك تحتاج إلى الطريقة 2 أو 3.

الطريقة 2: استخراج Target.com باستخدام Selenium أو Playwright

المتصفح بلا واجهة يعرض JavaScript، ويحمّل المحتوى الديناميكي، ويحاكي سلوك المستخدم الحقيقي. هذه هي الطريقة التي تمنحك الأسعار والتقييمات والمراجعات.

أما سؤال Selenium مقابل Playwright: فقد تجاوز Playwright Selenium في التبنّي45.1% مقابل 22.1% في 2026 — وتُظهر الاختبارات أنه أسرع 2.5 مرة (11 ثانية مقابل 28 ثانية لـ20 صفحة). سأعرض Selenium هنا لأن مجتمعه أكبر ولأنه يملك شروحات أكثر، لكن Playwright هو الخيار الأفضل إذا بدأت من الصفر.

الخطوة 1: تثبيت Selenium وChromeDriver

pip install selenium webdriver-manager

يتولى webdriver-manager إدارة إصدار ChromeDriver تلقائيًا — لا مزيد من صداع «عدم تطابق إصدار ChromeDriver»:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

options = Options()
options.add_argument("--headless=new")
options.add_argument("--window-size=1920,1080")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

الخطوة 2: تحميل صفحات Target والانتظار حتى يظهر المحتوى

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get("https://www.target.com/s?searchTerm=bluetooth+headphones")

# انتظر حتى تُعرض بطاقات المنتج (انتظار صريح أفضل من time.sleep)
WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, '[data-test="product-title"]'))
)

الانتظار الصريح مهم جدًا. فـtime.sleep(10) يضيّع الوقت على التحميل السريع، ولا يكفي للتحميل البطيء — أي أنه أسوأ ما في الحالتين. يقوم WebDriverWait بالتحقق كل 500 مللي ثانية حتى يظهر العنصر أو تنتهي المهلة.

الخطوة 3: تمرير الصفحة لتحميل جميع المنتجات

يحمّل Target المنتجات تدريجيًا أثناء التمرير. ومن دون التمرير، ستحصل على 4–5 منتجات بدل الصفحة كاملة:

import time

last_height = driver.execute_script("return document.body.scrollHeight")
for _ in range(10):
    driver.execute_script("window.scrollBy(0, 300);")
    time.sleep(1.5)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

وتؤكد اختبارات ScrapeOps أن 10 مرات تمرير مع تأخير 1.5 ثانية تعطي 8 منتجات أو أكثر بدل 4–5 فقط من دون تمرير. ويجب أن تكون كل خطوة تمرير 200–300 بكسل لتبدو كسلوك بشري.

الخطوة 4: استخراج بيانات المنتج من الصفحة المعروضة

products = []
cards = driver.find_elements(By.CSS_SELECTOR, '[data-test="@web/site-top-of-funnel/ProductCardWrapper"]')

for card in cards:
    try:
        title = card.find_element(By.CSS_SELECTOR, '[data-test="product-title"]').text
    except:
        title = "N/A"
    try:
        price = card.find_element(By.CSS_SELECTOR, '[data-test="current-price"]').text
    except:
        price = "N/A"
    try:
        link = card.find_element(By.CSS_SELECTOR, 'a[href*="/p/"]').get_attribute("href")
    except:
        link = "N/A"

    products.append({"title": title, "price": price, "link": link})

for p in products:
    print(f'{p["title"]} — {p["price"]}')

محددات data-test الأساسية في Target (متحقق منها في 2026):

حقل البياناتالمحدد
بطاقة المنتجdata-test="@web/site-top-of-funnel/ProductCardWrapper"
عنوان المنتجdata-test="product-title"
السعر الحاليdata-test="current-price"
قيمة التقييمdata-test="rating-value"
عدد التقييماتdata-test="rating-count"

الخطوة 5: استخراج مراجعات المنتج (إضافة مفيدة)

انتقل إلى صفحات المنتج الفردية، ومرّر إلى قسم المراجعات، ثم استخرج بيانات المراجعات:

from bs4 import BeautifulSoup

driver.get("https://www.target.com/p/some-product/-/A-12345678")
# مرّر للأسفل لتحميل المراجعات
for _ in range(5):
    driver.execute_script("window.scrollBy(0, 500);")
    time.sleep(2)

soup = BeautifulSoup(driver.page_source, "html.parser")
reviews = soup.find_all("div", {"data-test": "review-card--text"})
for review in reviews:
    print(review.get_text(strip=True)[:100])

تُحمَّل المراجعات عبر تكامل Bazaarvoice وتدعم الترقيم الصفحي (حتى 51 صفحة)، والفرز حسب الأحدث، وفلترًا للمراجعات المصورة فقط. وتُظهر مقاييس ScrapeOps نحو 5.1 ثانية لكل عنصر باستخدام Selenium.

ولا تنسَ إغلاق المتصفح عند الانتهاء:

driver.quit()

الطريقة 3: استخراج Target.com باستخدام Redsky API

تجلب الواجهة الأمامية في Target كل شيء من واجهة داخلية في redsky.target.com. يمكنك استدعاؤها مباشرة عبر Python — من دون تحليل HTML، ومن دون متصفح، ومن دون عرض JavaScript. الاستجابة عبارة عن JSON نظيف يضم أكثر من 40 حقل بيانات تغطي التسعير، والتقييمات، والمراجعات، والصور، والتوفر، والتنفيذ، والمواصفات، والمتغيرات. ولبيانات المنتجات بالجملة، هذه هي أسرع وأوثق طريقة بفارق كبير.

الخطوة 1: اكتشاف Redsky API باستخدام Chrome DevTools

معظم الشروحات تتخطى هذه الخطوة بالكامل. إليك كيفية العثور على الـAPI بنفسك:

  1. افتح أي صفحة منتج في Target داخل Chrome
  2. افتح DevTools (F12) → تبويب Network
  3. صفِّ الطلبات حسب Fetch/XHR
  4. أعد تحميل الصفحة
  5. ابحث عن طلبات إلى redsky.target.com أو redsky.a]target.com
  6. انقر على أحدها — وافحص Request URL وHeaders

سترى شيئًا مثل:

https://redsky.target.com/redsky_aggregations/v1/web/pdp_fulfillment_v1?key=9f36aeafbe60771e321a7cc95a78140772ab3e96&tcin=12345678&store_id=2148&zip=55401

المعاملات الأساسية:

  • key — مفتاح الـAPI (ثابت، وليس دوريًا — لكن نقاط النهاية المختلفة تستخدم مفاتيح مختلفة)
  • tcin — رقم عنصر Target.com (معرّف المنتج المكوّن من 8 أرقام)
  • store_id — موقع متجر Target
  • zip — الرمز البريدي لبيانات التنفيذ

استخرج مفتاح الـAPI من ترويسة الطلب. فهو مضمن في الرابط كمعامل استعلام.

الخطوة 2: إرسال طلب Python مباشر إلى Redsky API

from curl_cffi import requests as cureq
import json

API_KEY = "9f36aeafbe60771e321a7cc95a78140772ab3e96"  # استخرجه من DevTools
TCIN = "12345678"

url = f"https://redsky.target.com/redsky_aggregations/v1/web/pdp_fulfillment_v1?key={API_KEY}&tcin={TCIN}&store_id=2148&zip=55401"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Accept": "application/json",
    "Origin": "https://www.target.com",
    "Referer": "https://www.target.com/",
    "Sec-Fetch-Site": "same-site",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Dest": "empty",
}

resp = cureq.get(url, headers=headers, impersonate="chrome124")
data = resp.json()

# استخراج تفاصيل المنتج من استجابة JSON
product = data.get("data", {}).get("product", {})
title = product.get("item", {}).get("product_description", {}).get("title", "N/A")
price = product.get("price", {}).get("formatted_current_price", "N/A")
rating = product.get("ratings_and_reviews", {}).get("statistics", {}).get("rating", {}).get("average", "N/A")

print(f"{title} — {price} — التقييم: {rating}")

لا حاجة إلى تحليل HTML. الاستجابة منظمة ونظيفة وسريعة.

الخطوة 3: استخراج نتائج بحث المنتجات عبر الـAPI

تقبل نقطة النهاية product_summary_with_fulfillment_v1 عدة قيم TCIN دفعة واحدة:

tcins = ["12345678", "23456789", "34567890"]
tcin_str = ",".join(tcins)

search_url = f"https://redsky.target.com/redsky_aggregations/v1/web/product_summary_with_fulfillment_v1?key={API_KEY}&tcins={tcin_str}&store_id=2148&zip=55401"

resp = cureq.get(search_url, headers=headers, impersonate="chrome124")
results = resp.json()

for item in results.get("data", {}).get("product_summaries", []):
    title = item.get("title", "N/A")
    price = item.get("price", {}).get("formatted_current_price", "N/A")
    print(f"{title} — {price}")

للحصول على قيم TCIN، يمكنك إما استخراجها من HTML صفحة البحث (تظهر في روابط المنتجات بصيغة /A-XXXXXXXX) أو من JSON المضمَّن في __TGT_DATA__.

الخطوة 4: التوسّع باستخدام طلبات متزامنة

from concurrent.futures import ThreadPoolExecutor
import time, random

def fetch_product(tcin):
    url = f"https://redsky.target.com/redsky_aggregations/v1/web/pdp_fulfillment_v1?key={API_KEY}&tcin={tcin}&store_id=2148&zip=55401"
    time.sleep(random.uniform(2, 5))
    resp = cureq.get(url, headers=headers, impersonate="chrome124")
    return resp.json()

tcin_list = ["12345678", "23456789", "34567890", "45678901"]

with ThreadPoolExecutor(max_workers=3) as executor:
    results = list(executor.map(fetch_product, tcin_list))

حافظ على التوازي عند مستوى محافظ — 3 إلى 5 خيوط مع تأخيرات عشوائية من 2 إلى 5 ثوانٍ. يقع حد الطلبات في Target عند نحو 30–60 طلبًا في الدقيقة لكل IP.

تحذيرات مهمة حول Redsky API

قبل أن تبني خط إنتاج إنتاجي اعتمادًا على هذا، هناك بعض التحذيرات:

  • مفاتيح الـAPI ثابتة لكنها خاصة بكل نقطة نهاية. تستخدم نقاط Redsky النهائية المختلفة مفاتيح مختلفة. وهي لا تتغير كثيرًا، لكن Target قد يغيرها في أي وقت.
  • هذه واجهة داخلية غير موثقة. وقد أكد فريق هندسة Target أنها متاحة للعامة عمدًا، ما يقلل المخاطر القانونية، لكنها ليست API عامة مدعومة باتفاقيات مستوى خدمة.
  • لكل متغير من المنتج (اللون، الحجم) قيمة TCIN فريدة. عليك الاستعلام عن كل متغير على حدة.
  • غياب ترويسات Sec-Fetch-* يسبب حظرًا فوريًا. وهذه من الأخطاء الشائعة — احرص دائمًا على تضمين Sec-Fetch-Site وSec-Fetch-Mode وSec-Fetch-Dest.

نصائح لاستخراج Target.com على نطاق واسع من دون التعرض للحظر

تنطبق هذه الممارسات على النطاق الإنتاجي، بغض النظر عن الطريقة.

تدوير البروكسيات المنزلية (وليس مراكز البيانات)

يعلّم تنفيذ Akamai في Target نطاقات IP الخاصة بمراكز البيانات بمجرد رؤيتها. البروكسيات المنزلية ضرورية للاستخراج المستمر. تختلف الأسعار كثيرًا — تبدأ Smartproxy/Decodo من 4.50 دولار/غيغابايت، وBright Data من 5.04 دولار/غيغابايت، وتنخفض إلى 3–4 دولارات/غيغابايت عند الحجم الكبير.

دوّر عناوين IP كل 50–100 طلب، أو في كل طلب إذا كانت مجموعة البروكسيات لديك تدعم ذلك.

محاكاة بصمات TLS باستخدام curl_cffi

هذه هي التغييرة الأعلى أثرًا التي يمكنك القيام بها. بديل مباشر لـrequests:

from curl_cffi import requests as cureq

# requests القياسية — معدل نجاح 12% على المواقع المحمية
# resp = requests.get(url, headers=headers)

# curl_cffi — معدل نجاح 92%
resp = cureq.get(url, headers=headers, impersonate="chrome124")

يدعم curl_cffi (أكثر من 8,200 نجمة على GitHub) إصدارات Chrome من chrome99 حتى chrome146، بالإضافة إلى Safari وEdge والمتغيرات المحمولة. وهو أسرع بنسبة 20–30% من tls_client في الوضع المتزامن.

اضبط وتيرة الطلبات والترويسات بشكل واقعي

  • تأخيرات عشوائية: من 2 إلى 7 ثوانٍ بين الطلبات (وليس فاصلًا ثابتًا — فالعشوائية مهمة)
  • تدوير User-Agent: احتفظ بمجموعة من 5 إلى 10 سلاسل User-Agent حقيقية للمتصفحات ودوّر بينها
  • تهيئة الجلسة: زر الصفحة الرئيسية لـtarget.com قبل صفحات المنتجات لتأسيس ملفات تعريف الارتباط
  • اتساق الترويسات: يجب أن يطابق Sec-Ch-Ua إصدار المتصفح الذي تدّعيه في User-Agent. كما يجب أن يطابق Sec-Ch-Ua-Platform نظام التشغيل الذي تدّعيه. أي تناقضات تكشفك فورًا.
  • استمرار الجلسة: حافظ على ملفات الارتباط عبر الطلبات داخل الجلسة نفسها. وتوصي Scraperly باستقرار جلسة لمدة 48 ساعة مع بروكسيات منزلية متدوّرة.

تجاوز الكود: استخراج Target.com باستخدام Thunderbit كبديل بلا كود

بصراحة، يُعد Target.com من أصعب مواقع التجزئة للاستخراج برمجيًا. عرض JavaScript، وبصمة TLS من Akamai، واكتشاف بروكسيات مراكز البيانات، ومشاكل توافق إصدار ChromeDriver — كلها أجزاء كثيرة تتحرك معًا. إذا كنت تتعلم Python، فهذا تمرين ممتاز. أما إذا كنت تحتاج بيانات منتجات Target للعمل الفعلي، فغالبًا لا تكون معادلة التكلفة والفائدة في صالحك.

للأشخاص الذين يحتاجون البيانات من دون مشروع هندسي، Thunderbit يتولى الأجزاء الصعبة تلقائيًا.

كيف يتعامل Thunderbit مع تحديات Target.com

تعمل أداة استخراج الويب بالذكاء الاصطناعي من Thunderbit داخل متصفحك، ما يعني أنها تعرض JavaScript طبيعيًا — من دون إعداد Selenium، ومن دون تهيئة متصفح بلا واجهة، ومن دون إدارة إصدارات ChromeDriver. المتصفح نفسه هو أداة الاستخراج.

هذه هي سير العمل:

  1. ثبّت إضافة Thunderbit لمتصفح Chrome وانتقل إلى صفحة منتج أو بحث في Target
  2. انقر "AI Suggest Fields" — يقرأ Thunderbit الصفحة ويقترح أسماء الأعمدة (عنوان المنتج، السعر، التقييم، رابط الصورة، إلخ)
  3. انقر "Scrape" — تُستخرج البيانات في ثوانٍ مباشرة من الصفحة المعروضة

لا حاجة إلى إعداد بروكسيات. ولا إلى محاكاة بصمات TLS. ولا إلى نتائج None.

استخراج قوائم منتجات Target وصفحات التفاصيل

تأتي الفائدة الحقيقية مع سير العمل متعدد الصفحات. استخرج صفحة نتائج البحث في Target للحصول على قائمة منتجات، ثم استخدم Subpage Scraping لزيارة كل رابط منتج تلقائيًا وإثراء جدولك ببيانات صفحة التفاصيل — الأوصاف، والمراجعات الكاملة، والمواصفات — من دون كتابة كود الترقيم الصفحي أو إدارة جلسات المتصفح.

صدّر مباشرة إلى Excel أو Google Sheets أو Airtable أو Notion. من دون شفرة csv.writer مكررة، ومن دون مشاكل ترميز الملفات.

أتمتة عمليات الاستخراج المتكررة من Target.com

لمراقبة الأسعار المستمرة أو تتبع المخزون، تتيح لك Scheduled Scraper في Thunderbit وصف الجدول الزمني باللغة الطبيعية (مثل: «كل يوم اثنين الساعة 9 صباحًا»). لا حاجة إلى cron jobs، ولا إعداد خادم، ولا إبقاء سكربت Python حيًا على VPS. وهذا مفيد بشكل خاص لفرق التجارة الإلكترونية التي تتابع أسعار المنافسين — إذ إن 81% من متاجر التجزئة الأمريكية تستخدم الآن استخراج الأسعار الآلي، ويبلغ متوسط العائد على استثمار ذكاء الأسعار 27:1.

متى تستخدم كل طريقة لاستخراج Target.com باستخدام Python

إليك إطار قرار سريع:

حالتكالطريقة الموصى بها
تتعلم Python، ومشروعك صغيرالطريقة 1: Requests + BS4 (للبيانات الثابتة و__TGT_DATA__)
تحتاج صفحات منتجات كاملة مع الأسعار والمراجعاتالطريقة 2: Selenium / Playwright
استخراج بيانات منتجات بالجملة وعلى نطاق واسعالطريقة 3: Redsky API
تحتاج البيانات بسرعة من دون كتابة كودThunderbit (بلا كود)
مراقبة الأسعار بشكل متكررThunderbit Scheduled Scraper أو Redsky API + cron
مشروع بحث لمرة واحدة، وفريق غير تقنيThunderbit — بصراحة أسرع طريق

إذا كنت تبني خط بيانات إنتاجي، فتعطيك الطريقة 3 (Redsky API) أفضل سرعة وموثوقية. وإذا كنت تقوم ببحث لمرة واحدة أو لا يملك فريقك خبرة في Python، فإن Thunderbit يوفر عليك ساعات. وإذا كنت تتعلم استخراج الويب، فإن التسلسل الطبيعي هو: الطريقة 1 → الطريقة 2 → الطريقة 3، لأنه يعلّمك شيئًا حقيقيًا في كل خطوة.

الاعتبارات القانونية والأخلاقية عند استخراج Target.com

من المفيد تغطية هذا باختصار. يحتوي robots.txt الخاص بـTarget على نحو 120+ مسار Disallow، لكنه لا يحظر بشكل ملحوظ /p/ (المنتجات) أو /c/ (الفئات) — أي إن صفحات المنتجات والفئات مسموح بها صراحةً للزحف. أما صفحات سلة التسوق والحساب والدفع فمقيدة.

شروط خدمة Target تمنع الوصول الآلي. ومع ذلك، فإن كون Redsky API متاحًا للعامة عمدًا (بحسب تأكيد فريق Target الهندسي) يقلل المخاطر القانونية لجمع البيانات عبر الـAPI.

السوابق القانونية المهمة التي ينبغي الانتباه لها:

  • hiQ ضد LinkedIn (الدائرة التاسعة، 2022): استخراج البيانات المتاحة للعامة لا ينتهك قانون CFAA
  • Meta ضد Bright Data (2024): خسرت Meta — ورأت المحكمة عدم وجود انتهاك لـCFAA في استخراج البيانات العامة

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

الخلاصة والنقاط الرئيسية

يستحق Target.com تقييم الصعوبة الذي يحصل عليه. فأسلوب Requests + BeautifulSoup الساذج يفشل لأن Target يعرض بيانات المنتجات عبر JavaScript، وAkamai يبصم مصافحة TLS الخاصة بك قبل أن تتلقى أي استجابة أصلًا. لكن بالطريقة الصحيحة، يصبح الاستخراج مباشرًا.

الطرق الثلاث، مرتبة حسب الموثوقية:

  1. Redsky API — الأسرع والأوثق للبيانات بالجملة، ويعيد JSON نظيفًا. يتطلب هندسة عكسية لنقاط النهاية عبر DevTools.
  2. Selenium / Playwright — يتعامل مع عرض JavaScript، ويمنحك كل ما في الصفحة. أبطأ لكنه شامل.
  3. Requests + BeautifulSoup — يقتصر على HTML الثابت وJSON المضمَّن __TGT_DATA__. سريع لكنه غير كامل.

أكبر المكاسب التقنية:

  • استخدم curl_cffi بدل requests القياسية لتحقيق تحسن 15 ضعفًا في تفادي الروبوتات
  • البروكسيات المنزلية ضرورية — إذ تُعلَّم عناوين IP الخاصة بمراكز البيانات فورًا
  • أضف ترويسات Sec-Fetch-* في كل طلب — فغيابها يسبب حظرًا فوريًا
  • تهيئة الجلسة (زيارة الصفحة الرئيسية أولًا) تحسن معدلات النجاح بشكل ملحوظ

وإذا لم تكن Python تستحق هذا العناء في حالتك، فإن إضافة Thunderbit لمتصفح Chrome تتولى عرض JavaScript، وإجراءات مكافحة الروبوتات، وتصدير البيانات تلقائيًا. جرّب الخطة المجانية وانظر إن كانت تمنحك ما تحتاجه في دقائق بدلًا من ساعات.

للمزيد من أدلة الاستخراج ونصائح جمع البيانات، اطلع على مدونة Thunderbit أو قناتنا على YouTube.

الأسئلة الشائعة

هل يمكنني استخراج Target.com باستخدام Python Requests وBeautifulSoup فقط؟

جزئيًا. يمكنك استخراج عناوين المنتجات، والروابط، وبعض بيانات JSON المضمَّنة من وسوم __TGT_DATA__ في صفحات المنتجات. لكن الأسعار، والتقييمات، والمراجعات، والتوفر في صفحات نتائج البحث كلها تُعرض بواسطة JavaScript ولن تظهر عبر طلبات HTTP الثابتة. للحصول على بيانات كاملة، استخدم Selenium/Playwright أو Redsky API.

لماذا يعود لي السعر بقيمة None عند استخراج Target.com؟

يحمّل Target بيانات التسعير عبر JavaScript بعد تحميل الصفحة الأولي. عندما تستخدم requests.get()، فإنك تتلقى هيكل HTML قبل التنفيذ — قبل أن يعمل JavaScript ويحقن بيانات المنتج داخل DOM. عناصر السعر لا تكون موجودة حرفيًا في الاستجابة. استخدم متصفحًا بلا واجهة مثل Selenium أو Playwright يعرض JavaScript، أو اتصل بـRedsky API مباشرة للحصول على JSON، أو استخدم أداة مثل Thunderbit التي تستخرج البيانات من صفحة المتصفح المعروضة.

هل استخراج Target.com قانوني؟

يُسمح عمومًا باستخراج البيانات المتاحة للعامة وفق السوابق القضائية الحالية في الولايات المتحدة (hiQ ضد LinkedIn، وMeta ضد Bright Data). ويسمح robots.txt الخاص بـTarget بزحف صفحات المنتجات والفئات. لكن شروط الخدمة لدى Target تحظر الوصول الآلي، لذا توجد منطقة رمادية. لأبحاث السوق ومقارنة الأسعار باستخدام بيانات عامة، فأنت في وضع قانوني معقول. أما للعمليات التجارية واسعة النطاق، فاستشر محاميًا.

ما هي Redsky API الخاصة بـTarget وكيف أصل إليها؟

Redsky هي واجهة Target الداخلية التي تغذي بيانات المنتجات في الواجهة الأمامية. ليست API عامة تتوفر لها وثائق وتسجل فيها للحصول على مفاتيح — بل هي الواجهة الخلفية التي يستدعيها تطبيق React لعرض صفحات المنتجات. يمكنك اكتشاف نقاط النهاية الخاصة بها بفتح Chrome DevTools، وتصفية تبويب Network حسب XHR/Fetch، والبحث عن الطلبات إلى redsky.target.com. ويكون مفتاح الـAPI مضمنًا في رابط الطلب كمعامل استعلام. وقد أكد فريق هندسة Target أن الـAPI متاحة للعامة عمدًا.

كيف أتجنب الحظر أثناء استخراج Target.com؟

أكثر تغيير مؤثر هو استخدام curl_cffi بدل requests القياسية في Python لمحاكاة بصمات TLS الخاصة بالمتصفح — وهذا وحده يرفع معدلات النجاح من 12% إلى 92%. وبعد ذلك: استخدم بروكسيات منزلية (وليس مراكز بيانات)، ودوّر سلاسل User-Agent، وأضف تأخيرات عشوائية من 2 إلى 7 ثوانٍ بين الطلبات، وتضمن كل ترويسات Sec-Fetch-*، وتهيئة الجلسة بزيارة الصفحة الرئيسية أولًا. أو استخدم أداة مثل Thunderbit تتولى مكافحة الروبوتات تلقائيًا من دون أي إعداد.

اعرف المزيد

Ke
Ke
المدير التقني في Thunderbit | عالم بيانات أول وخبير في تعلّم الآلة بخبرة تقارب عقدًا من الزمن في تعلّم الآلة وعلم البيانات، كيه شين خريج جامعة كولومبيا وكان سابقًا عالم بيانات أول في Walmart Labs. وبفضل خبرته العميقة المعترف بها من قبل الأقران في Python وR وJava والإحصاء، يشارك رؤى مجرّبة حول نقل خوارزميات الذكاء الاصطناعي المعقدة من النظرية إلى بنية جاهزة للإنتاج.
جدول المحتويات

استخرج صفحة ويب بمجرد أن تطلب

قل ما تحتاجه بوضوح. أو الأفضل، لا تقل شيئًا على الإطلاق.

جرّب Thunderbit مجاني
استخرج البيانات باستخدام الذكاء الاصطناعي
انقل البيانات بسهولة إلى Google Sheets أو Airtable أو Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week