كان برنامج استخراج تقييمات Amazon الذي أستخدمه شغال تمامًا لمدة ستة أسابيع — وبعدين، فجأة في صباح يوم ما، صار يرجّع 200 OK لكن بصفحة فاضية بالكامل. لا رسالة خطأ، لا CAPTCHA، فقط HTML بلا أي محتوى، مع أن مئات التقييمات كانت تظهر قبلها مباشرة.
إذا هذا المشهد يذكّرك بشيء، فأنت مو وحدك. في أواخر 2025 بدأت Amazon تحط صفحات التقييمات الكاملة خلف جدار تسجيل دخول، وانهارت خلال ليلة واحدة أعداد كبيرة من سكربتات Python. قضيت الأشهر الماضية في أتعامل مع المشكلة من جهتين — أبني أداة الاستخراج بالذكاء الاصطناعي عندنا، وبنفس الوقت أحافظ على خط أنابيب تقييماتي المكتوب بـ Python — لذلك حسّيت أن الوقت مناسب أكتب الدليل الذي كنت أتمنى يكون موجود وقت توقف السكربت عندي. هذا المقال يشرح الطريقة العملية: المصادقة المعتمدة على الكوكيز، واستخدام selectors ثابتة تصمد قدام تشويش Amazon على CSS، وحلول تجاوز حد الـ 10 صفحات، وآليات مقاومة البوتات، وقسم إضافي عن تحليل المشاعر يحوّل نصوص التقييمات الخام إلى رؤى تجارية فعلية. وإذا وصلت لنص المقال وقلت لنفسك: "الأفضل ألا أستمر مع كل هذا الكود"، فبوريك كيف ينجز نفس المهمة في حوالي دقيقتين ومن دون ما تكتب أي Python.
ما هو استخراج تقييمات Amazon ولماذا يهم؟
استخراج تقييمات Amazon هو ببساطة سحب بيانات مراجعات العملاء بشكل برمجي — مثل عدد النجوم، ونص التقييم، واسم الكاتب، والتاريخ، وشارات الشراء الموثق — من صفحات المنتجات على Amazon. وبما أن Amazon ولم ترجع تضيفه، فالويب سكرايبينغ هو الطريق البرمجي الوحيد للوصول لهذي البيانات.
والأرقام تبيّن ليه هذا مهم. ، و. حتى مجرد عرض 5 تقييمات فقط على صفحة المنتج يمكن أن . والشركات التي تحلل مشاعر التقييمات بشكل منهجي تحقق . هذي مو مجرد أرقام نظرية عن علم البيانات — هذي إشارات ذكاء تنافسي، ومؤشرات لتحسين المنتج، ولغة تسويق، كلها مكتوبة بوضوح على خوادم Amazon.
لماذا نستخدم Python لاستخراج تقييمات Amazon
Python ما يزال الخيار الأول لهالنوع من الشغل. فهو ، ومنظومته — requests وBeautifulSoup وpandas وScrapy — تخلي الويب سكرايبينغ متاح حتى للي ما يتفرغون للتطوير.
والطريقة اللي تستفيد فيها الفرق من هذي البيانات تختلف حسب الفريق:
| الفريق | حالة الاستخدام | ما الذي يتم استخراجه |
|---|---|---|
| المنتج / البحث والتطوير | رصد الشكاوى المتكررة وتحديد الأولويات | نصوص تقييمات 1–2 نجمة، تكرار الكلمات المفتاحية |
| المبيعات | مراقبة مشاعر العملاء تجاه منتجات المنافسين | التقييمات، اتجاهات حجم المراجعات |
| التسويق | استخراج لغة العملاء لاستخدامها في الإعلانات | عبارات التقييمات الإيجابية، الإشارات إلى الميزات |
| عمليات التجارة الإلكترونية | تتبع مشاعر العملاء تجاه المنتج مع الوقت | توزيع النجوم، نسبة الشراء الموثق |
| أبحاث السوق | مقارنة رواد الفئة عبر الميزات | مجموعات بيانات تقييمات متعددة ASIN |
أحد علامات أدوات المطبخ ، فعدّلت المنتج ورجعت أول بائع خلال 60 يومًا. وشركة أجهزة تتبع اللياقة ، وحددت مشكلة حساسية من اللاتكس، وأطلقت نسخة مضادة للحساسية، وخفّضت المرتجعات بنسبة 40%. هذا هو نوع العائد على الاستثمار اللي يخلي الجهد الهندسي يستاهل.
جدار تسجيل الدخول: لماذا توقف برنامج استخراج تقييمات Amazon عن العمل
في 14 نوفمبر 2024، . وأكد هذا التغيير و. إذا فتحت /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}/) ما تزال تعرض حوالي بدون مصادقة. هذي التقييمات تختارها خوارزمية Amazon يدويًا، وهي مفيدة لنظرة سريعة على المشاعر، لكنها ما تدعم الفرز أو التصفية أو التصفح بين الصفحات.
أما صفحات التقييمات الكاملة (/product-reviews/{ASIN}/) — مع الفرز حسب الأحدث، والتصفية بحسب عدد النجوم، والتنقل بين مئات التقييمات — فهي تحتاج تسجيل دخول.
إذا كنت تحتاج فقط كم تقييم علشان تاخذ نبضة سريعة، خذها من صفحة المنتج. أما إذا كنت تبي المئات أو الآلاف، فلازم تتعامل مع المصادقة.
ما الذي تحتاجه قبل البدء: إعداد Python والمكتبات
قبل تكتب أي كود، هذا الإعداد الأساسي:
- المستوى المطلوب: متوسط (إلمام بـ Python وفهم أساسي لـ HTML)
- الوقت المطلوب: حوالي 45 دقيقة لخط الأنابيب الكامل؛ وحوالي 10 دقائق لاستخراج أساسي
- المتطلبات: Python 3.8+، متصفح Chrome، وحساب Amazon صالح
ثبّت المكتبات الأساسية:
1pip install requests beautifulsoup4 lxml pandas textblob
اختياريًا (لتحليل مشاعر متقدم):
1pip 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
جهّز جلستك بالشكل هذا:
1import requests
2session = requests.Session()
3# الصق قيم الكوكيز هنا
4cookies = {
5 "session-id": "YOUR_SESSION_ID",
6 "session-id-time": "YOUR_SESSION_ID_TIME",
7 "session-token": "YOUR_SESSION_TOKEN",
8 "ubid-main": "YOUR_UBID_MAIN",
9 "at-main": "YOUR_AT_MAIN",
10 "sess-at-main": "YOUR_SESS_AT_MAIN",
11 "x-main": "YOUR_X_MAIN",
12}
13headers = {
14 "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",
15 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
16 "Accept-Language": "en-US,en;q=0.5",
17}
18session.cookies.update(cookies)
19session.headers.update(headers)
مهم: أعد استخدام نفس كائن session في كل الطلبات. هذا يحافظ على اتساق الكوكيز ويخلي السلوك أقرب إلى جلسة متصفح حقيقية. عادةً الكوكيز تعيش من أيام إلى أسابيع تحت ضغط الاستخراج، لكن إذا رجعت تشوف تحويل إلى صفحة تسجيل الدخول، حدّثها من المتصفح مرة ثانية.
أما في الأسواق غير .com، فتتغير أسماء الكوكيز شوي — فمثلًا amazon.de يستخدم at-acbde بدل at-main، وamazon.co.uk يستخدم at-acbuk، وهكذا. وكل سوق يحتاج جلسة مستقلة خاصة فيه.
الخطوة 2: بناء الطلب وتحليل HTML الخاص بالتقييمات باستخدام BeautifulSoup
يتبع رابط تقييمات Amazon هذا النمط:
1https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1
والدالة الأساسية:
1from bs4 import BeautifulSoup
2import time, random
3def get_soup(session, url):
4 time.sleep(random.uniform(2, 5)) # تأخير مهذب
5 response = session.get(url, timeout=15)
6 # اكتشاف جدار تسجيل الدخول
7 if "ap_email" in response.text or "Amazon Sign-In" in response.text:
8 raise Exception("تم اكتشاف جدار تسجيل الدخول — حدّث الكوكيز")
9 if response.status_code != 200:
10 raise Exception(f"HTTP {response.status_code}")
11 return BeautifulSoup(response.text, "lxml")
فيه حيلة مفيدة: قبل تدخل على صفحة التقييمات، زر صفحة المنتج أولًا. هذا يخلق نمط تصفح طبيعي داخل الجلسة.
1# زيارة صفحة المنتج أولًا (يحاكي التصفح الحقيقي)
2product_url = f"https://www.amazon.com/dp/{asin}"
3session.get(product_url, timeout=15)
4time.sleep(random.uniform(1, 3))
5# ثم الانتقال إلى صفحة التقييمات
6reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
7soup = 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:
1import re
2def extract_reviews(soup):
3 reviews = []
4 review_divs = soup.select('[data-hook="review"]')
5 for div in review_divs:
6 # عدد النجوم
7 rating_el = div.select_one('[data-hook="review-star-rating"]')
8 rating = None
9 if rating_el:
10 rating_text = rating_el.get_text(strip=True)
11 match = re.search(r'(\d\.?\d?)', rating_text)
12 if match:
13 rating = float(match.group(1))
14 # العنوان
15 title_el = div.select_one('[data-hook="review-title"]')
16 title = title_el.get_text(strip=True) if title_el else ""
17 # النص
18 body_el = div.select_one('[data-hook="review-body"]')
19 body = body_el.get_text(strip=True) if body_el else ""
20 # الكاتب
21 author_el = div.select_one('span.a-profile-name')
22 author = author_el.get_text(strip=True) if author_el else ""
23 # التاريخ والبلد
24 date_el = div.select_one('[data-hook="review-date"]')
25 date_text = date_el.get_text(strip=True) if date_el else ""
26 # الصيغة: "Reviewed in the United States on January 15, 2025"
27 country_match = re.search(r'Reviewed in (.+?) on', date_text)
28 date_match = re.search(r'on (.+)$', date_text)
29 country = country_match.group(1) if country_match else ""
30 date = date_match.group(1) if date_match else ""
31 # الشراء الموثق
32 verified_el = div.select_one('[data-hook="avp-badge"]')
33 verified = bool(verified_el)
34 reviews.append({
35 "author": author,
36 "rating": rating,
37 "title": title,
38 "content": body,
39 "date": date,
40 "country": country,
41 "verified": verified,
42 })
43 return reviews
استخدمت هذي المجموعة من selectors مع عدة ASINs لعدة أشهر، وما تغيرت سمات data-hook مرة واحدة. أما CSS classes، فتغيرت مرتين على الأقل خلال نفس الفترة.
الخطوة 4: التعامل مع التصفح وحد Amazon عند 10 صفحات
Amazon تفرض حد أقصى على قيمة pageNumber يساوي 10 صفحات، وكل صفحة فيها 10 تقييمات — يعني سقف صارم يقارب 100 تقييم لكل تركيبة من الفلاتر. زر "Next page" يختفي ببساطة بعد الصفحة 10.
حلقة التصفح الأساسية:
1all_reviews = []
2for page in range(1, 11):
3 url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
4 soup = get_soup(session, url)
5 page_reviews = extract_reviews(soup)
6 if not page_reviews:
7 break # لا توجد تقييمات إضافية في هذه الصفحة
8 all_reviews.extend(page_reviews)
9 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 تقييم لكل منتج — ومع المنتجات اللي توزيع نجومها غير متوازن، غالبًا تقترب من مجموعة التقييمات الكاملة.
1star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
2sort_orders = ["recent", "helpful"]
3all_reviews = []
4seen_titles = set() # إزالة تكرار بسيطة
5for star in star_filters:
6 for sort in sort_orders:
7 for page in range(1, 11):
8 url = (
9 f"https://www.amazon.com/product-reviews/{asin}"
10 f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
11 )
12 soup = get_soup(session, url)
13 page_reviews = extract_reviews(soup)
14 if not page_reviews:
15 break
16 for review in page_reviews:
17 # إزالة التكرار عبر العنوان + اسم الكاتب
18 key = (review["title"], review["author"])
19 if key not in seen_titles:
20 seen_titles.add(key)
21 all_reviews.append(review)
22 print(f"[{star}/{sort}] Page {page}: {len(page_reviews)} reviews")
23print(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 التقليدي في الإنتاج |
غلاف إعادة محاولة جاهز للإنتاج:
1import time, random
2USER_AGENTS = [
3 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
4 "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",
5 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
6 "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",
7 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
8]
9def scrape_with_retries(session, url, max_retries=3):
10 for attempt in range(max_retries):
11 try:
12 session.headers["User-Agent"] = random.choice(USER_AGENTS)
13 time.sleep(random.uniform(2, 5))
14 response = session.get(url, timeout=15)
15 # اكتشاف الحظر
16 if "validateCaptcha" in response.url or "Robot Check" in response.text:
17 wait = (2 ** attempt) * 5
18 print(f"تم اكتشاف CAPTCHA. الانتظار {wait} ثانية...")
19 time.sleep(wait)
20 continue
21 if response.status_code in (429, 503):
22 wait = (2 ** attempt) * 2
23 print(f"تم تحديد المعدل ({response.status_code}). الانتظار {wait} ثانية...")
24 time.sleep(wait)
25 continue
26 if "ap_email" in response.text:
27 raise Exception("جدار تسجيل الدخول — انتهت صلاحية الكوكيز")
28 return BeautifulSoup(response.text, "lxml")
29 except Exception as e:
30 if attempt == max_retries - 1:
31 raise
32 print(f"فشلت المحاولة {attempt + 1}: {e}")
33 return None
ملاحظة بخصوص البروكسيات: Amazon (AWS وGCP وAzure وDigitalOcean) على مستوى الشبكة. إذا كنت تستخرج أكثر من كم مئات من الصفحات، فالبروكسيات السكنية تصير شبه ضرورية — وتوقع تصرف 50–200 دولار أو أكثر شهريًا حسب الحجم. أما للمشاريع الأصغر (أقل من 100 طلب يوميًا)، فغالبًا يكفي تخفيف الطلبات بشكل جيد من عنوان IP منزلي.
Amazon أيضًا تدقق في بصمة TLS. مكتبة Python requests لها قياس JA3 معروف . في أدوات الاستخراج الإنتاجية، فكّر في curl_cffi لأنها تنتحل طبقات TLS الخاصة بالمتصفحات الحقيقية. أما للاستخراج على نطاق تعليمي (بضع مئات من الصفحات)، فعادة requests مع هيدر جيد تكفي.
الخطوة 6: تصدير تقييمات Amazon المستخرجة إلى CSV أو Excel
بعد ما تجمع التقييمات، تحويلها لصيغة قابلة للاستخدام سهل باستخدام pandas:
1import pandas as pd
2df = pd.DataFrame(all_reviews)
3df.to_csv("amazon_reviews.csv", index=False)
4print(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 تشتغل، لكنها تحتاج — إنشاء مشروع، تفعيل واجهتي API، إنشاء بيانات اعتماد service account، ثم مشاركة الجدول. وإذا حسيت أن الإعداد هذا أثقل من الاستخراج نفسه، فأنت على حق. (وهنا يبان كيف أداة مثل تصدّر إلى Google Sheets بنقرة واحدة وتبدو خيارًا مغريًا جدًا.)
ميزة إضافية: أضف تحليل المشاعر إلى تقييماتك المستخرجة في 5 أسطر Python
أغلب الشروحات تتوقف عند تصدير CSV. لكن تحليل المشاعر هو اللي يحوّل البيانات الخام إلى قرارات تجارية.
أسرع بداية تستخدم TextBlob:
1from textblob import TextBlob
2df["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. ، و مقارنة بالأدوات المعجمية. بل إن نموذج nlptown/bert-base-multilingual-uncased-sentiment يتنبأ مباشرةً بتقييم من 1 إلى 5 نجوم:
1from transformers import pipeline
2clf = pipeline("sentiment-analysis",
3 model="nlptown/bert-base-multilingual-uncased-sentiment")
4df["predicted_stars"] = df["content"].apply(
5 lambda x: int(clf(str(x)[:512])[0]["label"][0])
6)
تقييمات Amazon تتبع — قفزة كبيرة عند 5 نجوم، وقفزة أصغر عند 1 نجمة، ووادي في الوسط. هذا يعني أن متوسط التقييم غالبًا مؤشر ضعيف على الجودة الحقيقية للمنتج. افصل مجموعة التقييمات ذات النجمة الواحدة، وابدأ استخرج الأنماط المتكررة — هنا غالبًا تختبئ العيوب اللي فعلاً ممكن إصلاحها.
المقايضة الصادقة: Python بنفسك مقابل واجهات scraping مدفوعة مقابل Thunderbit
أنا أدرت أدوات استخراج Python خاصة بـ Amazon، وبصراحة: هي تتعطل. الـ selectors تتغير، والكوكيز تنتهي صلاحيتها، وAmazon تطلق طبقة جديدة من كشف البوتات، وفجأة يصير صباح السبت مخصص لتشخيص أداة استخراج بدل تحليل البيانات. وحتى المستخدمين في المنتديات يكررون نفس الإحباط — سكربتات "كانت شغالة الشهر الماضي" وتحتاج الآن ترقيع مستمر.
هذه مقارنة بين الأساليب الثلاثة الرئيسية:
| المعيار | Python بنفسك (BS4/Selenium) | واجهة scraping مدفوعة | Thunderbit (بدون كود) |
|---|---|---|---|
| وقت الإعداد | 1–3 ساعات | 30 دقيقة (مفتاح API) | دقيقتان |
| التكلفة | مجاني (+ تكلفة البروكسي) | 50–200 دولار+/شهر | تتوفر خطة مجانية |
| التعامل مع جدار تسجيل الدخول | إدارة يدوية للكوكيز | غالبًا مدعوم | تتم المعالجة تلقائيًا |
| الصيانة | مرتفعة (الـ selectors تتعطل) | منخفضة (المزوّد يديرها) | صفر (الذكاء الاصطناعي يتكيف) |
| التصفح بين الصفحات | يحتاج كود مخصص | مدمج | مدمج |
| دعم عدة دول | جلسات منفصلة لكل نطاق | مدعوم غالبًا | يعتمد على المتصفح = حسب منطقتك |
| تحليل المشاعر | تضيف الكود بنفسك | أحيانًا مضمّن | صدّر إلى Sheets وحلل أينما شئت |
| الأفضل لـ | التعلم، والتحكم الكامل | خطوط إنتاج على نطاق واسع | سحب سريع للبيانات، وفرق غير تقنية |
Python يعطيك تحكم كامل، وهو فعلًا أفضل طريقة تفهم فيها وش يصير تحت الغطاء. لكن إذا كانت حالة الاستخدام هي: "أحتاج بيانات تقييمات المنافسين في جدول بيانات قبل الجمعة" بدل "أبي أبني خط أنابيب بيانات إنتاجي"، فتكلفة صيانة أداة مخصصة ممكن ما تكون تستاهل.
يتعامل مع المصادقة، والـ selectors، والتنقل بين الصفحات، والتصدير بعدد قليل من النقرات — جرّب وشوف إذا تناسب سير عملك. ومع استمرار Amazon في تشديد إجراءات مكافحة البوتات، صارت الأدوات المدعومة بالذكاء الاصطناعي والقادرة على التكيف في الوقت الحقيقي أقل من مجرد ميزة لطيفة، وأكثر من كونها ضرورة.
تقدر أيضًا تستكشف للحصول على شروحات مرئية لعمليات الاستخراج.
الأسئلة الشائعة
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. ولخيار بدون كود يتعامل مع جدار تسجيل الدخول والتنقل بين الصفحات تلقائيًا، جرّب .
5. كيف أتجنب الحظر أثناء استخراج Amazon؟
دوّر سلاسل User-Agent من مجموعة تضم 10+ سلاسل متصفح حقيقية، وأضف تأخيرات عشوائية بين 2 و5 ثوانٍ بين الطلبات، وطبّق التراجع الأسي عند أخطاء 503/429، واستخدم بروكسيات سكنية عند التوسع (لأن عناوين IP الخاصة بمراكز البيانات محظورة مسبقًا)، وحافظ على اتساق كوكيز الجلسة عبر الطلبات. ولحل بلا صيانة، Thunderbit يتولى آليات مكافحة البوتات تلقائيًا عبر جلسة متصفحك.
تعرف أكثر