Как научиться собирать данные о товарах Amazon с помощью Python

Последнее обновление: April 16, 2026

Если вы уже пытались идти по туториалу по парсингу Amazon, а в итоге уткнулись в стену из CAPTCHA, ошибок 503 или пустых результатов — добро пожаловать в клуб. Большинство гайдов по сбору товаров Amazon на Python, которые гуляют по интернету, написаны в 2022 или 2023 году, и в них используются селекторы и приёмы, которые Amazon уже давно пофиксил.

Я много лет создавал инструменты для извлечения данных в Thunderbit, и вот что скажу по опыту: Amazon — один из самых сложных сайтов для стабильного парсинга. Платформа постоянно меняет HTML-структуру, использует многоуровневую защиту от ботов и даже показывает разные версии страниц разным пользователям через A/B-тесты. В этом руководстве я покажу Python-скрейпер для Amazon, который реально работает в 2025 году: с проверенными CSS-селекторами, многоуровневой антиблокировкой и рекомендациями по расписанию и экспорту, которые в большинстве статей вообще не разбирают. А для тех, кому нужны просто данные без возни с Python, я также покажу, как справляется с той же задачей буквально в пару кликов.

Что такое парсинг товаров Amazon?

Парсинг товаров Amazon — это автоматизированное извлечение общедоступных данных: названий товаров, цен, рейтингов, количества отзывов, изображений, наличия и многого другого — со страниц товаров и результатов поиска Amazon. Вместо того чтобы вручную копировать информацию из сотен карточек, скрейпер заходит на каждую страницу, читает HTML и собирает нужные вам данные в структурированный формат, например CSV, Excel или базу данных.

Представьте, что вы наняли неутомимого стажёра, который успевает обойти тысячу товарных страниц за то время, пока вы допиваете утренний кофе. Только этот стажёр никогда не ошибается в написании и не просит перерыв на обед.

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

На Amazon размещено примерно в более чем 30 категориях, и всё это поддерживают около . Сейчас сторонние продавцы формируют 69% общего GMV. Вручную отслеживать даже малую часть этого ассортимента нереально. Вот почему команды собирают данные с Amazon:

СценарийКому это полезноЧто извлекают
Мониторинг цен и репрайсингeCommerce-операции, продавцы на маркетплейсахЦены, наличие, данные о продавце
Анализ конкурентовПродакт-менеджеры, брендыХарактеристики товара, рейтинг, количество отзывов
Исследование рынкаАналитики, команды по запуску новых продуктовТренды категории, распределение цен
Генерация лидовОтделы продажНазвания продавцов, информация о бренде, контакты
Партнёрский маркетингКонтент-мейкеры, сайты с подборками скидокЦены, акции, карточки товаров
Отслеживание запасовЛогистика, закупкиСтатус наличия, сроки доставки

Одни только цены Amazon меняет просто безумно часто: , а цена среднего товара обновляется примерно каждые 10 минут. Для сравнения, такие конкуренты, как Best Buy и Walmart, меняют цены лишь около 50 000 раз в месяц. Ни одна человеческая команда за этим не угонится.

amazon-product-price-monitor-dashboard.webp

Python даёт полный контроль над процессом парсинга: вы сами решаете, что извлекать, как обрабатывать ошибки и куда сохранять данные. Но вместе с этим на вас ложится и ответственность за поддержку, обход блокировок и постоянное отслеживание изменений HTML на Amazon.

Что можно и что нельзя собирать с Amazon

Со страниц общедоступных товаров обычно можно извлечь:

  • Название товара (название, бренд)
  • Цена (текущая, исходная, цена по акции)
  • Рейтинг (средняя оценка звёздами)
  • Количество отзывов
  • Изображения товара (URL основного изображения)
  • Наличие / статус склада
  • ASIN (Amazon Standard Identification Number)
  • Описание товара и список характеристик
  • Информацию о продавце
  • Вариации товара (размер, цвет и т. д.)

А вот чего лучше избегать:

  • Данные за логином: расширенные страницы отзывов, личные данные аккаунта, история заказов
  • Личная информация: имена покупателей, адреса, платёжные данные
  • Контент, защищённый авторским правом, для повторной публикации: описания и изображения можно использовать для анализа, но не выдавайте их за свой оригинальный контент

