كان برنامج استخراج تقييمات Amazon الذي أستخدمه شغال تمامًا لمدة ستة أسابيع — وبعدين، فجأة في صباح يوم ما، صار يرجّع 200 OK لكن بصفحة فاضية بالكامل. لا رسالة خطأ، لا CAPTCHA، فقط HTML بلا أي محتوى، مع أن مئات التقييمات كانت تظهر قبلها مباشرة.
إذا هذا المشهد يذكّرك بشيء، فأنت مو وحدك. في أواخر 2025 بدأت Amazon تحط صفحات التقييمات الكاملة خلف جدار تسجيل دخول، وانهارت خلال ليلة واحدة أعداد كبيرة من سكربتات Python. قضيت الأشهر الماضية في Thunderbit أتعامل مع المشكلة من جهتين — أبني أداة الاستخراج بالذكاء الاصطناعي عندنا، وبنفس الوقت أحافظ على خط أنابيب تقييماتي المكتوب بـ Python — لذلك حسّيت أن الوقت مناسب أكتب الدليل الذي كنت أتمنى يكون موجود وقت توقف السكربت عندي. هذا المقال يشرح الطريقة العملية: المصادقة المعتمدة على الكوكيز، واستخدام selectors ثابتة تصمد قدام تشويش Amazon على CSS، وحلول تجاوز حد الـ 10 صفحات، وآليات مقاومة البوتات، وقسم إضافي عن تحليل المشاعر يحوّل نصوص التقييمات الخام إلى رؤى تجارية فعلية. وإذا وصلت لنص المقال وقلت لنفسك: "الأفضل ألا أستمر مع كل هذا الكود"، فبوريك كيف Thunderbit ينجز نفس المهمة في حوالي دقيقتين ومن دون ما تكتب أي Python.
ما هو استخراج تقييمات Amazon ولماذا يهم؟
استخراج تقييمات Amazon هو ببساطة سحب بيانات مراجعات العملاء بشكل برمجي — مثل عدد النجوم، ونص التقييم، واسم الكاتب، والتاريخ، وشارات الشراء الموثق — من صفحات المنتجات على Amazon. وبما أن Amazon أزالت محتوى التقييمات من Product Advertising API عام 2010 ولم ترجع تضيفه، فالويب سكرايبينغ هو الطريق البرمجي الوحيد للوصول لهذي البيانات.
والأرقام تبيّن ليه هذا مهم. 95% من المتسوقين يقرأون التقييمات قبل الشراء، و94% يعتبرون Amazon المصدر الأول لتقييمات المنتجات. حتى مجرد عرض 5 تقييمات فقط على صفحة المنتج يمكن أن يرفع معدل التحويل بنسبة 270%. والشركات التي تحلل مشاعر التقييمات بشكل منهجي تحقق زيادة تصل إلى 15% في الاحتفاظ بالعملاء. هذي مو مجرد أرقام نظرية عن علم البيانات — هذي إشارات ذكاء تنافسي، ومؤشرات لتحسين المنتج، ولغة تسويق، كلها مكتوبة بوضوح على خوادم Amazon.
لماذا نستخدم Python لاستخراج تقييمات Amazon
Python ما يزال الخيار الأول لهالنوع من الشغل. فهو اللغة الأكثر طلبًا في استطلاع Stack Overflow للمطورين لعام 2024، ومنظومته — requests وBeautifulSoup وpandas وScrapy — تخلي الويب سكرايبينغ متاح حتى للي ما يتفرغون للتطوير.
والطريقة اللي تستفيد فيها الفرق من هذي البيانات تختلف حسب الفريق:
| الفريق | حالة الاستخدام | ما الذي يتم استخراجه |
|---|---|---|
| المنتج / البحث والتطوير | رصد الشكاوى المتكررة وتحديد الأولويات | نصوص تقييمات 1–2 نجمة، تكرار الكلمات المفتاحية |
| المبيعات | مراقبة مشاعر العملاء تجاه منتجات المنافسين | التقييمات، اتجاهات حجم المراجعات |
| التسويق | استخراج لغة العملاء لاستخدامها في الإعلانات | عبارات التقييمات الإيجابية، الإشارات إلى الميزات |
| عمليات التجارة الإلكترونية | تتبع مشاعر العملاء تجاه المنتج مع الوقت | توزيع النجوم، نسبة الشراء الموثق |
| أبحاث السوق | مقارنة رواد الفئة عبر الميزات | مجموعات بيانات تقييمات متعددة ASIN |
أحد علامات أدوات المطبخ استخرجت التقييمات السلبية ووجدت أن 22% منها تشير إلى أن "الطبقة غير اللاصقة تتآكل"، فعدّلت المنتج ورجعت أول بائع خلال 60 يومًا. وشركة أجهزة تتبع اللياقة رصدت عبارة "تهيّج السوار" من نص التقييمات، وحددت مشكلة حساسية من اللاتكس، وأطلقت نسخة مضادة للحساسية، وخفّضت المرتجعات بنسبة 40%. هذا هو نوع العائد على الاستثمار اللي يخلي الجهد الهندسي يستاهل.
جدار تسجيل الدخول: لماذا توقف برنامج استخراج تقييمات Amazon عن العمل
في 14 نوفمبر 2024، بدأت Amazon تطلب تسجيل الدخول لعرض صفحة التقييمات الكاملة للمنتج. وأكد هذا التغيير منتديات المجتمع ومدونات مزودي خدمات الاستخراج. إذا فتحت /product-reviews/{ASIN}/ في نافذة تصفح خاصة، غالبًا بينوديك لصفحة تسجيل الدخول بدل بيانات التقييمات.

