Как парсить данные товаров Amazon с помощью прокси

Узнайте, как парсить данные товаров Amazon, включая цены, отзывы и рейтинги, с помощью резидентных прокси. Полные примеры кода на Python и Node.js с стратегиями обхода защиты.

Как парсить данные товаров Amazon с помощью прокси

Зачем парсить данные товаров с Amazon?

На Amazon размещено более 350 миллионов товаров на десятках маркетплейсов по всему миру. Для e-commerce бизнеса эти данные бесценны: цены конкурентов, описания товаров, отзывы покупателей, рейтинг бестселлеров (BSR) и сигналы о наличии на складе — все это помогает принимать более обоснованные решения. Будь то создание инструмента мониторинга цен, маркетинговое исследование или обучение модели ИИ, данные с Amazon остаются одним из самых ценных источников в интернете.

Проблема в том, что Amazon активно инвестирует в защиту от ботов. Без правильной стратегии проксирования ваши парсеры столкнутся с CAPTCHA, блокировками IP и некорректными ответами в течение нескольких минут. В этом руководстве мы разберём архитектуру, код и настройку прокси, необходимые для надёжного парсинга Amazon в масштабе.

Защита Amazon от ботов

Прежде чем писать код, нужно понять, с чем вам предстоит столкнуться. Amazon использует многоуровневую систему обнаружения, которая анализирует каждый входящий запрос.

Отпечатки запросов

Amazon проверяет HTTP-заголовки, TLS-отпечатки и порядок заголовков в запросах. Запросы без стандартных браузерных заголовков или с известными бот-сигнатурами немедленно помечаются. Заголовки Accept-Language, Accept-Encoding и User-Agent должны быть согласованными и реалистичными.

Поведенческий анализ

Запросы, поступающие с частотой, недостижимой для человека, или следующие предсказуемым паттернам (например, последовательные ASIN), вызывают ограничение скорости. Amazon отслеживает поведение сессии по нескольким запросам, поэтому каждый IP должен вести себя как настоящий покупатель.

CAPTCHA-проверки

Когда Amazon подозревает автоматизированный трафик, вместо данных о товаре отображается CAPTCHA. Резидентные IP получают значительно меньше CAPTCHA, чем серверные, потому что они используют те же пулы адресов, что и реальные покупатели Amazon. Подробнее о методах обнаружения читайте в нашем руководстве о том, как антибот-системы обнаруживают прокси.

Ключевой вывод: резидентные прокси с правильной ротацией необходимы для стабильного парсинга Amazon. Серверные прокси будут заблокированы в течение нескольких часов.

Какие данные можно извлечь с Amazon

ДанныеСтраница-источникПрименение
Название, изображения, описание товараСтраница товараСоздание каталога, анализ контента
Текущая цена, цена со скидкой, рекомендованная ценаСтраница товара / список предложенийМониторинг цен, репрайсинг
Отзывы и рейтинги покупателейСтраницы отзывовАнализ тональности, исследование продуктов
Рейтинг бестселлеров (BSR)Страница товараОценка рыночного спроса
Продавец Buy Box, информация о доставкеСтраница товараОтслеживание конкурентов
Позиции в результатах поискаСтраницы поисковой выдачиSEO и оптимизация рекламы
Иерархия категорийУзлы каталогаМаппинг таксономии

Настройка конфигурации прокси

Шлюз резидентных прокси ProxyHat обеспечивает разнообразие IP-адресов и геотаргетинг, необходимые для парсинга Amazon. Подключайтесь через наш шлюз и автоматически ротируйте IP при каждом запросе или используйте sticky-сессии при необходимости.

Базовое подключение

# HTTP-прокси
http://USERNAME:PASSWORD@gate.proxyhat.com:8080
# С геотаргетингом (Amazon US)
http://USERNAME-country-US:PASSWORD@gate.proxyhat.com:8080
# Со sticky-сессией (сохранение IP в рамках сессии)
http://USERNAME-session-amz001:PASSWORD@gate.proxyhat.com:8080

Для парсинга Amazon мы рекомендуем использовать прокси из страны, соответствующей целевому маркетплейсу. Парсите amazon.de? Используйте немецкие IP. Парсите amazon.co.jp? Используйте японские IP. Ознакомьтесь с доступными локациями для полного списка.

Реализация на Python

Вот полный парсер товаров Amazon на Python с использованием Python SDK от ProxyHat, библиотек requests и BeautifulSoup.

Базовый парсер товаров

import requests
from bs4 import BeautifulSoup
import random
import time
import json
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
]
def get_amazon_product(asin, marketplace="com"):
    """Scrape product data from Amazon by ASIN."""
    url = f"https://www.amazon.{marketplace}/dp/{asin}"
    headers = {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
        "Connection": "keep-alive",
    }
    proxies = {
        "http": PROXY_URL,
        "https": PROXY_URL,
    }
    response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
    if response.status_code != 200:
        return None
    soup = BeautifulSoup(response.text, "html.parser")
    product = {
        "asin": asin,
        "title": extract_title(soup),
        "price": extract_price(soup),
        "rating": extract_rating(soup),
        "review_count": extract_review_count(soup),
        "bsr": extract_bsr(soup),
        "availability": extract_availability(soup),
    }
    return product