В Amazon закрыто более 50 ботов по именам (включая GPTBot, Scrapy и ClaudeBot) и запрещены разделы вроде аккаунтов пользователей, корзины и списков желаний. Страницы товаров прямо не запрещены, но в правилах Amazon всё равно есть запрет на автоматический доступ. Судебная практика обычно разделяет нарушение ToS (гражданское правонарушение) и уголовные нарушения по CFAA — о юридической стороне поговорим в конце статьи.

Какие инструменты и библиотеки понадобятся

Вот стек Python для этого руководства:

БиблиотекаНазначениеПочему мы её используем
requestsHTTP-запросыПростая, широко поддерживаемая
beautifulsoup4Разбор HTMLУдобное извлечение по CSS-селекторам
lxmlБыстрый HTML-парсерИспользуется как backend для BeautifulSoup
curl_cffiИмитация TLS-отпечаткаКритично для обхода детекции Amazon
pandasСтруктурирование и экспорт данныхDataFrame, экспорт в CSV/Excel

Дополнительно (для контента, который рендерится JavaScript):

  • selenium или playwright — автоматизация headless-браузера

Настройка Python-окружения

Откройте терминал и выполните:

1mkdir amazon-scraper && cd amazon-scraper
2python -m venv venv
3source venv/bin/activate  # В Windows: venv\Scripts\activate
4pip install requests beautifulsoup4 lxml curl_cffi pandas

Проверьте, что всё установилось:

1import requests, bs4, curl_cffi, pandas
2print("Всё работает!")

Если ошибок нет и вы видите «Всё работает!», можно продолжать.

laptop-coding-workspace.webp

Почему большинство туториалов по Amazon ломаются (и чем этот отличается)

Это та часть, которую многие статьи пропускают, хотя именно из-за неё вы, скорее всего, и открыли этот материал.

Amazon регулярно обновляет HTML-структуру, названия классов и ID элементов. Сообщество скрейперов отмечает, что из-за изменений DOM и отпечатков браузера. Самая известная жертва? Селектор #priceblock_ourprice, который встречался в сотнях руководств с 2018 по 2023 год. Сейчас его на страницах товаров Amazon больше нет.

Короткое сравнение: что сломалось и что работает сейчас:

ПараметрСломанный селектор (до 2024)Рабочий селектор 2025
Цена#priceblock_ourpricediv#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen
Название#productTitlespan#productTitle (по-прежнему работает)
Рейтингspan.a-icon-alt (иногда в неверном контексте)#acrPopover span.a-icon-alt
Количество отзывов#acrCustomerReviewCountspan#acrCustomerReviewText
Наличие#availability spandiv#availability span.a-size-medium

Все фрагменты кода в этом руководстве были проверены на реальных страницах Amazon в 2025 году. Я покажу вам настоящие CSS-селекторы вместе с ожидаемым результатом — без копипаста из 2022-го.

Перед началом

  • Сложность: средняя (предполагаются базовые знания Python)
  • Время: около 30–45 минут на весь туториал; около 10 минут на базовый скрейпер
  • Что понадобится: Python 3.9+, браузер Chrome (для просмотра структуры страниц Amazon), терминал и, при желании, , если хотите сравнить подход без кода

Шаг 1: Отправьте первый запрос к Amazon

Откройте любую страницу товара Amazon в браузере и скопируйте URL. Начнём с простого requests.get():

1import requests
2url = "https://www.amazon.com/dp/B0DGNFM9YJ"
3response = requests.get(url)
4print(response.status_code)
5print(response.text[:500])

Запустите код, и почти наверняка получите статус 503 или страницу с текстом вроде «To discuss automated access to Amazon data please contact…». Это WAF (Web Application Firewall) Amazon распознаёт ваш Python-скрипт. Обычный requests.get() без правильных заголовков даёт лишь около при работе с Amazon.

Вы, скорее всего, увидите 503 и страницу блокировки в HTML. Это нормально — на следующем шаге исправим.

Шаг 2: Настройте заголовки и имитацию TLS-отпечатка

Просто добавить заголовок User-Agent уже недостаточно. Amazon сравнивает HTTP-заголовки с TLS-отпечатком. Если вы утверждаете, что это Chrome 120, а TLS-рукопожатие показывает библиотеку Python requests, вас .

Самый надёжный подход в 2025 году — использовать curl_cffi с имитацией браузера:

