Трекер позиций ключевых слов Amazon: руководство с прокси и Python

Полное руководство для разработчиков по отслеживанию органических позиций ASIN в поисковой выдаче Amazon с использованием резидентных прокси и Python. Включает парсинг SERP, обход блокировок и production-советы.

Amazon Keyword Rank Tracking with Proxies: A Developer's Guide
В этой статье

Правовая заметка. Данная статья описывает сбор публично доступных поисковых данных 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.

Ключевые шаги парсинга:

  1. Найти все элементы [data-component-type="s-search-result"]
  2. Извлечь data-asin из каждого элемента
  3. Определить органическую позицию (порядковый номер среди всех результатов)
  4. Обнаружить спонсированные размещения по метке «Sponsored»
  5. Разделить платные и органические позиции

Спонсированные товары помечаются меткой «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-доступа.

Часто задаваемые вопросы

Что такое отслеживание позиций ключевых слов Amazon с прокси?

Это автоматизированный процесс определения органической позиции конкретного ASIN в результатах поиска Amazon по заданному ключевому слову с использованием прокси-серверов. Прокси необходимы для гео-таргетирования — разные маркетплейсы возвращают разные результаты — и обхода анти-бот блокировок Amazon. Резидентные прокси делают запросы неотличимыми от обычных пользователей.

Зачем нужно отслеживание позиций ключевых слов Amazon с прокси?

Позиция товара в поисковой выдаче Amazon напрямую влияет на видимость и продажи. Смещение с первой страницы может снизить трафик на 50% и более. Прокси позволяют отслеживать позиции на разных маркетплейсах (amazon.com, amazon.de) с правильной локализацией, а также собирать данные без блокировок IP-адресов при регулярном ежедневном мониторинге.

Какой тип прокси лучше всего подходит для отслеживания позиций Amazon?

Резидентные прокси — оптимальный выбор для Amazon. Они используют IP-адреса реальных интернет-провайдеров, что делает запросы неотличимыми от обычных пользователей. Мобильные прокси также надёжны, но дороже. Дата-центр прокси быстро блокируются Amazon, потому что их IP-диапазоны принадлежат облачным провайдерам и легко распознаются анти-бот системами.

Как избежать блокировок при отслеживании позиций ключевых слов Amazon?

Используйте резидентные прокси с гео-таргетированием по странам. Ограничьте частоту запросов до 1 запроса на 2–5 секунд. Применяйте sticky-сессии для стабильной пагинации. Обнаруживайте CAPTCHA по URL или содержимому HTML и делайте паузу 5–10 минут при срабатывании. Используйте ретраи с экспоненциальной задержкой. При наличии доступа к Seller Central предпочтите официальный Amazon SP-API.

Готовы начать?

Резидентные, ISP и мобильные прокси в 148+ странах. Создайте бесплатный аккаунт.

Создать бесплатный аккаунт
← Вернуться в Блог