def extract_title(soup):
    el = soup.find("span", {"id": "productTitle"})
    return el.get_text(strip=True) if el else None
def extract_price(soup):
    el = soup.find("span", {"class": "a-price-whole"})
    if el:
        fraction = soup.find("span", {"class": "a-price-fraction"})
        price = el.get_text(strip=True).rstrip(".")
        if fraction:
            price += "." + fraction.get_text(strip=True)
        return price
    return None
def extract_rating(soup):
    el = soup.find("span", {"class": "a-icon-alt"})
    if el and "out of" in el.get_text():
        return el.get_text(strip=True).split(" ")[0]
    return None
def extract_review_count(soup):
    el = soup.find("span", {"id": "acrCustomerReviewCount"})
    return el.get_text(strip=True) if el else None
def extract_bsr(soup):
    el = soup.find("th", string=lambda t: t and "Best Sellers Rank" in t)
    if el:
        return el.find_next("td").get_text(strip=True)
    return None
def extract_availability(soup):
    el = soup.find("div", {"id": "availability"})
    return el.get_text(strip=True) if el else None
# Пример использования
if __name__ == "__main__":
    asins = ["B0CHX3QBCH", "B0D5BKRY4R", "B0CRMZHDG7"]
    for asin in asins:
        product = get_amazon_product(asin)
        if product:
            print(json.dumps(product, indent=2))
        time.sleep(random.uniform(2, 5))  # Случайная задержка между запросами

Обработка пагинации результатов поиска

def scrape_search_results(keyword, max_pages=5):
    """Scrape Amazon search results with pagination."""
    results = []
    for page in range(1, max_pages + 1):
        url = f"https://www.amazon.com/s?k={keyword}&page={page}"
        headers = {
            "User-Agent": random.choice(USER_AGENTS),
            "Accept-Language": "en-US,en;q=0.9",
        }
        proxies = {"http": PROXY_URL, "https": PROXY_URL}
        response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
        if response.status_code != 200:
            print(f"Page {page}: status {response.status_code}")
            break
        soup = BeautifulSoup(response.text, "html.parser")
        items = soup.find_all("div", {"data-component-type": "s-search-result"})
        for item in items:
            asin = item.get("data-asin", "")
            title_el = item.find("h2")
            price_el = item.find("span", {"class": "a-price-whole"})
            results.append({
                "asin": asin,
                "title": title_el.get_text(strip=True) if title_el else None,
                "price": price_el.get_text(strip=True) if price_el else None,
                "page": page,
            })
        time.sleep(random.uniform(3, 7))
    return results

Реализация на Node.js

Для проектов на Node.js используйте Node SDK от ProxyHat с cheerio для парсинга.

const axios = require("axios");
const cheerio = require("cheerio");
const { HttpsProxyAgent } = require("https-proxy-agent");
const PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080";
const agent = new HttpsProxyAgent(PROXY_URL);
const USER_AGENTS = [
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
];
async function scrapeProduct(asin, marketplace = "com") {
  const url = `https://www.amazon.${marketplace}/dp/${asin}`;
  const { data } = await axios.get(url, {
    httpsAgent: agent,
    headers: {
      "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
      "Accept-Language": "en-US,en;q=0.9",
      Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    },
    timeout: 30000,
  });
  const $ = cheerio.load(data);
  return {
    asin,
    title: $("#productTitle").text().trim() || null,
    price: $(".a-price-whole").first().text().trim() || null,
    rating: $(".a-icon-alt").first().text().trim().split(" ")[0] || null,
    reviewCount: $("#acrCustomerReviewCount").text().trim() || null,
    availability: $("#availability").text().trim() || null,
  };
}
async function scrapeMultiple(asins) {
  const results = [];
  for (const asin of asins) {
    try {
      const product = await scrapeProduct(asin);
      results.push(product);
      console.log(`Scraped: ${product.title}`);
    } catch (err) {
      console.error(`Failed ${asin}: ${err.message}`);
    }
    // Random delay 2-5 seconds
    await new Promise((r) => setTimeout(r, 2000 + Math.random() * 3000));
  }
  return results;
}
// Usage
scrapeMultiple(["B0CHX3QBCH", "B0D5BKRY4R"]).then((results) => {
  console.log(JSON.stringify(results, null, 2));
});

Стратегии ротации прокси для Amazon

Система обнаружения Amazon становится агрессивнее с увеличением количества запросов с одного IP. Вот стратегии ротации, которые работают лучше всего.

Ротация при каждом запросе

Для массовых проверок товаров, где каждый запрос независим, ротируйте IP при каждом запросе. Это поведение по умолчанию шлюза ProxyHat: каждое новое соединение получает свежий резидентный IP.