1from curl_cffi import requests as cfreq
2headers = {
3    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
4    "Accept-Language": "en-US,en;q=0.9",
5    "Accept-Encoding": "gzip, deflate, br",
6    "Referer": "https://www.google.com/",
7    "DNT": "1",
8    "Connection": "keep-alive",
9    "Upgrade-Insecure-Requests": "1",
10}
11url = "https://www.amazon.com/dp/B0DGNFM9YJ"
12response = cfreq.get(url, headers=headers, impersonate="chrome124")
13print(response.status_code)
14print(len(response.text))

С curl_cffi, имитирующим Chrome 124, показатель успеха вырастает примерно до — это в 47 раз лучше, чем у обычного requests. Теперь вы должны увидеть 200 и куда более длинный HTML-ответ (100 000+ символов).

Если всё ещё получаете 503, попробуйте другое значение impersonate (например, "chrome131") или подождите немного перед повторной попыткой.

Шаг 3: Разберите HTML и извлеките данные о товаре

Теперь, когда у нас есть полный HTML, извлечём данные с помощью BeautifulSoup и проверенных селекторов 2025 года:

1from bs4 import BeautifulSoup
2soup = BeautifulSoup(response.text, "lxml")
3# Название товара
4title_el = soup.select_one("span#productTitle")
5title = title_el.get_text(strip=True) if title_el else None
6# Цена
7price_el = soup.select_one(
8    "div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen"
9)
10if not price_el:
11    price_el = soup.select_one("span.priceToPay .a-offscreen")
12if not price_el:
13    price_el = soup.select_one(".apexPriceToPay .a-offscreen")
14price = price_el.get_text(strip=True) if price_el else None
15# Рейтинг
16rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17rating = rating_el.get_text(strip=True) if rating_el else None
18# Количество отзывов
19reviews_el = soup.select_one("span#acrCustomerReviewText")
20reviews = reviews_el.get_text(strip=True) if reviews_el else None
21# Наличие
22avail_el = soup.select_one("div#availability span")
23availability = avail_el.get_text(strip=True) if avail_el else None
24# URL основного изображения
25img_el = soup.select_one("#landingImage")
26image_url = img_el.get("src") if img_el else None
27print(f"Title: {title}")
28print(f"Price: {price}")
29print(f"Rating: {rating}")
30print(f"Reviews: {reviews}")
31print(f"Availability: {availability}")
32print(f"Image: {image_url}")

Пример ожидаемого вывода:

1Title: Apple AirPods Pro (2nd Generation) with USB-C
2Price: $189.99
3Rating: 4.7 out of 5 stars
4Reviews: 98,432 ratings
5Availability: In Stock
6Image: https://m.media-amazon.com/images/I/61SUj2...

Обратите внимание на несколько запасных селекторов для цены — Amazon использует разные контейнеры в зависимости от типа товара, наличия скидки и варианта A/B-теста. Если оборачивать каждое извлечение в проверку, скрейпер не будет падать, когда селектор не совпал.

Шаг 4: Соберите несколько товаров со страницы поиска

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

1import time
2import random
3def get_search_asins(keyword, max_pages=1):
4    """Собирает ASIN из результатов поиска Amazon."""
5    asins = []
6    for page in range(1, max_pages + 1):
7        search_url = f"https://www.amazon.com/s?k={keyword}&page={page}"
8        resp = cfreq.get(search_url, headers=headers, impersonate="chrome124")
9        if resp.status_code != 200:
10            print(f"Страница поиска {page} вернула {resp.status_code}")
11            break
12        search_soup = BeautifulSoup(resp.text, "lxml")
13        results = search_soup.select('div[data-component-type="s-search-result"]')
14        for r in results:
15            asin = r.get("data-asin")
16            if asin:
17                asins.append(asin)
18        print(f"Страница {page}: найдено {len(results)} товаров")
19        time.sleep(random.uniform(2, 5))  # Вежливая пауза
20    return asins
21asins = get_search_asins("wireless+earbuds", max_pages=2)
22print(f"Собрано ASIN: {len(asins)}")

Каждый ASIN соответствует чистому URL товара: https://www.amazon.com/dp/{ASIN}. Это надёжнее, чем использовать полный URL из поиска, который может содержать параметры, зависящие от сессии.

Шаг 5: Обработайте пагинацию и соберите данные в масштабе

Теперь объединим сбор ASIN из поиска и парсинг карточек товаров в полноценный пайплайн:

