Правовая заметка. Данная статья описывает сбор публично доступных поисковых данных Amazon. В США доступ к публичным веб-страницам регулируется CFAA, а в ЕС обработка персональных данных подпадает под GDPR. Соблюдайте Условия использования Amazon, отслеживайте собственные и публичные списки, не превышайте разумную частоту запросов. При наличии доступа используйте Amazon SP-API вместо скрапинга.
Трекер позиций ключевых слов Amazon — это инструмент, который автоматически определяет, на какой позиции в результатах поиска Amazon находится ваш ASIN по конкретному запросу. Продавцы и SEO-разработчики используют такие трекеры для мониторинга изменений ранжирования, оценки эффективности оптимизации листинга и анализа конкурентов. В этом руководстве мы покажем, как построить надёжный трекер на Python с использованием резидентных прокси.
Зачем нужен трекер позиций ключевых слов Amazon
Поисковая выдача Amazon — это отдельная экосистема, отличная от Google. Ранжирование на Amazon определяется релевантностью запроса и скоростью продаж (sales velocity), а не количеством обратных ссылок. Алгоритм A9 учитывает конверсию, наличие товара на складе, цену, отзывы и соответствие поисковому запросу в названии и описании.
Для продавцов это означает: позиция по ключевому слову напрямую влияет на видимость и продажи. Смещение с 1-й позиции на 10-ю может снизить трафик на 50% и более. Поэтому систематическое отслеживание позиций — не прихоть, а необходимость для:
- Мониторинга эффективности SEO-оптимизации листинга
- Отслеживания влияния рекламных кампаний PPC на органический рейтинг
- Анализа конкурентов — кто поднялся, кто опустился
- Выявления ключевых слов, по которым ASIN вообще не ранжируется
В отличие от Google SERP, Amazon выдача локализована по маркетплейсу: amazon.com, amazon.de, amazon.co.jp — это разные индексы с разными результатами. Один и тот же ASIN может занимать разные позиции на разных маркетплейсах. Это требует гео-таргетированных прокси для каждого рынка.
Парсинг страницы результатов поиска Amazon
Страница поиска Amazon (например, https://www.amazon.com/s?k=wireless+earbuds) содержит список товаров в виде HTML-элементов с атрибутом data-component-type="s-search-result". Каждый такой элемент представляет одну карточку товара и имеет атрибут data-asin с идентификатором ASIN.
Ключевые шаги парсинга:
- Найти все элементы
[data-component-type="s-search-result"] - Извлечь
data-asinиз каждого элемента - Определить органическую позицию (порядковый номер среди всех результатов)
- Обнаружить спонсированные размещения по метке «Sponsored»
- Разделить платные и органические позиции
Спонсированные товары помечаются меткой «Sponsored» или «Sponsored Ad». В HTML это обычно элемент с классом .puis-label-popular или атрибутом aria-label, содержащим слово «Sponsored». Важно разделять органические и платные позиции, потому что продавцу нужна именно органическая видимость.
Базовый пример с curl
curl -x http://user-country-US: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=wireless+earbuds&page=1"Почему для Amazon нужны резидентные прокси
Amazon применяет агрессивные анти-бот меры: CAPTCHA, блокировка по IP, проверка браузерных отпечатков и ограничение частоты запросов. Дата-центр прокси часто распознаются и блокируются, потому что их IP-диапазоны принадлежат облачным провайдерам (AWS, DigitalOcean, OVH). Резидентные прокси используют IP-адреса реальных домашних интернет-провайдеров, что делает запросы неотличимыми от обычных пользователей.
Дополнительная сложность — локализация по маркетплейсу. Amazon возвращает разные результаты в зависимости от страны IP-адреса. Для корректного отслеживания позиций на amazon.com нужен IP из США, для amazon.de — из Германии, и так далее.
| Тип прокси | Подходит для Amazon? | Скорость | Риск блокировки |
|---|---|---|---|
| Резидентные | Да — лучший выбор | 200ms–800ms | Низкий |
| Мобильные | Да — высокая надёжность | 300ms–1000ms | Очень низкий |
| Дата-центр | Нет — быстро блокируются | 50ms–200ms | Высокий |
ProxyHat предоставляет резидентные прокси с гео-таргетированием по странам и городам. Для Amazon US используйте флаг -country-US в имени пользователя, для Amazon Germany — -country-DE. Для стабильной пагинации (страницы 1–5) используйте sticky-сессии с флагом -session-, чтобы все запросы в рамках одного трекинга шли через один IP.
Подробнее о доступных локациях смотрите на странице локаций ProxyHat.
Практическая реализация на Python
Ниже приведены несколько подходов: от простого HTTP-клиента до браузерной автоматизации с Playwright. Все примеры используют ProxyHat gateway на gate.proxyhat.com:8080.
Подход 1: curl_cffi с имперсонацией браузера
Библиотека curl_cffi позволяет имитировать TLS-отпечаток реального браузера, что помогает обходить проверки Cloudflare и подобных систем. Установите: pip install curl_cffi beautifulsoup4.
from curl_cffi import requests
from urllib.parse import quote
PROXY = 'http://user-country-US:pass@gate.proxyhat.com:8080'
def fetch_amazon_search(keyword: str, page: int = 1) -> str:
url = f'https://www.amazon.com/s?k={quote(keyword)}&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 = requests.get(
url,
proxies={'http': PROXY, 'https': PROXY},
headers=headers,
impersonate='chrome',
timeout=30,
)
resp.raise_for_status()
return resp.text
except requests.RequestException as e:
print(f'[ERROR] Page {page}: {e}')
return ''
html = fetch_amazon_search('wireless earbuds', page=1)
print(f'Получено {len(html)} байт')Подход 2: Playwright с прокси
Для страниц с тяжёлым JavaScript можно использовать Playwright с прокси-сервером. Установите: pip install playwright && playwright install chromium.
from playwright.sync_api import sync_playwright
def fetch_with_playwright(keyword: str, page: int = 1) -> str:
url = f'https://www.amazon.com/s?k={keyword.replace(" ", "+")}&page={page}'
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy={
'server': 'http://gate.proxyhat.com:8080',
'username': 'user-country-US',
'password': 'pass',
},
)
context = browser.new_context(
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
locale='en-US',
)
pg = context.new_page()
try:
pg.goto(url, timeout=30000, wait_until='domcontentloaded')
pg.wait_for_selector('[data-component-type="s-search-result"]', timeout=10000)
html = pg.content()
except Exception as e:
print(f'[ERROR] Page {page}: {e}')
html = ''
finally:
browser.close()
return htmlПарсинг результатов: извлечение позиций ASIN
from bs4 import BeautifulSoup
from dataclasses import dataclass
@dataclass
class RankEntry:
asin: str
organic_position: int
page: int
is_sponsored: bool
def parse_search_results(html: str, page: int) -> list[RankEntry]:
soup = BeautifulSoup(html, 'html.parser')
results = soup.select('[data-component-type="s-search-result"]')
entries = []
for idx, item in enumerate(results, start=1):
asin = item.get('data-asin', '')
if not asin:
continue
sponsored_el = item.select_one('.puis-label-popular, [aria-label*="Sponsored"]')
is_sponsored = sponsored_el is not None
entries.append(RankEntry(
asin=asin,
organic_position=idx,
page=page,
is_sponsored=is_sponsored,
))
return entries
def find_asin_position(entries: list[RankEntry], target_asin: str) -> dict | None:
for entry in entries:
if entry.asin == target_asin:
return {
'asin': entry.asin,
'position': entry.organic_position,
'page': entry.page,
'sponsored': entry.is_sponsored,
}
return NoneПолный трекер: страницы 1–5 с историей позиций
import csv
import time
import random
from datetime import datetime
from pathlib import Path
def track_keyword(keyword: str, target_asin: str, max_pages: int = 5) -> dict:
all_entries = []
session_id = f'track-{keyword.replace(" ", "-")}-{int(time.time())}'
proxy = f'http://user-country-US-session-{session_id}:pass@gate.proxyhat.com:8080'
for page in range(1, max_pages + 1):
html = fetch_amazon_search(keyword, page=page)
if not html:
continue
# Проверка на CAPTCHA
if 'captcha' in html.lower() or 'robot' in html.lower():
print(f'[WARN] CAPTCHA обнаружена на странице {page}')
break
entries = parse_search_results(html, page=page)
all_entries.extend(entries)
# Задержка между страницами: 2-5 секунд
time.sleep(random.uniform(2.0, 5.0))
position = find_asin_position(all_entries, target_asin)
result = {
'keyword': keyword,
'asin': target_asin,
'timestamp': datetime.now().isoformat(),
'found': position is not None,
'position': position['position'] if position else None,
'page': position['page'] if position else None,
'sponsored': position['sponsored'] if position else None,
}
# Сохранение в CSV
csv_path = Path('rank_history.csv')
write_header = not csv_path.exists() or csv_path.stat().st_size == 0
with csv_path.open('a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
if write_header:
writer.writerow(['timestamp', 'keyword', 'asin', 'position', 'page', 'sponsored'])
writer.writerow([
result['timestamp'], result['keyword'], result['asin'],
result['position'], result['page'], result['sponsored']
])
return result
# Запуск
result = track_keyword('wireless earbuds', 'B0CX23ZQ8S', max_pages=5)
print(f'ASIN {result["asin"]}: позиция {result["position"]} на стр. {result["page"]}')Production-советы: планирование, ретраи, CAPTCHA
Ежедневное планирование
Для систематического отслеживания запускайте трекер ежедневно. Используйте cron на Linux или библиотеку schedule в Python:
import schedule
import time as time_module
import random
def run_daily_tracking():
keywords = ['wireless earbuds', 'bluetooth headphones', 'noise cancelling earbuds']
target_asin = 'B0CX23ZQ8S'
for kw in keywords:
track_keyword(kw, target_asin)
time_module.sleep(random.uniform(10, 30))
schedule.every().day.at('09:00').do(run_daily_tracking)
while True:
schedule.run_pending()
time_module.sleep(60)Ретраи с экспоненциальной задержкой
def fetch_with_retry(keyword: str, page: int, max_retries: int = 3) -> str:
for attempt in range(max_retries):
html = fetch_amazon_search(keyword, page=page)
if html and 'captcha' not in html.lower():
return html
backoff = 2 ** attempt + random.uniform(0, 1)
print(f'[RETRY] Попытка {attempt + 1}/{max_retries}, ожидание {backoff:.1f}s')
time.sleep(backoff)
return ''Обнаружение CAPTCHA
Amazon перенаправляет подозрительные запросы на страницу CAPTCHA. Признаки:
- URL содержит
/errors/validateCaptcha - HTML содержит
captchaилиrobot check - Отсутствие элементов
[data-component-type="s-search-result"]
При обнаружении CAPTCHA: остановите парсинг, смените IP-адрес (новая сессия прокси с другим -session- идентификатором), подождите 5–10 минут и повторите.
Проверка индексации
Если ASIN не найден ни на одной из страниц 1–5, проверьте, индексируется ли товар вообще. Прямой запрос https://www.amazon.com/dp/{ASIN} должен вернуть страницу товара. Если возвращается 404 или «Currently unavailable», товар не ранжируется и трекинг бессмысленен до устранения проблемы с листингом.
Этика и альтернативы
Соблюдайте баланс между сбором данных и уважением к инфраструктуре Amazon:
- Отслеживайте собственные ASIN и публичные списки конкурентов
- Ограничьте частоту: не более 1 запроса на 2–5 секунд на ключевое слово
- Используйте Amazon SP-API, если у вас есть доступ к Seller/Vendor Central — это официальный и надёжный способ получения данных
- Соблюдайте
robots.txtи Условия использования Amazon
Для масштабирования рассмотрите тарифы ProxyHat с поддержкой до 100 одновременных сессий. Подробнее о вариантах использования прокси — на страницах веб-скрапинга и SERP-трекинга. Полная документация доступна на docs.proxyhat.com.
Ключевые выводы
- Amazon SERP — отдельная экосистема с ранжированием по релевантности и скорости продаж, не по бэклинкам.
- Парсинг: итерируйте
[data-component-type="s-search-result"], читайтеdata-asin, разделяйте органику и спонсированные.- Резидентные прокси с гео-таргетированием обязательны — дата-центр IP блокируются Amazon.
- Sticky-сессии (
-session-) обеспечивают стабильную пагинацию без смены IP между страницами.- Всегда проверяйте CAPTCHA и индексацию ASIN перед анализом позиций.
- Приоритет — Amazon SP-API, скрапинг только при отсутствии API-доступа.






