إخلاء مسؤولية قانونية: هذا الدليل مخصص لتتبع البيانات العامة فقط — صفحات بحث يمكن لأي مستخدم الوصول إليها بدون تسجيل دخول. في الولايات المتحدة، يخضع الوصول غير المصرح به لأنظمة الكمبيوتر لقانون CFAA (قانون الاحتيال وإساءة استخدام الكمبيوتر، 18 U.S.C. § 1030). في الاتحاد الأوروبي، تخضع معالجة البيانات الشخصية لـ GDPR (اللائحة العامة لحماية البيانات). لا تتجاوز مصادقة أو حدود وصول، ولا تجمع بيانات شخصية، واستخدم واجهة Amazon SP-API حيثما تتوفر.
إذا كنت بائعًا على أمازون أو مطور SEO متخصص في المتاجر الإلكترونية، فأنت تعلم أن ترتيب منتجك في نتائج البحث يحدد حجم مبيعاتك. تتبع ترتيب الكلمات المفتاحية في أمازون بالبروكسي هو الطريقة الوحيدة الموثوقة لمراقبة موقع منتجك (ASIN) في نتائج البحث العضوية عبر الأسواق المختلفة بشكل يومي وآلي. في هذا الدليل، نغطي كل ما تحتاجه: من تحليل صفحة النتائج، إلى استخدام البروكسي السكني مع استهداف جغرافي، إلى أمثلة بايثون قابلة للتشغيل ونصائح الإنتاج.
لماذا يعتبر بحث أمازون SERP مستقلاً بذاته
محرك بحث أمازون (المعروف بخوارزمية A9) يختلف جوهريًا عن بحث جوجل. ترتيب النتائج على أمازون يعتمد بشكل أساسي على سرعة المبيعات (sales velocity) وملاءمة المنتج للكلمة المفتاحية، وليس فقط على الروابط الخلفية أو سلطة النطاق كما في جوجل. هذا يعني أن البائعين يحتاجون إلى تتبع الموقع العضوي لكل كلمة مفتاحية، في كل سوق (marketplace)، ولككل ASIN على حدة.
على سبيل المثال، منتجك قد يظهر في المركز الثالث على amazon.com لكلمة "wireless earbuds" لكنه لا يظهر إطلاقًا على amazon.de لنفس الكلمة. بدون تتبع منتظم، لا يمكنك معرفة ما إذا كان ترتيبك يتحسن أم يتراجع بعد تغيير في العنوان أو الصور أو التسعير.
العناصر الأساسية التي يجب تتبعها لكل كلمة مفتاحية:
- الموقع العضوي (organic position): ترتيب ASIN في النتائج غير المدفوعة.
- الموقع المدفوع (Sponsored position): ما إذا كان المنتج يظهر كإعلان ممول.
- السوق (marketplace): amazon.com, amazon.de, amazon.co.uk وغيرها.
- رقم الصفحة: المنتج في الصفحة الأولى (المواضع 1–60) يحصل على معظم النقرات.
تحليل صفحة نتائج بحث أمازون
صفحة نتائج بحث أمازون (SERP) مبنية ببنية HTML يمكن تحليلها برمجيًا. كل نتيجة منتج مغلفة في عنصر div يحمل السمة data-component-type="s-search-result". داخل هذا العنصر، تجد السمة data-asin التي تحتوي على معرف ASIN للمنتج. الموقع العضوي يُحسب بترتيب النتائج غير المدفوعة فقط.
لاكتشاف الإعلانات الممولة (Sponsored)، ابحث عن نص "Sponsored" داخل النتيجة. أمازون يستخدم عناصر متعددة لتمييز الإعلانات، بما في ذلك [aria-label*="Sponsored"] وعناصر تحمل صنف s-label-popover-default. من المهم فصل النتائج المدفوعة عن العضوية حتى لا تخلط بينها في بيانات التتبع.
إليك كيفية تحليل الصفحة باستخدام BeautifulSoup:
from bs4 import BeautifulSoup
def parse_amazon_results(html):
soup = BeautifulSoup(html, "html.parser")
results = []
organic_pos = 0
for div in soup.select('[data-component-type="s-search-result"]'):
asin = div.get("data-asin", "")
if not asin:
continue
sponsored_el = div.select_one(
'[aria-label*="Sponsored"], .s-label-popover-default'
)
is_sponsored = sponsored_el is not None
if not is_sponsored:
organic_pos += 1
results.append({
"asin": asin,
"organic_position": organic_pos,
"sponsored": False
})
else:
results.append({
"asin": asin,
"organic_position": None,
"sponsored": True
})
return results
هذه الدالة تعيد قائمة بكل المنتجات في الصفحة مع موضعها العضوي و ما إذا كانت إعلانًا ممولًا. لاحظ أن organic_pos يزيد فقط للنتائج غير المدفوعة، مما يعني أن المنتج الأول عضويًا يحصل على الموضع 1 بغض النظر عن عدد الإعلانات قبله.
لماذا تحتاج إلى بروكسي سكني مع استهداف جغرافي
أمازون يطبق نظام مكافحة بوت قوي. عند إرسال طلبات متكررة من نفس عنوان IP، يظهر تحدي CAPTCHA (صفحة "Robot Check") بعد عدد قليل من الطلبات — غالبًا 50–100 طلب من نفس IP خلال فترة قصيرة. بالإضافة إلى ذلك، أمازون يوطن النتائج حسب الموقع الجغرافي للزائر، مما يعني أن نتائج البحث من IP في ألمانيا تختلف عن تلك من IP في الولايات المتحدة.
هذا يجعل البروكسي السكني (residential proxy) ضروريًا لسببين:
- تجاوز الحجب: عناوين IP السكنية تنتمي لمزودي خدمة إنترنت حقيقيين، مما يجعلها تبدو كمستخدمين عاديين وليس بوتات.
- الاستهداف الجغرافي: يمكنك تحديد الدولة لكل طلب، مما يضمن أنك ترى نفس النتائج التي يراها العميل في ذلك السوق.
مع ProxyHat، يتم تمرير علم الدولة في اسم المستخدم. على سبيل المثال:
user-country-USلـ amazon.comuser-country-DEلـ amazon.deuser-country-GBلـ amazon.co.uk
للتصفح عبر صفحات متعددة (pagination)، استخدم معرف جلسة ثابت (sticky session) لضمان أن نفس عنوان IP يُستخدم لجميع صفحات نفس الكلمة المفتاحية. هذا يمنع أمازون من عرض نتائج مختلفة بسبب تغيير IP بين الصفحات:
# جلسة ثابتة لتصفح 5 صفحات بنفس IP
http://user-country-US-session-keyword001:pass@gate.proxyhat.com:8080
مقارنة أنواع البروكسي لتتبع أمازون
| النوع | معدل النجاح | زمن الاستجابة | ملاءمة تتبع أمازون |
|---|---|---|---|
| بروكسي سكني (Residential) | 90–99% | 200–800ms | الأفضل — عناوين IP حقيقية، استهداف جغرافي دقيق |
| بروكسي مركز بيانات (Datacenter) | 30–60% | 50–150ms | ضعيف — يُكتشف بسرعة بواسطة أمازون |
| بروكسي جوال (Mobile) | 95–99% | 500–1500ms | ممتاز لكن أبطأ وأغلى |
البروكسي السكني يوفر أفضل توازن بين معدل النجاح والسرعة والتكلفة لتتبع ترتيب أمازون. تحقق من أسعار ProxyHat والمواقع المتاحة لاختيار الخطة المناسبة.
مثال عملي بلغة بايثون: تتبع ترتيب ASIN
الآن ندمج كل ما سبق في سكربت كامل يستخدم ProxyHat لجلب صفحات البحث، تحليلها، والعثور على موقع ASIN المستهدف. نستخدم مكتبة curl_cffi التي تحاكي بصمة TLS للمتصفح، مما يقلل من فرص الحجب.
الخطوة 1: جلب صفحة البحث
from curl_cffi import requests
import urllib.parse
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
PROXYHAT_GATEWAY = "gate.proxyhat.com"
PROXYHAT_PORT = 8080
PROXYHAT_USER = "your_username"
PROXYHAT_PASS = "your_password"
def build_proxy(country="US", session_id=None):
username = f"{PROXYHAT_USER}-country-{country}"
if session_id:
username += f"-session-{session_id}"
return f"http://{username}:{PROXYHAT_PASS}@{PROXYHAT_GATEWAY}:{PROXYHAT_PORT}"
def fetch_amazon_page(keyword, page=1, country="US", session_id=None):
domain = {
"US": "com", "DE": "de", "GB": "co.uk",
"FR": "fr", "IT": "it", "ES": "es", "JP": "co.jp"
}.get(country, "com")
encoded_kw = urllib.parse.quote_plus(keyword)
url = f"https://www.amazon.{domain}/s?k={encoded_kw}&page={page}"
proxy = build_proxy(country, session_id)
headers = {
"Accept-Language": "en-US,en;q=0.9" if country == "US" else "de-DE,de;q=0.9",
"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,application/xml;q=0.9,*/*;q=0.8",
}
resp = requests.get(
url,
proxies={"http": proxy, "https": proxy},
headers=headers,
impersonate="chrome120",
timeout=30
)
resp.raise_for_status()
return resp.text
الخطوة 2: تحليل النتائج والعثور على ASIN
from bs4 import BeautifulSoup
def parse_and_find_asin(html, target_asin):
soup = BeautifulSoup(html, "html.parser")
organic_pos = 0
found_position = None
total_results = 0
for div in soup.select('[data-component-type="s-search-result"]'):
asin = div.get("data-asin", "")
if not asin:
continue
total_results += 1
sponsored_el = div.select_one(
'[aria-label*="Sponsored"], .s-label-popover-default'
)
is_sponsored = sponsored_el is not None
if not is_sponsored:
organic_pos += 1
if asin == target_asin:
found_position = organic_pos
return {
"target_asin": target_asin,
"position": found_position,
"total_results_on_page": total_results,
"indexed": found_position is not None
}
الخطوة 3: تتبع الترتيب عبر صفحات متعددة
import sqlite3
from datetime import datetime, timezone
def init_db(db_path="rank_tracker.db"):
conn = sqlite3.connect(db_path)
conn.execute("""
CREATE TABLE IF NOT EXISTS rank_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
keyword TEXT NOT NULL,
asin TEXT NOT NULL,
marketplace TEXT NOT NULL,
position INTEGER,
page_found INTEGER,
indexed INTEGER,
timestamp TEXT NOT NULL
)
""")
conn.execute("""
CREATE INDEX IF NOT EXISTS idx_kw_asin_market
ON rank_history(keyword, asin, marketplace)
""")
conn.commit()
conn.close()
def store_result(keyword, asin, marketplace, position, page_found, db_path="rank_tracker.db"):
conn = sqlite3.connect(db_path)
conn.execute(
"""INSERT INTO rank_history
(keyword, asin, marketplace, position, page_found, indexed, timestamp)
VALUES (?, ?, ?, ?, ?, ?, ?)""",
(keyword, asin, marketplace, position, page_found,
1 if position is not None else 0,
datetime.now(timezone.utc).isoformat())
)
conn.commit()
conn.close()
def track_keyword(keyword, target_asin, country="US", max_pages=5):
session_id = f"kw-{keyword[:10]}-{country}"
position = None
page_found = None
for page in range(1, max_pages + 1):
logger.info(f"Fetching page {page} for '{keyword}' on amazon.{country}")
html = fetch_amazon_page(keyword, page, country, session_id)
if "captcha" in html.lower() or "Robot Check" in html:
logger.warning(f"CAPTCHA detected on page {page}")
break
result = parse_and_find_asin(html, target_asin)
if result["position"] is not None:
position = result["position"] + ((page - 1) * 60)
page_found = page
logger.info(f"Found ASIN {target_asin} at position {position} (page {page})")
break
if result["total_results_on_page"] == 0:
logger.info(f"No more results on page {page}, stopping")
break
store_result(keyword, target_asin, country, position, page_found)
return {"keyword": keyword, "asin": target_asin, "position": position, "page_found": page_found}
الخطوة 4: استخدام Playwright للصفحات الديناميكية
بعض صفحات أمازون تستخدم JavaScript لتحميل النتائج ديناميكيًا. في هذه الحالات، استخدم Playwright مع بروكسي ProxyHat:
from playwright.sync_api import sync_playwright
def fetch_with_playwright(keyword, page_num=1, country="US"):
proxy_auth = build_proxy(country, f"pw-{keyword[:8]}")
domain = "com" if country == "US" else "de"
url = f"https://www.amazon.{domain}/s?k={keyword}&page={page_num}"
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={"server": proxy_auth},
headless=True
)
context = browser.new_context(
locale="en-US" if country == "US" else "de-DE",
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
pg = context.new_page()
pg.goto(url, wait_until="domcontentloaded", timeout=30000)
pg.wait_for_selector('[data-component-type="s-search-result"]', timeout=10000)
html = pg.content()
browser.close()
return html
نصائح الإنتاج: الجدولة وإعادة المحاولة واكتشاف الكابتشا
عند تشغيل نظام تتبع في الإنتاج، ستحتاج إلى معالجة العديد من الحالات الحدية. إليك أفضل الممارسات:
إعادة المحاولة مع تراجع أسي
import time
def fetch_with_retry(keyword, page, country, session_id, max_retries=3):
for attempt in range(max_retries):
try:
html = fetch_amazon_page(keyword, page, country, session_id)
# كشف CAPTCHA
lower_html = html.lower()
if "captcha" in lower_html or "robot check" in lower_html:
logger.warning(f"CAPTCHA on attempt {attempt + 1}")
# تغيير معرف الجلسة للحصول على IP جديد
new_session = f"{session_id}-retry{attempt}"
html = fetch_amazon_page(keyword, page, country, new_session)
if "captcha" in html.lower():
raise Exception("CAPTCHA persists after IP rotation")
return html
except Exception as e:
wait_time = 2 ** attempt + 1 # 2s, 3s, 5s
logger.warning(f"Attempt {attempt + 1} failed: {e}. Waiting {wait_time}s...")
if attempt < max_retries - 1:
time.sleep(wait_time)
raise Exception(f"Failed after {max_retries} retries for '{keyword}' page {page}")
الجدولة اليومية
import schedule
import threading
def run_daily_tracking(keywords, asin, country="US"):
init_db()
for kw in keywords:
try:
result = track_keyword(kw, asin, country, max_pages=5)
logger.info(f"Tracked: {result}")
time.sleep(5) # فاصل زمني بين الكلمات المفتاحية
except Exception as e:
logger.error(f"Failed to track '{kw}': {e}")
# جدولة يومية في الساعة 6 صباحًا
schedule.every().day.at("06:00").do(
run_daily_tracking,
keywords=["wireless earbuds", "bluetooth headphones", "noise cancelling"],
asin="B0XXXXXXXX",
country="US"
)
while True:
schedule.run_pending()
time.sleep(60)
فحص الفهرسة (Indexation Check)
أحد أهم الفحوصات هو التأكد من أن ASIN يظهر إطلاقًا في نتائج البحث لكلمة مفتاحية معينة. إذا كان position = None بعد فحص 5 صفحات، فهذا يعني أن المنتج غير مفهرس لهذه الكلمة المفتاحية — مشكلة خطيرة تتطلب مراجعة العنوان، الكلمات الخلفية (backend keywords)، وفئة المنتج.
def check_indexation(keyword, asin, country="US", max_pages=5):
result = track_keyword(keyword, asin, country, max_pages)
if result["position"] is None:
logger.warning(
f"ASIN {asin} NOT indexed for '{keyword}' on amazon.{country} "
f"after checking {max_pages} pages"
)
return {"indexed": False, "keyword": keyword, "asin": asin}
return {"indexed": True, "position": result["position"], "keyword": keyword}
الاعتبارات الأخلاقية وSP-API
تتبع ترتيب أمازون يتطلب التزامًا بأفضل الممارسات الأخلاقية:
- تتبع منتجاتك ومنتجات عامة فقط: لا تتجسس على منافسين بطريقة تنتهك شروط خدمة أمازون.
- ضبط معدل الطلبات: حافظ على فاصل زمني لا يقل عن 3–5 ثوانٍ بين الطلبات لتجنب إرهاق خوادم أمازون.
- احترام robots.txt: تحقق من robots.txt لأمازون قبل البدء.
- استخدم SP-API حيثما أمكن: واجهة Amazon SP-API توفر بيانات رسمية وشرعية للبائعين المسجلين، بما في ذلك تقارير الكلمات المفتاحية. إذا كنت بائعًا مسجلاً، ابدأ بـ SP-API قبل اللجوء إلى الكشط.
لمزيد من المعلومات حول حالات استخدام الكشط، راجع دليل استخدامات الكشط وتتبع نتائج البحث على ProxyHat. للتوثيق الفني الكامل، راجع وثائق ProxyHat.
النقاط الرئيسية
- أمازون SERP مستقل: ترتيب أمازون يعتمد على سرعة المبيعات والملاءمة، وليس سلطة النطاق — لذا التتبع المنتظم ضروري.
- تحليل HTML مباشر: استخدم
[data-component-type="s-search-result"]وdata-asinلتحليل النتائج، وافصل الإعلانات الممولة عن النتائج العضوية.- بروكسي سكني ضروري: استخدم
gate.proxyhat.com:8080مع علم-country-USأو-country-DEللاستهداف الجغرافي، و-session-لتصفح ثابت عبر الصفحات.- curl_cffi يقلل الحجب: محاكاة بصمة TLS للمتصفح تقلل من فرص اكتشاف البوت بنسبة تصل إلى 50%.
- فحص الفهرسة أولاً: قبل تحسين ترتيبك، تأكد من أن ASIN مفهرس للكلمة المفتاحية المستهدفة.
- SP-API أولاً: إذا كنت بائعًا مسجلاً، استخدم واجهة SP-API الرسمية قبل اللجوء إلى الكشط.
الأسئلة الشائعة
ما هو تتبع ترتيب الكلمات المفتاحية في أمازون بالبروكسي؟
هو عملية مراقبة الموقع العضوي لمنتج (ASIN) في نتائج بحث أمازون لكلمة مفتاحية معينة، باستخدام بروكسي سكني لتجاوز قيود الموقع الجغرافي ونظام مكافحة البوت. يتيح هذا للبائعين معرفة ما إذا كان ترتيبهم يتحسن أم يتراجع عبر الوقت، وفي أسواق مختلفة، مما يساعد على تحسين استراتيجية SEO على أمازون.
لماذا يعتبر تتبع ترتيب أمازون بالبروكسي مهمًا لمستخدمي البروكسي؟
أمازون يوطن نتائج البحث حسب الموقع الجغرافي ويطبق نظام مكافحة بوت صارم. بدون بروكسي سكني مع استهداف جغرافي، لا يمكنك رؤية نفس النتائج التي يراها العميل في سوق معين، وسيتم حظرك بعد 50–100 طلب من نفس IP. البروكسي السكني يحل كلا المشكلتين: يوفر عنوان IP محليًا ويتجنب الحجب.
أي نوع من البروكسي يعمل بشكل أفضل لتتبع ترتيب أمازون؟
البروكسي السكني (residential proxy) هو الأفضل لتتبع أمازون، بمعدل نجاح 90–99% وزمن استجابة 200–800ms. البروكسي السكني يستخدم عناوين IP من مزودي خدمة إنترنت حقيقيين، مما يجعله يبدو كمستخدم عادي. البروكسي مركز البيانات يُكتشف بسرعة (معدل نجاح 30–60% فقط)، والبروكسي الجوال ممتاز لكنه أبطأ وأغلى.
كيف تتجنب الحجب عند تنفيذ تتبع ترتيب أمازون بالبروكسي؟
استخدم عدة استراتيجيات معًا: (1) بروكسي سكني مع تدوير IP لكل كلمة مفتاحية باستخدام معرف جلسة فريد، (2) مكتبة مثل curl_cffi تحاكي بصمة TLS للمتصفح، (3) فاصل زمني 3–5 ثوانٍ بين الطلبات، (4) كشف CAPTCHA والتبديل إلى IP جديد فورًا، و (5) إعادة المحاولة مع تراجع أسي. تجنب إرسال أكثر من 100 طلب من نفس IP في الساعة.