1import pandas as pd
2def scrape_product(asin):
3    """Собирает данные со страницы конкретного товара Amazon."""
4    url = f"https://www.amazon.com/dp/{asin}"
5    try:
6        resp = cfreq.get(url, headers=headers, impersonate="chrome124")
7        if resp.status_code != 200:
8            return None
9        soup = BeautifulSoup(resp.text, "lxml")
10        title_el = soup.select_one("span#productTitle")
11        price_el = (
12            soup.select_one("div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen")
13            or soup.select_one("span.priceToPay .a-offscreen")
14            or soup.select_one(".apexPriceToPay .a-offscreen")
15        )
16        rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17        reviews_el = soup.select_one("span#acrCustomerReviewText")
18        avail_el = soup.select_one("div#availability span")
19        img_el = soup.select_one("#landingImage")
20        return {
21            "asin": asin,
22            "title": title_el.get_text(strip=True) if title_el else None,
23            "price": price_el.get_text(strip=True) if price_el else None,
24            "rating": rating_el.get_text(strip=True) if rating_el else None,
25            "reviews": reviews_el.get_text(strip=True) if reviews_el else None,
26            "availability": avail_el.get_text(strip=True) if avail_el else None,
27            "image_url": img_el.get("src") if img_el else None,
28            "url": url,
29        }
30    except Exception as e:
31        print(f"Ошибка при парсинге {asin}: {e}")
32        return None
33# Собираем все найденные ASIN
34products = []
35for i, asin in enumerate(asins):
36    print(f"Парсинг {i+1}/{len(asins)}: {asin}")
37    product = scrape_product(asin)
38    if product:
39        products.append(product)
40    time.sleep(random.uniform(2, 5))  # Случайная пауза между запросами
41df = pd.DataFrame(products)
42print(f"\nУспешно собрано товаров: {len(df)}")
43print(df.head())

Случайная задержка 2–5 секунд критически важна. Слишком ровный интервал (например, строго каждые 3 секунды) выглядит подозрительно для поведенческой аналитики Amazon. Случайные интервалы имитируют поведение живого пользователя.

Шаг 6: Сохраните данные Amazon в CSV

1df.to_csv("amazon_products.csv", index=False, encoding="utf-8-sig")
2print("Сохранено в amazon_products.csv")

Теперь у вас должен быть аккуратный CSV с колонками ASIN, title, price, rating, reviews, availability, image URL и product URL. На этом большинство туториалов заканчивается — но если вы строите рабочий процесс, CSV — это только начало.

Глубокий разбор антиблокировки: как удержать скрейпер в работе

Блокировки — это для всех, кто пытается собирать данные Amazon на Python. Шестислойная защита Amazon включает анализ репутации IP, TLS-отпечатки, проверку браузерной среды, поведенческую биометрию, CAPTCHA и ML-детекцию аномалий. Ниже — многоуровневая стратегия для каждого из этих барьеров.

Ротация User-Agent и полных заголовков

Один статический User-Agent быстро попадает под подозрение. Переключайтесь между актуальными строками браузеров:

1import random
2USER_AGENTS = [
3    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
4    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
5    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
6    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
7]
8def get_headers():
9    return {
10        "User-Agent": random.choice(USER_AGENTS),
11        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
12        "Accept-Language": "en-US,en;q=0.9",
13        "Accept-Encoding": "gzip, deflate, br",
14        "Referer": "https://www.google.com/",
15        "DNT": "1",
16        "Connection": "keep-alive",
17    }

Одна важная деталь, на которой многие спотыкаются: Accept-Language должен соответствовать географии, которую предполагает ваш IP. Например, Accept-Language: en-US с немецкого IP выглядит подозрительно.

Имитация TLS-отпечатка через curl_cffi

Мы уже касались этого в шаге 2, но здесь важно ещё раз подчеркнуть: именно этот приём даёт самый большой прирост в успешности запросов. Обычный Python requests показывает около 2% успеха против Amazon. С имитацией через curl_cffi вы выходите примерно на 94%. Это разница между рабочим скрейпером и сломанным.

1from curl_cffi import requests as cfreq
2# Имитацию браузера тоже лучше ротировать
3BROWSERS = ["chrome120", "chrome124", "chrome131"]
4response = cfreq.get(
5    url,
6    headers=get_headers(),
7    impersonate=random.choice(BROWSERS),
8)