الأعراض تكون خادعة: السكربت يحصل على استجابة 200 OK، لكن جسم HTML يحتوي على نموذج تسجيل دخول (name="email" وid="ap_password") بدل التقييمات. لا يوجد رمز خطأ. لا CAPTCHA. فقط... لا شيء مفيد.
Amazon سوت هالشي لأسباب مرتبطة بمكافحة البوتات والامتثال الإقليمي. والتطبيق مو ثابت — أحيانًا المتصفح النظيف يحمّل كم تقييم قبل ما يطلع الحاجز، خصوصًا في الصفحة الأولى — لكن بالنسبة لأي سكربت يشتغل على نطاق واسع، لازم تفترض أن الجدار موجود دائمًا.
ودومينات Amazon الخاصة بكل دولة (.de و.co.uk و.co.jp) عندها تطبيق منفصل لهالحاجز. وكما قال أحد المستخدمين في منتدى: "تحتاج تسجيل دخول منفصل لكل دولة." كوكيز .com ما بتشتغل على .co.uk.
التقييمات المميزة مقابل التقييمات الكاملة: ما الذي يمكن الوصول إليه دون تسجيل دخول
صفحات منتجات Amazon (/dp/{ASIN}/) ما تزال تعرض حوالي 8 "تقييمات مميزة" بدون مصادقة. هذي التقييمات تختارها خوارزمية Amazon يدويًا، وهي مفيدة لنظرة سريعة على المشاعر، لكنها ما تدعم الفرز أو التصفية أو التصفح بين الصفحات.
أما صفحات التقييمات الكاملة (/product-reviews/{ASIN}/) — مع الفرز حسب الأحدث، والتصفية بحسب عدد النجوم، والتنقل بين مئات التقييمات — فهي تحتاج تسجيل دخول.
إذا كنت تحتاج فقط كم تقييم علشان تاخذ نبضة سريعة، خذها من صفحة المنتج. أما إذا كنت تبي المئات أو الآلاف، فلازم تتعامل مع المصادقة.
ما الذي تحتاجه قبل البدء: إعداد Python والمكتبات
قبل تكتب أي كود، هذا الإعداد الأساسي:
- المستوى المطلوب: متوسط (إلمام بـ Python وفهم أساسي لـ HTML)
- الوقت المطلوب: حوالي 45 دقيقة لخط الأنابيب الكامل؛ وحوالي 10 دقائق لاستخراج أساسي
- المتطلبات: Python 3.8+، متصفح Chrome، وحساب Amazon صالح
ثبّت المكتبات الأساسية:
pip install requests beautifulsoup4 lxml pandas textblob
اختياريًا (لتحليل مشاعر متقدم):
pip install transformers torch
ما هو ASIN؟ هو المعرّف المكوّن من 10 أحرف لمنتجات Amazon. تلقاه في أي رابط منتج — مثلًا، في amazon.com/dp/B0BCNKKZ91 يكون ASIN هو B0BCNKKZ91. وهو المفتاح اللي بتحطه داخل رابط التقييمات.
الخطوة 1: تجاوز جدار تسجيل الدخول باستخدام المصادقة المعتمدة على الكوكيز
أوثق طريقة هي إنك تسجّل دخولك إلى Amazon في المتصفح، وبعدها تنسخ كوكيز الجلسة وتحقنها داخل requests.Session() في Python. هذي الطريقة تتجنب تفعيل CAPTCHA والمصادقة الثنائية عبر الرسائل، اللي غالبًا تعطل تسجيل الدخول الآلي باستخدام Selenium.
بتحتاج هذي الكوكيز السبعة:
| اسم الكوكي | الغرض |
|---|---|
session-id | معرّف جلسة متغير |
session-id-time | طابع زمني للجلسة |
session-token | رمز جلسة متغير |
ubid-main | معرّف تصفح المستخدم |
at-main | رمز المصادقة الأساسي |
sess-at-main | مصادقة مرتبطة بنطاق الجلسة |
x-main | معرّف مرتبط ببريد المستخدم الإلكتروني |
كيفية استخراج الكوكيز من Chrome DevTools
- سجّل دخولك إلى amazon.com في Chrome
- افتح DevTools (مفتاح F12 أو زر الفأرة الأيمن → Inspect)
- روح إلى Application → Storage → Cookies →
https://www.amazon.com - دور على كل اسم كوكي في الجدول وانسخ قيمته
- رتبها كسلسلة مفصولة بفواصل منقوطة لاستخدامها في Python
جهّز جلستك بالشكل هذا:
import requests
session = requests.Session()
# الصق قيم الكوكيز هنا
cookies = {
"session-id": "YOUR_SESSION_ID",
"session-id-time": "YOUR_SESSION_ID_TIME",
"session-token": "YOUR_SESSION_TOKEN",
"ubid-main": "YOUR_UBID_MAIN",
"at-main": "YOUR_AT_MAIN",
"sess-at-main": "YOUR_SESS_AT_MAIN",
"x-main": "YOUR_X_MAIN",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
}
session.cookies.update(cookies)
session.headers.update(headers)
مهم: أعد استخدام نفس كائن session في كل الطلبات. هذا يحافظ على اتساق الكوكيز ويخلي السلوك أقرب إلى جلسة متصفح حقيقية. عادةً الكوكيز تعيش من أيام إلى أسابيع تحت ضغط الاستخراج، لكن إذا رجعت تشوف تحويل إلى صفحة تسجيل الدخول، حدّثها من المتصفح مرة ثانية.
أما في الأسواق غير .com، فتتغير أسماء الكوكيز شوي — فمثلًا amazon.de يستخدم at-acbde بدل at-main، وamazon.co.uk يستخدم at-acbuk، وهكذا. وكل سوق يحتاج جلسة مستقلة خاصة فيه.
الخطوة 2: بناء الطلب وتحليل HTML الخاص بالتقييمات باستخدام BeautifulSoup
يتبع رابط تقييمات Amazon هذا النمط:
https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1
والدالة الأساسية:
from bs4 import BeautifulSoup
import time, random
def get_soup(session, url):
time.sleep(random.uniform(2, 5)) # تأخير مهذب
response = session.get(url, timeout=15)
# اكتشاف جدار تسجيل الدخول
if "ap_email" in response.text or "Amazon Sign-In" in response.text:
raise Exception("تم اكتشاف جدار تسجيل الدخول — حدّث الكوكيز")
if response.status_code != 200:
raise Exception(f"HTTP {response.status_code}")
return BeautifulSoup(response.text, "lxml")
فيه حيلة مفيدة: قبل تدخل على صفحة التقييمات، زر صفحة المنتج أولًا. هذا يخلق نمط تصفح طبيعي داخل الجلسة.
# زيارة صفحة المنتج أولًا (يحاكي التصفح الحقيقي)
product_url = f"https://www.amazon.com/dp/{asin}"
session.get(product_url, timeout=15)
time.sleep(random.uniform(1, 3))
# ثم الانتقال إلى صفحة التقييمات
reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
soup = get_soup(session, reviews_url)
الخطوة 3: استخدم selectors ثابتة لاستخراج بيانات التقييمات (وتوقف عن الاعتماد على CSS classes)
هنا أغلب الشروحات اللي بين 2022 و2023 تفشل. Amazon تشوّش أسماء CSS classes — تتغير بشكل دوري، وكما قال أحد المطورين الغاضبين في منتدى: "ولا واحدة منها كان لها نمط ثابت لأسماء span tags."
الحل: Amazon تستخدم سمات data-hook على عناصر التقييم، وهذي ثابتة بشكل واضح. هي معرّفات دلالية تعتمد عليها الواجهة نفسها، لذلك ما تنعمل لها عشوائية.
| حقل التقييم | selector ثابت (data-hook) | selector هش (class) |
|---|---|---|
| نص التقييم | [data-hook="review-body"] | .review-text-content (يتغير) |
| عدد النجوم | [data-hook="review-star-rating"] | .a-icon-alt (غير واضح) |
| عنوان التقييم | [data-hook="review-title"] | .review-title (أحيانًا) |
| اسم الكاتب | span.a-profile-name | ثابت نسبيًا |
| تاريخ التقييم | [data-hook="review-date"] | .review-date (يختلف حسب المنطقة) |
| الشراء الموثق | [data-hook="avp-badge"] | span.a-size-mini |
كود الاستخراج باستخدام selectors الخاصة بـ data-hook:
import re
def extract_reviews(soup):
reviews = []
review_divs = soup.select('[data-hook="review"]')
for div in review_divs:
# عدد النجوم
rating_el = div.select_one('[data-hook="review-star-rating"]')
rating = None
if rating_el:
rating_text = rating_el.get_text(strip=True)
match = re.search(r'(\d\.?\d?)', rating_text)
if match:
rating = float(match.group(1))
# العنوان
title_el = div.select_one('[data-hook="review-title"]')
title = title_el.get_text(strip=True) if title_el else ""
# النص
body_el = div.select_one('[data-hook="review-body"]')
body = body_el.get_text(strip=True) if body_el else ""
# الكاتب
author_el = div.select_one('span.a-profile-name')
author = author_el.get_text(strip=True) if author_el else ""
# التاريخ والبلد
date_el = div.select_one('[data-hook="review-date"]')
date_text = date_el.get_text(strip=True) if date_el else ""
# الصيغة: "Reviewed in the United States on January 15, 2025"
country_match = re.search(r'Reviewed in (.+?) on', date_text)
date_match = re.search(r'on (.+)$', date_text)
country = country_match.group(1) if country_match else ""
date = date_match.group(1) if date_match else ""
# الشراء الموثق
verified_el = div.select_one('[data-hook="avp-badge"]')
verified = bool(verified_el)
reviews.append({
"author": author,
"rating": rating,
"title": title,
"content": body,
"date": date,
"country": country,
"verified": verified,
})
return reviews
استخدمت هذي المجموعة من selectors مع عدة ASINs لعدة أشهر، وما تغيرت سمات data-hook مرة واحدة. أما CSS classes، فتغيرت مرتين على الأقل خلال نفس الفترة.
الخطوة 4: التعامل مع التصفح وحد Amazon عند 10 صفحات
Amazon تفرض حد أقصى على قيمة pageNumber يساوي 10 صفحات، وكل صفحة فيها 10 تقييمات — يعني سقف صارم يقارب 100 تقييم لكل تركيبة من الفلاتر. زر "Next page" يختفي ببساطة بعد الصفحة 10.
حلقة التصفح الأساسية:
all_reviews = []
for page in range(1, 11):
url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break # لا توجد تقييمات إضافية في هذه الصفحة
all_reviews.extend(page_reviews)
print(f"Page {page}: {len(page_reviews)} reviews")
كيف تحصل على أكثر من 10 صفحات من تقييمات Amazon
الحل البديل هو التجميع عبر الفلاتر. كل توليفة من filterByStar وsortBy تعطيك نافذة مستقلة من 10 صفحات.
قيم فلتر النجوم: one_star، two_star، three_star، four_star، five_star
قيم الفرز: recent، helpful (الافتراضي)
من خلال دمج 5 فلاتر للنجوم × ترتيبين للفرز، تقدر توصل إلى 100 صفحة كحد أقصى، يعني 1,000 تقييم لكل منتج — ومع المنتجات اللي توزيع نجومها غير متوازن، غالبًا تقترب من مجموعة التقييمات الكاملة.
star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
sort_orders = ["recent", "helpful"]
all_reviews = []
seen_titles = set() # إزالة تكرار بسيطة
for star in star_filters:
for sort in sort_orders:
for page in range(1, 11):
url = (
f"https://www.amazon.com/product-reviews/{asin}"
f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
)
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break
for review in page_reviews:
# إزالة التكرار عبر العنوان + اسم الكاتب
key = (review["title"], review["author"])
if key not in seen_titles:
seen_titles.add(key)
all_reviews.append(review)
print(f"[{star}/{sort}] Page {page}: {len(page_reviews)} reviews")
print(f"Total unique reviews: {len(all_reviews)}")
بعض التداخل بيصير بين المجموعات، لذلك إزالة التكرار أمر أساسي. أنا عادة أستخدم دمج عنوان التقييم + اسم الكاتب كمفتاح سريع — مو مثالي، لكنه يلتقط أغلب التكرارات.
الخطوة 5: تفادي أنظمة مكافحة البوتات (تدوير، إبطاء، إعادة المحاولة)
Amazon تستخدم نظام AWS WAF Bot Control، وصار أكثر تشددًا بشكل ملحوظ. الأساليب الأحادية مثل تدوير User-Agents فقط أو إضافة تأخيرات فقط ما عادت تكفي.
| التقنية | طريقة التنفيذ |
|---|---|
| تدوير User-Agents | اختيار عشوائي من أكثر من 10 سلاسل متصفح حقيقية |
| التراجع الأسي | تأخيرات إعادة المحاولة 2 ثانية → 4 ثوانٍ → 8 ثوانٍ عند 503 |
| خنق الطلبات | random.uniform(2, 5) ثوانٍ بين الصفحات |
| تدوير البروكسيات | التبديل بين بروكسيات سكنية |
| بصمة الجلسة | كوكيز وهيدر متسقين لكل جلسة |
| تقليد TLS | استخدام curl_cffi بدل requests التقليدي في الإنتاج |
غلاف إعادة محاولة جاهز للإنتاج:
import time, random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 15_7_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
]
def scrape_with_retries(session, url, max_retries=3):
for attempt in range(max_retries):
try:
session.headers["User-Agent"] = random.choice(USER_AGENTS)
time.sleep(random.uniform(2, 5))
response = session.get(url, timeout=15)
# اكتشاف الحظر
if "validateCaptcha" in response.url or "Robot Check" in response.text:
wait = (2 ** attempt) * 5
print(f"تم اكتشاف CAPTCHA. الانتظار {wait} ثانية...")
time.sleep(wait)
continue
if response.status_code in (429, 503):
wait = (2 ** attempt) * 2
print(f"تم تحديد المعدل ({response.status_code}). الانتظار {wait} ثانية...")
time.sleep(wait)
continue
if "ap_email" in response.text:
raise Exception("جدار تسجيل الدخول — انتهت صلاحية الكوكيز")
return BeautifulSoup(response.text, "lxml")
except Exception as e:
if attempt == max_retries - 1:
raise
print(f"فشلت المحاولة {attempt + 1}: {e}")
return None
ملاحظة بخصوص البروكسيات: Amazon تحظر عناوين IP الخاصة بمراكز البيانات المعروفة (AWS وGCP وAzure وDigitalOcean) على مستوى الشبكة. إذا كنت تستخرج أكثر من كم مئات من الصفحات، فالبروكسيات السكنية تصير شبه ضرورية — وتوقع تصرف 50–200 دولار أو أكثر شهريًا حسب الحجم. أما للمشاريع الأصغر (أقل من 100 طلب يوميًا)، فغالبًا يكفي تخفيف الطلبات بشكل جيد من عنوان IP منزلي.
Amazon أيضًا تدقق في بصمة TLS. مكتبة Python requests لها قياس JA3 معروف تقوم جدران الحماية بحظره مسبقًا. في أدوات الاستخراج الإنتاجية، فكّر في curl_cffi لأنها تنتحل طبقات TLS الخاصة بالمتصفحات الحقيقية. أما للاستخراج على نطاق تعليمي (بضع مئات من الصفحات)، فعادة requests مع هيدر جيد تكفي.
الخطوة 6: تصدير تقييمات Amazon المستخرجة إلى CSV أو Excel
بعد ما تجمع التقييمات، تحويلها لصيغة قابلة للاستخدام سهل باستخدام pandas:
import pandas as pd
df = pd.DataFrame(all_reviews)
df.to_csv("amazon_reviews.csv", index=False)
print(f"Exported {len(df)} reviews to amazon_reviews.csv")
مثال على المخرجات:
| author | rating | title | content | date | country | verified |
|---|---|---|---|---|---|---|
| Sarah M. | 5.0 | أفضل شراء هذا العام | البطارية تدوم طوال اليوم، والشاشة رائعة... | January 15, 2025 | the United States | True |
| Mike T. | 2.0 | محبط بعد أسبوعين | منفذ الشحن توقف عن العمل... | February 3, 2025 | the United States | True |
| Priya K. | 4.0 | قيمة ممتازة مقابل السعر | يؤدي كل ما أحتاجه، مع بعض البطء البسيط في التطبيقات الثقيلة... | March 10, 2025 | the United States | False |
للتصدير إلى Excel: استخدم df.to_excel("amazon_reviews.xlsx", index=False) (يتطلب openpyxl).
أما Google Sheets، فمكتبة gspread تشتغل، لكنها تحتاج أكثر من 8 خطوات لإعداد Google Cloud — إنشاء مشروع، تفعيل واجهتي API، إنشاء بيانات اعتماد service account، ثم مشاركة الجدول. وإذا حسيت أن الإعداد هذا أثقل من الاستخراج نفسه، فأنت على حق. (وهنا يبان كيف أداة مثل Thunderbit تصدّر إلى Google Sheets بنقرة واحدة وتبدو خيارًا مغريًا جدًا.)
ميزة إضافية: أضف تحليل المشاعر إلى تقييماتك المستخرجة في 5 أسطر Python
أغلب الشروحات تتوقف عند تصدير CSV. لكن تحليل المشاعر هو اللي يحوّل البيانات الخام إلى قرارات تجارية.
أسرع بداية تستخدم TextBlob:
from textblob import TextBlob
df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
هذا يعطيك درجة قطبية من -1.0 (سلبية جدًا) إلى +1.0 (إيجابية جدًا) لكل تقييم. مثال على المخرجات:
| content (مختصر) | rating | sentiment |
|---|---|---|
| "البطارية تدوم طوال اليوم، والشاشة رائعة..." | 5.0 | 0.65 |
| "توقف منفذ الشحن عن العمل بعد..." | 2.0 | -0.40 |
| "يفعل كل ما أحتاجه، مع بطء بسيط في..." | 4.0 | 0.25 |
| "سيئ جدًا. أعدته فورًا." | 1.0 | -0.75 |
| "لا بأس. ليس مميزًا لكنه يعمل." | 3.0 | 0.10 |
الحالات الأكثر إثارة هي اللي ما تطابق: تقييم 3 نجوم مع نص إيجابي، أو تقييم 5 نجوم مع لغة سلبية. هذي الفروق غالبًا تكشف رأي العميل الدقيق، الشي اللي النجوم وحدها ما توضحه.

