Wichtiger rechtlicher Hinweis: Dieser Artikel behandelt ausschließlich das Tracking öffentlicher Suchdaten auf Amazon. Im US-Bereich kann unbefugter Zugriff auf Computersysteme nach dem Computer Fraud and Abuse Act (CFAA) strafbar sein. In der EU ist die DSGVO (GDPR) zu beachten, insbesondere bei personenbezogenen Daten. Scrapen Sie nur Ihre eigenen Listings oder öffentlich verfügbare Daten, respektieren Sie die Nutzungsbedingungen von Amazon und erwägen Sie die offizielle Amazon SP-API, wo verfügbar.
Warum Amazon Keyword Rank Tracking mit Proxies notwendig ist
Amazon ist nicht Google. Die Amazon-SERP wird von einem eigenen Algorithmus gesteuert, der primär auf Relevanz und Verkaufsgeschwindigkeit (Sales Velocity) basiert. Für Verkäufer und Marketplace-SEO-Entwickler bedeutet das: Sie müssen die organische Position eines ASIN pro Keyword, Marketplace und Datum verfolgen, um Ranking-Veränderungen zu verstehen. Ein amazon keyword rank tracker ist daher ein zentrales Werkzeug für die Listing-Optimierung.
Im Gegensatz zu Google-SERPs liefert Amazon pro Seite etwa 16 organische Ergebnisse sowie mehrere Sponsored-Placements. Die Position eines Produkts kann je nach Marketplace (.com, .de, .co.uk) und sogar nach Postleitzahl variieren, da Amazon Ergebnisse lokalisiert. Ohne Proxies mit Geo-Targeting sind verlässliche Rankings pro Marketplace kaum zu erfassen.
Technischer Kontext: Warum Amazon-Suchen anders funktionieren
Der Amazon-Suchalgorithmus (historisch als A9 bezeichnet) gewichtet Faktoren wie Conversion-Rate, Verfügbarkeit, Preis und Keyword-Relevanz. Das bedeutet:
- Rankings schwanken häufig – oft innerhalb von Stunden, basierend auf Lagerbestand und Verkaufsgeschwindigkeit.
- Marketplace-spezifische Ergebnisse – amazon.com liefert andere Ergebnisse als amazon.de, selbst bei identischem Keyword.
- Sponsored vs. Organic – Amazon zeigt bezahlte Placements zwischen organischen Ergebnissen, die visuell ähnlich aussehen. Diese müssen getrennt erfasst werden.
Deshalb ist amazon serp scraping eine eigene Disziplin: Sie benötigen präzise HTML-Parsing-Logik, Geo-Targeting pro Marketplace und eine zuverlässige Proxy-Infrastruktur, um Blockierungen zu vermeiden.
Die Amazon-SERP parsen: Datenstrukturen und Selektoren
Die Amazon-Suchergebnisseite nutzt das Attribut data-component-type="s-search-result" für jeden Ergebnis-Container. Jeder Container trägt ein data-asin-Attribut mit der ASIN des Produkts. Sponsored-Placements sind an einem Sponsored-Label erkennbar.
Strategie zum Parsen
- Iteriere über alle
[data-component-type="s-search-result"]-Elemente. - Lese
data-asinaus dem Container. - Prüfe, ob der Container ein „Sponsored"-Label enthält.
- Zähle nur nicht-gesponserte Ergebnisse für die organische Position.
- Speichere Position, ASIN, Keyword, Marketplace und Zeitstempel.
Diese Logik muss robust gegen HTML-Änderungen sein. Amazon passt sein Markup regelmäßig an, daher sollten Sie Selektoren versionieren und bei Strukturänderungen warnen.
Warum Residential Proxies mit Geo-Targeting unverzichtbar sind
Amazon setzt Anti-Bot-Maßnahmen ein, die Datacenter-IPs oft blockieren. Residential Proxies verwenden IPs echter Haushalte und sind deutlich schwerer zu erkennen. Für track amazon rankings python benötigen Sie zusätzlich:
- Country-Geo-Targeting –
-country-USfür amazon.com,-country-DEfür amazon.de. - Sticky Sessions –
-session-abc123für stabile Pagination über mehrere Seiten hinweg. - City-Targeting – für lokale Ranking-Unterschiede, z.B.
-country-DE-city-berlin.
Mit ProxyHat steuern Sie Geo-Targeting und Sessions über den Benutzernamen. Der Gateway bleibt stets gate.proxyhat.com:8080 (HTTP) bzw. :1080 (SOCKS5).
Proxy-Typen im Vergleich
| Proxy-Typ | Erfolgsrate bei Amazon | Geo-Targeting | Empfohlen für |
|---|---|---|---|
| Residential | Hoch (90%+) | Land/Stadt | Rank-Tracking, SERP-Scraping |
| Mobile | Sehr hoch | Land | Mobile-spezifische Rankings |
| Datacenter | Niedrig (oft blockiert) | Begrenzt | Nicht empfohlen für Amazon |
Praktische Implementierung: Amazon-Rankings mit Python tracken
Die folgenden Beispiele zeigen, wie Sie Amazon-Suchergebnisse mit ProxyHat abrufen und parsen. Alle Beispiele verwenden gate.proxyhat.com:8080 als Gateway.
Beispiel 1: Basis-Setup mit curl
# Amazon-Suchergebnisse für ein Keyword abrufen
# US-Marketplace mit Sticky Session für Pagination
curl -x "http://user-country-US-session-rank001:pass@gate.proxyhat.com:8080" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-H "Accept-Language: en-US,en;q=0.9" \
"https://www.amazon.com/s?k=bluetooth+speaker&page=1" \
-o amazon_page_1.html
Beispiel 2: Python mit curl_cffi und ProxyHat
import asyncio
from curl_cffi.requests import AsyncSession
from bs4 import BeautifulSoup
from datetime import datetime, timezone
import json
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)
PROXY_URL = "http://user-country-US-session-{sid}:pass@gate.proxyhat.com:8080"
AMAZON_BASE = "https://www.amazon.com"
async def fetch_search_page(
session: AsyncSession,
keyword: str,
page: int,
session_id: str,
) -> str:
"""Fetch a single Amazon search results page through ProxyHat."""
proxy = PROXY_URL.format(sid=session_id)
url = f"{AMAZON_BASE}/s?k={keyword.replace(' ', '+')}&page={page}"
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-Language": "en-US,en;q=0.9",
}
try:
resp = await session.get(url, headers=headers, proxies=proxy, timeout=30)
if resp.status_code == 200:
logger.info(f"Fetched page {page} for '{keyword}' (status {resp.status_code})")
return resp.text
else:
logger.warning(f"Unexpected status {resp.status_code} on page {page}")
return ""
except Exception as e:
logger.error(f"Error fetching page {page}: {e}")
return ""
def parse_amazon_results(html: str) -> list[dict]:
"""Parse Amazon search results, separating organic from sponsored."""
soup = BeautifulSoup(html, "html.parser")
results = []
organic_position = 0
for div in soup.select('[data-component-type="s-search-result"]'):
asin = div.get("data-asin", "")
if not asin:
continue
is_sponsored = bool(div.select_one('span:contains("Sponsored")'))
if not is_sponsored:
organic_position += 1
title_el = div.select_one("h2 a span")
title = title_el.get_text(strip=True) if title_el else ""
results.append({
"asin": asin,
"title": title,
"organic_position": organic_position if not is_sponsored else None,
"is_sponsored": is_sponsored,
})
return results
async def track_keyword_ranking(
keyword: str,
target_asin: str,
max_pages: int = 5,
) -> dict:
"""Track the organic position of a target ASIN across multiple pages."""
session_id = f"track-{keyword.replace(' ', '-')}-{int(datetime.now().timestamp())}"
found_position = None
async with AsyncSession(impersonate="chrome120") as s:
for page in range(1, max_pages + 1):
html = await fetch_search_page(s, keyword, page, session_id)
if not html:
continue
results = parse_amazon_results(html)
for r in results:
if r["asin"] == target_asin and not r["is_sponsored"]:
found_position = r["organic_position"]
break
if found_position:
break
await asyncio.sleep(2) # Rate limiting between pages
record = {
"keyword": keyword,
"asin": target_asin,
"marketplace": "amazon.com",
"organic_position": found_position,
"timestamp": datetime.now(timezone.utc).isoformat(),
}
logger.info(f"Result: {json.dumps(record)}")
return record
# Ausführung
if __name__ == "__main__":
result = asyncio.run(track_keyword_ranking("bluetooth speaker", "B07DD2WRMK"))
print(json.dumps(result, indent=2))
Beispiel 3: Playwright mit ProxyHat für JavaScript-Rendering
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup
import asyncio
import logging
logger = logging.getLogger(__name__)
async def scrape_amazon_playwright(keyword: str, target_asin: str, country: str = "US"):
"""Scrape Amazon with Playwright and ProxyHat residential proxies."""
proxy_user = f"user-country-{country}-session-pw-{keyword.replace(' ', '-')}"
proxy_pass = "pass"
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=True,
proxy={
"server": "http://gate.proxyhat.com:8080",
"username": proxy_user,
"password": proxy_pass,
},
)
context = await browser.new_context(
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"
),
locale="en-US",
)
page = await context.new_page()
url = f"https://www.amazon.com/s?k={keyword.replace(' ', '+')}"
try:
await page.goto(url, wait_until="domcontentloaded", timeout=30000)
await page.wait_for_selector('[data-component-type="s-search-result"]', timeout=10000)
except Exception as e:
logger.error(f"Navigation error: {e}")
await browser.close()
return None
html = await page.content()
await browser.close()
soup = BeautifulSoup(html, "html.parser")
organic_pos = 0
for div in soup.select('[data-component-type="s-search-result"]'):
asin = div.get("data-asin", "")
is_sponsored = bool(div.select_one("span:contains('Sponsored')"))
if not is_sponsored:
organic_pos += 1
if asin == target_asin:
return {"asin": asin, "keyword": keyword, "organic_position": organic_pos}
return {"asin": target_asin, "keyword": keyword, "organic_position": None}
# Ausführung
if __name__ == "__main__":
result = asyncio.run(scrape_amazon_playwright("wireless earbuds", "B0CHX1W1XY"))
print(result)
Beispiel 4: Multi-Marketplace-Tracking mit Node.js
const axios = require('axios');
const cheerio = require('cheerio');
const PROXY_TEMPLATE = "http://user-country-{country}-session-{sid}:pass@gate.proxyhat.com:8080";
const MARKETPLACES = {
"US": "https://www.amazon.com",
"DE": "https://www.amazon.de",
"UK": "https://www.amazon.co.uk",
};
async function fetchAmazonRanking(keyword, asin, country) {
const base = MARKETPLACES[country];
if (!base) throw new Error(`Unknown country: ${country}`);
const proxy = PROXY_TEMPLATE
.replace("{country}", country)
.replace("{sid}", `rank-${Date.now()}`);
const url = `${base}/s?k=${encodeURIComponent(keyword)}&page=1`;
const headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Language": country === "DE" ? "de-DE,de;q=0.9" : "en-US,en;q=0.9",
};
try {
const resp = await axios.get(url, {
proxy: { host: "gate.proxyhat.com", port: 8080, protocol: "http" },
proxyAuth: { username: `user-country-${country}-session-${Date.now()}`, password: "pass" },
headers,
timeout: 30000,
});
const $ = cheerio.load(resp.data);
let organicPos = 0;
let found = null;
$('[data-component-type="s-search-result"]').each((_, el) => {
const dataAsin = $(el).attr("data-asin");
const sponsored = $(el).find("span:contains('Sponsored')").length > 0;
if (!sponsored) {
organicPos++;
if (dataAsin === asin) {
found = { asin, keyword, country, organicPosition: organicPos };
}
}
});
return found || { asin, keyword, country, organicPosition: null };
} catch (err) {
console.error(`Error for ${country}:`, err.message);
return { asin, keyword, country, error: err.message };
}
}
module.exports = { fetchAmazonRanking };
Beispiel 5: Produktionsskript mit Retries, Backoff und CAPTCHA-Erkennung
import asyncio
import logging
import json
from datetime import datetime, timezone
from curl_cffi.requests import AsyncSession
from bs4 import BeautifulSoup
logger = logging.getLogger("amazon_tracker")
logging.basicConfig(level=logging.INFO)
PROXY_URL = "http://user-country-{country}-session-{sid}:pass@gate.proxyhat.com:8080"
MARKETPLACES = {
"US": "https://www.amazon.com",
"DE": "https://www.amazon.de",
"UK": "https://www.amazon.co.uk",
}
class AmazonRankTracker:
def __init__(self, max_retries: int = 3, base_delay: float = 2.0):
self.max_retries = max_retries
self.base_delay = base_delay
def _detect_captcha(self, html: str) -> bool:
"""Detect CAPTCHA or bot-challenge pages."""
captcha_markers = [
"Type the characters you see in this image",
"api-services-support@amazon.com",
"To discuss automated access",
"captcha",
]
html_lower = html.lower()
return any(marker.lower() in html_lower for marker in captcha_markers)
async def fetch_with_retry(
self,
session: AsyncSession,
url: str,
country: str,
session_id: str,
) -> str | None:
"""Fetch with exponential backoff and CAPTCHA detection."""
proxy = PROXY_URL.format(country=country, sid=session_id)
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-Language": "en-US,en;q=0.9" if country == "US" else "de-DE,de;q=0.9",
}
for attempt in range(1, self.max_retries + 1):
try:
resp = await session.get(url, headers=headers, proxies=proxy, timeout=30)
if resp.status_code == 200:
if self._detect_captcha(resp.text):
logger.warning(f"CAPTCHA detected on attempt {attempt}, rotating session")
session_id = f"retry-{attempt}-{datetime.now().timestamp()}"
await asyncio.sleep(self.base_delay * attempt * 2)
continue
return resp.text
elif resp.status_code == 503:
logger.warning(f"503 on attempt {attempt}, backing off")
await asyncio.sleep(self.base_delay * attempt)
else:
logger.warning(f"Status {resp.status_code} on attempt {attempt}")
await asyncio.sleep(self.base_delay * attempt)
except Exception as e:
logger.error(f"Request failed attempt {attempt}: {e}")
await asyncio.sleep(self.base_delay * attempt)
return None
async def track(
self,
keyword: str,
target_asin: str,
country: str = "US",
max_pages: int = 5,
) -> dict:
base = MARKETPLACES.get(country, MARKETPLACES["US"])
sid = f"track-{country}-{keyword.replace(' ', '-')}-{int(datetime.now().timestamp())}"
found_position = None
is_indexed = False
async with AsyncSession(impersonate="chrome120") as s:
for page in range(1, max_pages + 1):
url = f"{base}/s?k={keyword.replace(' ', '+')}&page={page}"
html = await self.fetch_with_retry(s, url, country, sid)
if not html:
logger.warning(f"No HTML for page {page}, skipping")
continue
soup = BeautifulSoup(html, "html.parser")
results = soup.select('[data-component-type="s-search-result"]')
organic_pos = 0
for div in results:
asin = div.get("data-asin", "")
sponsored = bool(div.select_one("span:contains('Sponsored')"))
if not sponsored:
organic_pos += 1
if asin == target_asin:
found_position = organic_pos
is_indexed = True
break
if found_position:
break
await asyncio.sleep(2)
record = {
"keyword": keyword,
"asin": target_asin,
"country": country,
"marketplace": base,
"organic_position": found_position,
"is_indexed": is_indexed,
"pages_scraped": page,
"timestamp": datetime.now(timezone.utc).isoformat(),
}
logger.info(f"Tracking result: {json.dumps(record)}")
return record
# Ausführung
if __name__ == "__main__":
tracker = AmazonRankTracker(max_retries=3, base_delay=2.0)
result = asyncio.run(tracker.track("bluetooth speaker", "B07DD2WRMK", "US", max_pages=5))
print(json.dumps(result, indent=2))
Produktionstipps: Skalierung und Zuverlässigkeit
Tägliche Planung
Rankings schwanken täglich. Ein Cron-Job oder Scheduler (z.B. APScheduler, Celery) sollte das Tracking einmal pro Tag pro Keyword/ASIN/Marketplace-Kombination ausführen. Bei 500 Keywords und 3 Marketplaces sind das 1.500 Anfragen pro Tag – mit einer Rate von 1 Anfrage alle 3 Sekunden dauert das etwa 75 Minuten.
Retries mit Backoff
Verwenden Sie exponentielles Backoff (Basis 2 Sekunden, Faktor 2x pro Versuch). Rotieren Sie die Session-ID bei jedem Retry, um eine neue IP zu erhalten. Brechen Sie nach maximal 3 Versuchen ab und markieren Sie das Ergebnis als fehlerhaft.
CAPTCHA-Erkennung
Amazon zeigt CAPTCHAs bei verdächtigem Traffic. Erkennungsmarker sind Zeichenfolgen wie „api-services-support@amazon.com" oder „Type the characters you see in this image". Wenn Sie ein CAPTCHA erkennen, pausieren Sie 60 Sekunden, rotieren die Session und versuchen es erneut. Bei wiederholten CAPTCHAs reduzieren Sie die Anfragerate.
Indexations-Prüfung
Nicht jedes ASIN rankt für jedes Keyword. Wenn ein ASIN auf den ersten 5 Seiten (etwa 80 organische Ergebnisse) nicht gefunden wird, markieren Sie es als not_ranking. Das unterscheidet sich von einem Scraping-Fehler – das ASIN könnte einfach nicht für dieses Keyword indexiert sein.
Ethische Richtlinien
- Tracken Sie eigene und öffentliche Listings – scrapen Sie keine Daten, die Sie nicht legitim benötigen.
- Drosseln Sie Anfragen – mindestens 2-3 Sekunden zwischen Seiten, um die Amazon-Infrastruktur nicht zu überlasten.
- Erwägen Sie die Amazon SP-API – für Verkäufer mit API-Zugang bietet die Amazon SP-API legitime Wege, um Produktdaten abzurufen. Für organische Keyword-Rankings gibt es jedoch keinen offiziellen Endpunkt, weshalb Scraping oft die einzige Option bleibt.
- Respektieren Sie robots.txt – prüfen Sie
https://www.amazon.com/robots.txtregelmäßig auf Änderungen.
Weitere Informationen zu ProxyHat-Standorten und -Preisen finden Sie auf der Preisseite und der Standortseite. Für allgemeines Web-Scraping siehe auch Web-Scraping-Anwendungsfälle und SERP-Tracking. Detaillierte API-Dokumentation finden Sie unter docs.proxyhat.com.
Key Takeaways
Zusammenfassung der wichtigsten Punkte:
- Amazon-SERPs werden durch Relevanz und Sales Velocity bestimmt – Rankings müssen pro Keyword, ASIN und Marketplace getrackt werden.
- Parse
[data-component-type="s-search-result"]unddata-asin, trenne Sponsored von organischen Ergebnissen.- Residential Proxies mit Country-Geo-Targeting (
-country-US,-country-DE) und Sticky Sessions (-session-id) sind für zuverlässiges Tracking unerlässlich.- Produktions-Setup: tägliche Scheduling, exponentielles Backoff, CAPTCHA-Erkennung und Indexations-Prüfung.
- Ethisch handeln: eigene/öffentliche Listings tracken, drosseln, SP-API erwägen.
Häufige Fragen (FAQ)
Was ist Amazon Keyword Rank Tracking mit Proxies?
Amazon Keyword Rank Tracking mit Proxies ist das systematische Erfassen der organischen Suchposition eines ASIN für bestimmte Keywords auf Amazon-Marketplaces unter Verwendung von Residential Proxies. Die Proxies sorgen für Geo-Targeting pro Land und verhindern IP-Blockierungen, sodass Verkäufer verlässliche Ranking-Daten über Zeit hinweg sammeln können.
Warum ist Amazon Keyword Rank Tracking mit Proxies wichtig für Proxy-Nutzer?
Ohne Proxies liefert Amazon je nach IP-Standort unterschiedliche Ergebnisse und blockiert Datacenter-IPs häufig. Residential Proxies mit Geo-Targeting ermöglichen es, Rankings pro Marketplace (amazon.com, amazon.de) realistisch zu tracken. Sticky Sessions sorgen dafür, dass Pagination über mehrere Seiten hinweg von derselben IP erfolgt, was konsistente Ergebnisse garantiert.
Welcher Proxy-Typ eignet sich am besten für Amazon Keyword Rank Tracking mit Proxies?
Residential Proxies sind die beste Wahl für Amazon Keyword Rank Tracking. Sie verwenden IPs echter Haushalte und werden von Amazons Anti-Bot-Systemen seltener blockiert als Datacenter-IPs. Mobile Proxies sind ebenfalls geeignet, insbesondere für mobile-spezifische Rankings. Datacenter-Proxies werden für Amazon nicht empfohlen, da sie oft sofort erkannt und blockiert werden.
Wie vermeidet man Blockierungen beim Amazon Keyword Rank Tracking mit Proxies?
Verwenden Sie Residential Proxies mit Geo-Targeting und rotierenden Sessions, drosseln Sie Anfragen auf mindestens 2-3 Sekunden zwischen Seiten, implementieren Sie CAPTCHA-Erkennung mit automatischem Backoff, nutzen Sie realistische User-Agent-Header und führen Sie exponentielles Backoff bei Fehlern durch. Bei wiederholten CAPTCHAs sollten Sie die Rate reduzieren und die Session-ID rotieren, um eine neue IP zu erhalten.