Ротация прокси

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

1PROXIES = [
2    "http://user:pass@proxy1.example.com:8080",
3    "http://user:pass@proxy2.example.com:8080",
4    "http://user:pass@proxy3.example.com:8080",
5]
6proxy = random.choice(PROXIES)
7response = cfreq.get(
8    url,
9    headers=get_headers(),
10    impersonate="chrome124",
11    proxies={"http": proxy, "https": proxy},
12)

Residential-прокси обычно эффективнее, чем датацентровые (Amazon заранее блокирует диапазоны датацентровых IP), но и стоят они дороже. Для небольшого проекта можно начать с и масштабироваться по мере необходимости.

Ограничение частоты и экспоненциальный backoff

Ни одна из статей конкурентов, которые я смотрел, не уделяет этому достаточно внимания, а зря. Если вы получили 503 или CAPTCHA, не пытайтесь сразу повторить запрос — это быстрый путь к вечной блокировке.

1import time
2import random
3def fetch_with_backoff(url, max_retries=3):
4    """Выполняет запрос с экспоненциальным backoff при ошибке."""
5    for attempt in range(max_retries):
6        response = cfreq.get(
7            url,
8            headers=get_headers(),
9            impersonate=random.choice(BROWSERS),
10        )
11        if response.status_code == 200:
12            return response
13        # Экспоненциальная пауза с джиттером
14        wait = min(2 ** attempt + random.uniform(0, 1), 30)
15        print(f"Попытка {attempt+1} не удалась ({response.status_code}). Ждём {wait:.1f}с...")
16        time.sleep(wait)
17    return None  # Все попытки исчерпаны

Формула wait = min(2^attempt + jitter, max_delay) гарантирует, что паузы будут расти (2с, 4с, 8с...), но не уйдут в абсурдные значения. Случайный jitter не даёт Amazon легко распознать шаблон повторных попыток.

Запасной вариант на Selenium или Playwright для JS-контента

Некоторые страницы Amazon — особенно с динамическими виджетами цен или селекторами вариаций — требуют JavaScript для полной отрисовки. Если curl_cffi возвращает неполный HTML, используйте headless-браузер как запасной вариант:

1from playwright.sync_api import sync_playwright
2def scrape_with_browser(url):
3    with sync_playwright() as p:
4        browser = p.chromium.launch(headless=True)
5        page = browser.new_page()
6        page.goto(url, wait_until="domcontentloaded")
7        page.wait_for_timeout(3000)  # Дать JS отрисоваться
8        html = page.content()
9        browser.close()
10        return html

Это медленнее — 3–5 секунд на страницу против менее чем 1 секунды у curl_cffi. Используйте только тогда, когда это действительно нужно.

По моему опыту, curl_cffi справляется более чем с 90% страниц товаров Amazon без браузера.

Краткое резюме по антиблокировке

МетодСложностьЭффективностьЕсть ли у большинства туториалов?
Кастомный User-AgentЛегкоНизкая (Amazon распознаёт шаблоны)Да
Ротация полных заголовковЛегкоСредняяРедко
Имитация TLS (curl_cffi)СредняяВысокая (~94% успеха)Почти никогда
Ротация проксиСредняяВысокаяЕсли и упоминается, то вскользь
Rate limiting + exponential backoffЛегкоСредняяНет
Запасной вариант на Selenium/PlaywrightСредняяВысокая (для JS-контента)Упоминается, но не показывается

Не только CSV: экспорт данных Amazon в Google Sheets, Airtable и другие сервисы

Почти все туториалы заканчиваются на экспорте в CSV. Но в реальных рабочих процессах данные нужны в Google Sheets, базах данных или инструментах вроде Airtable и Notion.

Экспорт в Google Sheets через gspread

Сначала настройте сервисный аккаунт Google — это делается один раз:

  1. Перейдите в → APIs & Services → Credentials
  2. Создайте сервисный аккаунт и скачайте JSON-файл ключа
  3. Сохраните его в ~/.config/gspread/service_account.json
  4. Откройте доступ к целевой таблице для client_email из JSON-файла

Затем:

1import gspread
2from gspread_dataframe import set_with_dataframe
3gc = gspread.service_account()
4sh = gc.open("Amazon Scrape Data")
5worksheet = sh.sheet1
6set_with_dataframe(worksheet, df)
7print("Данные экспортированы в Google Sheets!")