وللحصول على دقة أعلى في الإنتاج، أنصح تستخدم Hugging Face Transformers. VADER تدرب على التغريدات وليس على مراجعات المنتجات، ونماذج المحولات توصل إلى دقة تتجاوز 98% في تصنيف المراجعات مقارنة بالأدوات المعجمية. بل إن نموذج nlptown/bert-base-multilingual-uncased-sentiment يتنبأ مباشرةً بتقييم من 1 إلى 5 نجوم:
from transformers import pipeline
clf = pipeline("sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment")
df["predicted_stars"] = df["content"].apply(
lambda x: int(clf(str(x)[:512])[0]["label"][0])
)
تقييمات Amazon تتبع توزيعًا على شكل حرف J — قفزة كبيرة عند 5 نجوم، وقفزة أصغر عند 1 نجمة، ووادي في الوسط. هذا يعني أن متوسط التقييم غالبًا مؤشر ضعيف على الجودة الحقيقية للمنتج. افصل مجموعة التقييمات ذات النجمة الواحدة، وابدأ استخرج الأنماط المتكررة — هنا غالبًا تختبئ العيوب اللي فعلاً ممكن إصلاحها.
المقايضة الصادقة: Python بنفسك مقابل واجهات scraping مدفوعة مقابل Thunderbit
أنا أدرت أدوات استخراج Python خاصة بـ Amazon، وبصراحة: هي تتعطل. الـ selectors تتغير، والكوكيز تنتهي صلاحيتها، وAmazon تطلق طبقة جديدة من كشف البوتات، وفجأة يصير صباح السبت مخصص لتشخيص أداة استخراج بدل تحليل البيانات. وحتى المستخدمين في المنتديات يكررون نفس الإحباط — سكربتات "كانت شغالة الشهر الماضي" وتحتاج الآن ترقيع مستمر.
هذه مقارنة بين الأساليب الثلاثة الرئيسية:
| المعيار | Python بنفسك (BS4/Selenium) | واجهة scraping مدفوعة | Thunderbit (بدون كود) |
|---|---|---|---|
| وقت الإعداد | 1–3 ساعات | 30 دقيقة (مفتاح API) | دقيقتان |
| التكلفة | مجاني (+ تكلفة البروكسي) | 50–200 دولار+/شهر | تتوفر خطة مجانية |
| التعامل مع جدار تسجيل الدخول | إدارة يدوية للكوكيز | غالبًا مدعوم | تتم المعالجة تلقائيًا |
| الصيانة | مرتفعة (الـ selectors تتعطل) | منخفضة (المزوّد يديرها) | صفر (الذكاء الاصطناعي يتكيف) |
| التصفح بين الصفحات | يحتاج كود مخصص | مدمج | مدمج |
| دعم عدة دول | جلسات منفصلة لكل نطاق | مدعوم غالبًا | يعتمد على المتصفح = حسب منطقتك |
| تحليل المشاعر | تضيف الكود بنفسك | أحيانًا مضمّن | صدّر إلى Sheets وحلل أينما شئت |
| الأفضل لـ | التعلم، والتحكم الكامل | خطوط إنتاج على نطاق واسع | سحب سريع للبيانات، وفرق غير تقنية |
Python يعطيك تحكم كامل، وهو فعلًا أفضل طريقة تفهم فيها وش يصير تحت الغطاء. لكن إذا كانت حالة الاستخدام هي: "أحتاج بيانات تقييمات المنافسين في جدول بيانات قبل الجمعة" بدل "أبي أبني خط أنابيب بيانات إنتاجي"، فتكلفة صيانة أداة مخصصة ممكن ما تكون تستاهل.
Thunderbit يتعامل مع المصادقة، والـ selectors، والتنقل بين الصفحات، والتصدير بعدد قليل من النقرات — جرّب الخطة المجانية وشوف إذا تناسب سير عملك. ومع استمرار Amazon في تشديد إجراءات مكافحة البوتات، صارت الأدوات المدعومة بالذكاء الاصطناعي والقادرة على التكيف في الوقت الحقيقي أقل من مجرد ميزة لطيفة، وأكثر من كونها ضرورة.
تقدر أيضًا تستكشف قناة Thunderbit على YouTube للحصول على شروحات مرئية لعمليات الاستخراج.
الأسئلة الشائعة
1. هل يمكن استخراج تقييمات Amazon من دون تسجيل الدخول؟
نعم، لكن فقط حوالي 8 "تقييمات مميزة" الظاهرة في صفحة تفاصيل المنتج (/dp/{ASIN}/). أما صفحات التقييمات الكاملة اللي تشمل الفرز والتصفية والتنقل بين الصفحات فتتطلب المصادقة منذ أواخر 2024. وفي أغلب حالات الاستخدام التجاري، بتحتاج تتعامل مع جدار تسجيل الدخول.
2. هل استخراج تقييمات Amazon قانوني؟
شروط خدمة Amazon تمنع الاستخراج الآلي. لكن أحكام قضائية أمريكية حديثة مثل Meta v. Bright Data، 2024؛ وhiQ v. LinkedIn، تدعم استخراج البيانات المتاحة للجمهور. أما الاستخراج من خلف تسجيل الدخول فيحمل مخاطر قانونية أعلى لأنك وافقت على شروط Amazon وقت إنشاء الحساب. استشر محاميًا عند الاستخدام التجاري.
3. كم عدد تقييمات Amazon التي يمكنني استخراجها لكل منتج؟
Amazon تحدد حدًا أقصى يبلغ 10 صفحات لكل ترتيب فرز وتوليفة فلتر نجوم. ومع استخدام جميع فلاتر النجوم الخمسة × ترتيبَي الفرز، تقدر توصل إلى 100 صفحة كحد أقصى (حوالي 1,000 تقييم) لكل منتج. ومع فلاتر الكلمات المفتاحية يكون الحد النظري أعلى بكثير، لكن مع تكرار كبير.
4. ما أفضل مكتبة Python لاستخراج تقييمات Amazon؟
requests + BeautifulSoup لتحليل HTML الثابت هي التوليفة الأكثر شيوعًا وموثوقية. أما Selenium فهو مفيد عندما تحتاج تنفيذ JavaScript. ولخيار بدون كود يتعامل مع جدار تسجيل الدخول والتنقل بين الصفحات تلقائيًا، جرّب Thunderbit.
5. كيف أتجنب الحظر أثناء استخراج Amazon؟
دوّر سلاسل User-Agent من مجموعة تضم 10+ سلاسل متصفح حقيقية، وأضف تأخيرات عشوائية بين 2 و5 ثوانٍ بين الطلبات، وطبّق التراجع الأسي عند أخطاء 503/429، واستخدم بروكسيات سكنية عند التوسع (لأن عناوين IP الخاصة بمراكز البيانات محظورة مسبقًا)، وحافظ على اتساق كوكيز الجلسة عبر الطلبات. ولحل بلا صيانة، Thunderbit يتولى آليات مكافحة البوتات تلقائيًا عبر جلسة متصفحك.
تعرف أكثر