Ротация на основе сессий

При парсинге результатов поиска на нескольких страницах сохраняйте один и тот же IP на протяжении всей сессии. Смена IP в процессе пагинации выглядит подозрительно для Amazon. Используйте sticky-сессии ProxyHat:

# Сохранение IP до 10 минут
http://USERNAME-session-search001:PASSWORD@gate.proxyhat.com:8080

Геотаргетированная ротация

Сопоставляйте локацию прокси с маркетплейсом Amazon. Доступ к amazon.de с американского IP вызывает подозрения. Используйте таргетинг по странам:

# Немецкие IP для amazon.de
http://USERNAME-country-DE:PASSWORD@gate.proxyhat.com:8080
# Японские IP для amazon.co.jp
http://USERNAME-country-JP:PASSWORD@gate.proxyhat.com:8080
# Британские IP для amazon.co.uk
http://USERNAME-country-GB:PASSWORD@gate.proxyhat.com:8080

Подробнее о техниках ротации читайте в нашем руководстве лучшие прокси для веб-скрапинга в 2026 году.

Лучшие практики парсинга Amazon

  • Рандомизируйте задержки: используйте случайные интервалы от 2 до 7 секунд между запросами. Никогда не парсите с фиксированной частотой.
  • Ротируйте User-Agent: поддерживайте пул из минимум 10 реалистичных строк User-Agent браузеров и ротируйте их.
  • Обрабатывайте CAPTCHA корректно: если получили CAPTCHA, подождите 30-60 секунд и повторите попытку с новым IP.
  • Учитывайте robots.txt: хотя robots.txt не имеет юридической силы в большинстве юрисдикций, его соблюдение демонстрирует добросовестность.
  • Используйте резидентные прокси: серверные IP легко обнаруживаются и блокируются Amazon. Резидентные прокси используют те же диапазоны IP, что и реальные покупатели.
  • Мониторьте процент успешных запросов: отслеживайте долю ответов HTTP 200. Если она падает ниже 90%, снизьте параллельность или измените стратегию ротации.
  • Кешируйте ответы: никогда не парсите один и тот же URL дважды, если данные не изменились. Кешируйте данные о товарах и устанавливайте интервалы обновления в зависимости от частоты изменения цен.

Масштабирование парсера Amazon

При переходе от сотен к миллионам товаров архитектура имеет решающее значение.

Архитектура на основе очередей

Используйте очередь сообщений (Redis, RabbitMQ или SQS) для управления списком ASIN. Рабочие процессы извлекают ASIN из очереди, парсят их и отправляют результаты в хранилище данных. Это разделяет планирование и парсинг и позволяет масштабировать воркеры независимо.

Контроль параллельности

Начните с 5-10 параллельных запросов и увеличивайте постепенно, отслеживая процент успешных запросов. С резидентным пулом ProxyHat вы обычно можете запускать 20-50 параллельных сессий без проблем. Ознакомьтесь с нашей страницей веб-скрапинг для рекомендуемых конфигураций.

Конвейер данных

Храните сырой HTML в объектном хранилище (S3) для повторной обработки, а разобранные данные — в PostgreSQL или хранилище данных. Такое разделение позволяет исправлять ошибки парсинга без повторного обращения к Amazon.

Совет: страницы товаров Amazon часто меняют структуру. Сохраняйте сырой HTML, чтобы можно было повторно извлечь данные при изменении селекторов, не обращаясь к Amazon снова.

Юридические и этические аспекты

Веб-скрапинг легален в большинстве юрисдикций для общедоступных данных, но ответственный подход важен. Собирайте только публично отображаемые данные. Не пытайтесь получить доступ к страницам с авторизацией, аккаунтам продавцов или приватным данным. Ограничивайте частоту запросов, чтобы не ухудшать работу Amazon для других пользователей. Храните только необходимые данные и обрабатывайте их в соответствии с действующим законодательством о конфиденциальности.

Ключевые выводы

  • Антибот-система Amazon требует использования резидентных прокси с геотаргетингом, соответствующим целевому маркетплейсу.
  • Ротируйте IP при каждом запросе для массовых проверок; используйте sticky-сессии для постраничной навигации.
  • Рандомизируйте задержки, User-Agent и паттерны запросов для избежания обнаружения.
  • Стройте архитектуру на основе очередей для масштабирования за пределы нескольких тысяч товаров.
  • Сохраняйте сырой HTML для устойчивости к изменениям селекторов.
  • Используйте резидентные прокси ProxyHat для высокого процента успешных запросов на всех маркетплейсах Amazon.

Готовы начать парсинг данных Amazon? Наше руководство по парсингу e-commerce данных охватывает полную стратегию, а ознакомиться с инфраструктурой прокси ProxyHat можно на странице цен.

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

Доступ к более чем 50 млн резидентных IP в 148+ странах с AI-фильтрацией.

Смотреть ценыРезидентные прокси
← Вернуться в Блог