Это сразу записывает весь DataFrame в Google Sheet — в живом виде, с возможностью совместной работы и готовностью к дашбордам.

Хранение в SQLite для локального анализа

Для больших датасетов или истории изменений SQLite подходит идеально — без сервера, просто один файл:

1import sqlite3
2conn = sqlite3.connect("amazon_products.db")
3df.to_sql("products", conn, if_exists="append", index=False)
4print(f"Сохранено товаров в SQLite: {len(df)}")
5# Позже можно сделать запрос:
6historical = pd.read_sql_query(
7    "SELECT * FROM products WHERE price IS NOT NULL ORDER BY rowid DESC LIMIT 100",
8    conn,
9)

Альтернатива без кода

Если вы не хотите поддерживать Python-скрипты для экспорта, предлагает бесплатный экспорт в Google Sheets, Airtable, Notion, Excel, CSV и JSON — включая поля с изображениями, которые корректно отображаются прямо в Airtable и Notion. Без настройки gspread, без API-ключей, без кода вообще. Для команд, которым важно, чтобы данные сразу попадали в уже используемые инструменты, это серьёзная экономия времени.

Планирование автоматических парсингов Amazon — недостающая глава

Мониторинг цен и отслеживание запасов требуют регулярных запусков, а не разового парсинга. Но среди конкурирующих статей я не нашёл ни одной, где нормально разобрано расписание. Вот как автоматизировать ваш Python-скрейпер.

Cron jobs (Linux/macOS)

Откройте crontab:

1crontab -e

Добавьте строку, чтобы запускать скрейпер каждый день в 6 утра:

10 6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Или каждые 6 часов:

10 */6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Планировщик задач Windows

Создайте batch-файл run_scraper.bat:

1@echo off
2cd /d "C:\path\to\amazon-scraper"
3call venv\Scripts\activate
4python scraper.py
5deactivate

Затем откройте Task Scheduler → Create Basic Task → задайте триггер (ежедневно, каждый час) → Action: "Start a program" → укажите run_scraper.bat.

GitHub Actions (бесплатный тариф)

Для облачного расписания без собственной инфраструктуры:

1name: Amazon Scraper
2on:
3  schedule:
4    - cron: "0 6 * * *"  # Ежедневно в 6:00 UTC
5  workflow_dispatch:       # Ручной запуск
6jobs:
7  scrape:
8    runs-on: ubuntu-latest
9    steps:
10      - uses: actions/checkout@v3
11      - name: Set up Python
12        uses: actions/setup-python@v4
13        with:
14          python-version: "3.11"
15      - name: Install dependencies
16        run: pip install -r requirements.txt
17      - name: Run scraper
18        run: python scraper.py
19      - name: Commit results
20        run: |
21          git config user.name 'GitHub Actions'
22          git config user.email 'actions@github.com'
23          git add data/
24          git diff --staged --quiet || git commit -m "Обновление собранных данных"
25          git push

Сохраните данные прокси в GitHub Secrets, и у вас будет бесплатный автоматизированный пайплайн для парсинга.

Альтернатива без кода: Scheduled Scraper от Thunderbit

Командам, которым не хочется разбираться с cron-синтаксисом или облачной инфраструктурой, Thunderbit предлагает встроенный . Вы описываете расписание обычным языком (например, «каждый день в 8 утра» или «каждый понедельник»), добавляете URL Amazon и нажимаете «Запланировать». Никакого терминала, никаких YAML-файлов, никакого деплой-пайплайна. Это особенно полезно для eCommerce-команд, которым нужен постоянный мониторинг цен или остатков.

Python DIY, Scraper API или no-code: что выбрать?

Я постоянно вижу этот вопрос на форумах, но в статьях из топа выдачи почти никогда нет нормального сравнения. Поэтому вот мой честный взгляд:

КритерийPython + BS4/curl_cffiScraper API (ScraperAPI, Oxylabs)No-code (Thunderbit)
Время на настройку30–60 мин10–20 мин~2 минуты
Нужен кодДа (Python)Да (API-запросы)Нет
Антиблокировка встроенаНет (своими силами)ДаДа
Поддержка JS-рендерингаТолько с Selenium/PlaywrightЗависит от провайдераДа (Browser или Cloud режим)
РасписаниеСвоя настройка (cron/cloud)У некоторых естьВстроено
СтоимостьБесплатно (+ расходы на прокси)$30–100+/месЕсть бесплатный тариф
Поддержка и обслуживаниеВысокие (селекторы ломаются)НизкиеНет (AI подстраивается)
Лучше всего подходитРазработчикам, которым нужен полный контрольМасштаб и надёжность на объёмахСкорость, non-developers, бизнес-пользователям

Python — правильный выбор, если вы хотите учиться, настраивать всё до мелочей и не боитесь регулярной поддержки. Scraper API снимают с вас часть антиблокировки, но код всё равно нужен. А Thunderbit — самый быстрый путь для продаж, eCommerce-операций и вообще для тех, кому нужны только данные: без селекторов, без кода, без обслуживания, когда Amazon снова меняет HTML.

Как Thunderbit собирает товары Amazon в 2 клика

Разумеется, я предвзят — мою команду это и сделало. Но процесс действительно настолько простой:

  1. Установите
  2. Откройте страницу результатов поиска Amazon или страницу товара
  3. Нажмите «AI Suggest Fields» (или используйте готовый шаблон для Amazon)
  4. Нажмите «Scrape»

AI в Thunderbit читает страницу, определяет структуру данных и вытягивает всё в чистую таблицу. Вы можете бесплатно экспортировать данные в Excel, Google Sheets, Airtable или Notion. Главное преимущество: когда Amazon на следующей неделе снова изменит HTML, AI Thunderbit подстроится автоматически. Никаких сломанных скриптов, никаких обновлений селекторов.

Если нужно дополнить список товаров данными со страниц карточек, функция Subpage Scraping в Thunderbit автоматически переходит по ссылкам на страницы товаров и подтягивает дополнительные поля, такие как изображения, описания и вариации — в Python это потребует заметно больше кода.

Советы, как надолго сохранить работоспособность Python-скрейпера Amazon

Если вы всё же идёте по пути Python, вот как снизить объём будущей поддержки:

  • Регулярно проверяйте селекторы. Amazon часто их меняет. Добавьте эту статью в закладки — я буду обновлять таблицу селекторов по мере изменений.
  • Следите за успешностью запросов. Отслеживайте соотношение ответов 200 к 503/CAPTCHA. Настройте оповещение (хотя бы по email), если успешность падает ниже 80%.
  • Сохраняйте сырой HTML. Храните полный HTML-ответ вместе с распарсенными данными. Если селекторы изменятся, исторические данные можно будет распарсить заново без повторного скрейпа.
  • Часто ротируйте прокси и User-Agent. Статические отпечатки на масштабе быстро попадают под блокировку.
  • Используйте экспоненциальный backoff. Никогда не делайте мгновенный повтор после блокировки.
  • Контейнеризируйте через Docker. Заверните скрейпер в Docker-контейнер для удобного деплоя и переносимости.
  • Добавьте валидацию данных. Проверяйте, что цены — числа, рейтинги находятся в диапазоне 1–5, а названия не пустые. Одна команда сообщала о после добавления таких проверок.

Если всё это звучит как слишком большая нагрузка, возможно, no-code-инструмент вроде Thunderbit лучше подойдёт для вашей задачи. Нет ничего постыдного в выборе более быстрого пути — я достаточно лет отлаживал скрейперы, чтобы знать: иногда лучший код — это тот, который вам вообще не нужно писать.

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

Поскольку этот вопрос неизбежно возникает в любом разговоре о парсинге Amazon, коротко о правовой стороне:

  • Сбор общедоступных данных в целом законен в США. Знаковое решение (2022) подтвердило, что доступ к публичным данным не нарушает CFAA. Позднее дела (2024) и (2024) укрепили этот подход.
  • Условия использования Amazon запрещают автоматический доступ. Это гражданский вопрос (нарушение договора), а не уголовное преступление. Суды обычно различают эти категории.
  • Amazon v. Perplexity (2025) — действующее дело, связанное с ИИ-сбором данных со страниц Amazon. В марте 2026 года был вынесен предварительный запрет. За этим стоит следить.
  • Ограничивайтесь публичными страницами. Не собирайте контент за логином, личные данные или что-либо, требующее авторизации.
  • Соблюдайте rate limits. Не перегружайте серверы Amazon. Задержка 2–5 секунд между запросами — разумный ориентир.
  • Используйте данные ответственно. Собирайте их для анализа, а не для повторной публикации защищённого авторским правом контента.
  • Проконсультируйтесь с юристом при крупном коммерческом использовании, особенно если вы работаете в ЕС (на персональные данные распространяется GDPR).

Для более глубокого разбора см. наше руководство о .

Итоги

Теперь у вас есть рабочий Python-скрейпер для Amazon с проверенными селекторами 2025 года, многоуровневой антиблокировкой, которая далеко выходит за рамки совета «просто добавьте User-Agent», практическими способами запуска по расписанию для постоянного мониторинга и вариантами экспорта, которые доставляют данные в Google Sheets, базы данных или любой инструмент, которым пользуется ваша команда.

Кратко:

  • Python + curl_cffi + BeautifulSoup дают полный контроль и около 94% успеха при использовании имитации TLS
  • Антиблокировка требует нескольких слоёв: ротации заголовков, имитации TLS, ротации прокси, rate limiting и exponential backoff
  • Расписание превращает разовый скрипт в непрерывный пайплайн мониторинга (cron, GitHub Actions или встроенный планировщик Thunderbit)
  • Экспорт не только в CSV — Google Sheets, SQLite, Airtable, Notion — это то место, где появляется реальная бизнес-ценность
  • Thunderbit предлагает альтернативу в 2 клика для тех, кто не хочет писать код или предпочитает тратить время на анализ данных, а не на отладку селекторов

Если хотите попробовать код, всё в этом руководстве уже готово к копированию и запуску. А если предпочитаете вообще без программирования, позволяет сразу протестировать no-code-подход на Amazon.

Подробнее см. наши руководства о , и . Также можно посмотреть пошаговые разборы на .

Удачного парсинга — и пусть ваши селекторы переживут следующее обновление Amazon.

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

1. Почему мой Python-скрейпер Amazon блокируется уже после нескольких запросов?

Amazon использует шестислойную систему защиты: анализ репутации IP, TLS-отпечатки (JA3/JA4), определение среды браузера, поведенческую биометрию, CAPTCHA и ML-детекцию аномалий. Базовый скрипт на requests только с заголовком User-Agent показывает около успешных запросов. Для стабильной работы нужны TLS-имитация (curl_cffi), полная ротация заголовков, ротация прокси и rate limiting с случайным jitter.

2. Какие Python-библиотеки лучше всего подходят для парсинга товаров Amazon в 2025 году?

curl_cffi — для HTTP-запросов с имитацией TLS (это даёт самый заметный прирост), BeautifulSoup4 с lxml — для разбора HTML, pandas — для структурирования и экспорта данных, а Selenium или Playwright — как резервный вариант для JavaScript-рендеринга. Python используют специалистов по веб-скрейпингу.

3. Законно ли собирать данные о товарах Amazon?

Сбор общедоступных данных в США в целом законен, что подтверждают решения вроде hiQ v. LinkedIn и Meta v. Bright Data. Условия использования Amazon запрещают автоматический доступ, но суды различают нарушение ToS (гражданское) и уголовные нарушения. Всегда избегайте контента за логином, соблюдайте rate limits и консультируйтесь с юристом при крупном коммерческом использовании.

4. Можно ли собирать данные с Amazon без написания кода?

Да. Инструменты вроде позволяют собирать данные о товарах Amazon в 2 клика с помощью расширения Chrome. AI автоматически определяет поля и структурирует данные, а экспорт в Excel, Google Sheets, Airtable или Notion доступен бесплатно. Когда Amazon меняет HTML, AI Thunderbit подстраивается без ручных правок.

5. Как часто Amazon меняет HTML-селекторы и как поддерживать скрейпер в актуальном состоянии?

Часто и без предупреждения. Сообщество скрейперов сообщает, что парсеров нуждаются в еженедельных исправлениях из-за изменений DOM. Чтобы успевать за изменениями, отслеживайте успешность запросов, сохраняйте сырой HTML для повторного парсинга и регулярно проверяйте селекторы на живых страницах. Или используйте AI-инструменты вроде Thunderbit, которые адаптируются автоматически и снимают эту нагрузку.

Подробнее

Содержание

Попробуй Thunderbit

Собирай лиды и другие данные всего в 2 клика. На базе AI.

Получить Thunderbit Это бесплатно
Извлекай данные с помощью AI
Легко передавай данные в Google Sheets, Airtable или Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week