Мой скрапер отзывов Amazon отлично работал шесть недель — а потом однажды утром он вернул 200 OK и пустую страницу. Ни ошибки, ни CAPTCHA, просто пустой HTML там, где раньше были сотни отзывов.
Если это звучит знакомо, вы не одиноки. В конце 2025 года Amazon начал прятать полные страницы отзывов за экраном входа, и огромное количество Python-скриптов для парсинга перестало работать буквально за ночь. Последние несколько месяцев я провёл в Thunderbit, разбирая эту проблему с двух сторон — создавая наш AI веб скрапер и одновременно поддерживая собственный Python-пайплайн для отзывов. Поэтому я решил написать тот самый гайд, которого мне самому не хватало, когда мой скрипт впервые «умер».
В этой статье я покажу рабочий подход: вход по cookies, стабильные селекторы, которые переживают CSS-обфускацию Amazon, обход лимита пагинации в 10 страниц, защиту от антибот-систем и бонусный раздел по анализу тональности, который превращает сырые отзывы в реальные бизнес-инсайты. А если по ходу вы подумаете: «Лучше бы я не поддерживал весь этот код», — я покажу, как Thunderbit делает то же самое примерно за две минуты и вообще без Python.
Что такое скрапинг отзывов Amazon и зачем он нужен?
Скрапинг отзывов Amazon — это программное извлечение данных из пользовательских отзывов: рейтинга в звёздах, текста отзыва, имени автора, даты, отметки о подтверждённой покупке и других полей со страниц товаров Amazon. Поскольку Amazon убрал отзывы из Product Advertising API ещё в 2010 году и так их и не вернул, веб-скрапинг остаётся единственным программным способом получить эти данные.
Цифры это подтверждают. 95% покупателей читают отзывы перед покупкой, а 94% называют Amazon своим главным источником отзывов о товарах. Показ всего 5 отзывов на странице товара может увеличить конверсию на 270%. Компании, которые системно анализируют тональность отзывов, видят до 15% более высокий уровень удержания клиентов. Это не абстрактная дата-сайенс-история — это конкурентная разведка, сигналы для улучшения продукта и маркетинговый язык, который лежит прямо в текстах на серверах Amazon.
Зачем скрапить отзывы Amazon с помощью Python
Python по-прежнему остаётся основным инструментом для этой задачи. Это самый желанный язык в опросе Stack Overflow Developer Survey 2024, а его экосистема — requests, BeautifulSoup, pandas, Scrapy — делает веб-скрапинг доступным даже тем, кто не работает разработчиком на полной ставке.
Разные команды используют эти данные по-разному:
| Команда | Сценарий использования | Что извлекают |
|---|---|---|
| Продукт / R&D | Находят повторяющиеся жалобы, приоритизируют исправления | Текст отзывов с 1–2 звёздами, частотность ключевых слов |
| Продажи | Отслеживают тональность товаров конкурентов | Рейтинги, динамика объёма отзывов |
| Маркетинг | Берут язык клиентов для рекламных текстов | Позитивные формулировки из отзывов, упоминания функций |
| Ecommerce Ops | Следят за изменением тональности собственного товара | Распределение по звёздам, доля подтверждённых покупок |
| Исследование рынка | Сравнивают лидеров категории по функциям | Наборы отзывов по нескольким ASIN |
Один бренд кухонной утвари проанализировал негативные отзывы и обнаружил, что 22% жалоб связаны с тем, что "антипригарное покрытие стирается", переработал продукт и вернул себе первую позицию Best Seller за 60 дней. Компания, выпускающая фитнес-трекеры, выявила в текстах отзывов проблему "раздражения ремешка", обнаружила связь с аллергией на латекс, выпустила гипоаллергенную версию и сократила возвраты на 40%. Вот ради такого ROI и стоит заниматься этой инженерной работой.
Экран входа: почему ваш скрапер отзывов Amazon перестал работать
14 ноября 2024 года Amazon начал требовать авторизацию для просмотра полной страницы отзывов о товаре. Это подтверждалось в сообществах пользователей и блогах сервисов для скрапинга. Если открыть /product-reviews/{ASIN}/ в режиме инкогнито, вас перенаправит на страницу входа, а не на отзывы.

Симптомы тонкие: ваш скрипт получает ответ 200 OK, но в теле HTML вместо отзывов лежит форма входа (name="email", id="ap_password"). Никакой ошибки. Никакой CAPTCHA. Просто... ничего полезного.
Amazon сделал это из соображений антибот-защиты и регионального соответствия требованиям. Принудительная проверка работает не всегда одинаково — иногда свежий браузер успевает показать несколько отзывов до срабатывания блока, особенно на первой странице — но для любого скрапера на масштабе стоит считать, что экран входа включён всегда.
Разные региональные домены Amazon (.de, .co.uk, .co.jp) применяют эту защиту отдельно. Как написал один участник форума: «для каждой страны нужен отдельный логин». Ваши cookies с .com не подойдут для .co.uk.
Featured Reviews vs. полные отзывы: что можно получить без логина
На страницах товара Amazon (/dp/{ASIN}/) по-прежнему отображается примерно 8 "featured reviews" без авторизации. Это отзывы, которые Amazon отобрал алгоритмически. Они полезны для быстрого просмотра тональности, но их нельзя сортировать, фильтровать или листать страницами.
Полные страницы отзывов (/product-reviews/{ASIN}/) — с сортировкой по новизне, фильтром по звёздам и пагинацией на сотни отзывов — уже требуют входа.
Если вам нужно всего несколько отзывов для быстрого «пульса», можно скрапить страницу товара. Если нужны сотни или тысячи — придётся работать с авторизацией.
Что нужно до старта: Python и библиотеки
Прежде чем писать код, вот базовая подготовка:
- Сложность: средняя (уверенное владение Python, базовое понимание HTML)
- Время: около 45 минут на полный пайплайн; около 10 минут на простой скрапинг
- Что понадобится: Python 3.8+, браузер Chrome, действующий аккаунт Amazon
Установите основные библиотеки:
pip install requests beautifulsoup4 lxml pandas textblob
Опционально (для продвинутого анализа тональности):
pip install transformers torch
Что такое ASIN? Это 10-символьный идентификатор товара Amazon. Вы найдёте его в любом URL товара — например, в amazon.com/dp/B0BCNKKZ91 ASIN будет B0BCNKKZ91. Именно его вы подставите в URL страницы отзывов.
Шаг 1: Обойти экран входа с помощью авторизации через cookies
Самый надёжный способ — войти в Amazon в браузере, скопировать cookies сессии и подставить их в requests.Session() в Python. Так вы избегаете CAPTCHA и SMS-2FA, которые часто ломают автоматический логин через Selenium.
Вам понадобятся эти семь cookies:
| Имя cookie | Назначение |
|---|---|
session-id | Плавающий идентификатор сессии |
session-id-time | Временная метка сессии |
session-token | Плавающий токен сессии |
ubid-main | Идентификатор браузерной активности пользователя |
at-main | Основной auth-токен |
sess-at-main | Auth в рамках сессии |
x-main | Идентификатор, привязанный к email пользователя |
Как извлечь cookies через Chrome DevTools
- Войдите в amazon.com в Chrome
- Откройте DevTools (F12 или правый клик → Inspect)
- Перейдите в Application → Storage → Cookies →
https://www.amazon.com - Найдите каждое имя cookie из таблицы и скопируйте значение
- Соберите их в строку, разделённую
;, для Python
Настройте сессию вот так:
import requests
session = requests.Session()
# Вставьте значения cookie сюда
cookies = {
"session-id": "YOUR_SESSION_ID",
"session-id-time": "YOUR_SESSION_ID_TIME",
"session-token": "YOUR_SESSION_TOKEN",
"ubid-main": "YOUR_UBID_MAIN",
"at-main": "YOUR_AT_MAIN",
"sess-at-main": "YOUR_SESS_AT_MAIN",
"x-main": "YOUR_X_MAIN",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
}
session.cookies.update(cookies)
session.headers.update(headers)
Важно: используйте один и тот же объект session для всех запросов. Так cookies остаются согласованными, а поведение больше похоже на реальный браузер. Обычно cookies живут от нескольких дней до нескольких недель даже при скрапинге, но если снова начались редиректы на логин — просто обновите их из браузера.
Для маркетплейсов не .com имена cookies немного отличаются — у amazon.de используется at-acbde вместо at-main, у amazon.co.uk — at-acbuk и так далее. Для каждой площадки нужна отдельная сессия.
Шаг 2: Собираем запрос и парсим HTML отзывов через BeautifulSoup
URL отзывов Amazon выглядит так:
https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1
Основная функция:
from bs4 import BeautifulSoup
import time, random
def get_soup(session, url):
time.sleep(random.uniform(2, 5)) # Вежливая пауза
response = session.get(url, timeout=15)
# Детектируем экран входа
if "ap_email" in response.text or "Amazon Sign-In" in response.text:
raise Exception("Обнаружен экран входа — обновите cookies")
if response.status_code != 200:
raise Exception(f"HTTP {response.status_code}")
return BeautifulSoup(response.text, "lxml")
Есть простой приём, который помогает: перед страницей отзывов сначала откройте страницу товара. Это создаёт более естественный паттерн поведения для сессии.
# Сначала открываем страницу товара (как обычный браузинг)
product_url = f"https://www.amazon.com/dp/{asin}"
session.get(product_url, timeout=15)
time.sleep(random.uniform(1, 3))
# Затем идём на страницу отзывов
reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
soup = get_soup(session, reviews_url)
Шаг 3: Используйте стабильные селекторы для извлечения данных из отзывов (не полагайтесь на CSS-классы)
Именно здесь ломается большинство туториалов 2022–2023 годов. Amazon обфусцирует названия CSS-классов — они периодически меняются, и, как один раздражённый разработчик написал на форуме: «ни у одного из них не было общего шаблона в названиях классов у span-тегов».
Решение: в элементах отзывов Amazon использует атрибуты data-hook, и они удивительно стабильны. Это семантические идентификаторы, на которые опирается фронтенд Amazon, поэтому их не рандомизируют.
| Поле отзыва | Стабильный селектор (data-hook) | Хрупкий селектор (class) |
|---|---|---|
| Текст отзыва | [data-hook="review-body"] | .review-text-content (меняется) |
| Рейтинг в звёздах | [data-hook="review-star-rating"] | .a-icon-alt (неоднозначный) |
| Заголовок отзыва | [data-hook="review-title"] | .review-title (иногда) |
| Имя автора | span.a-profile-name | Относительно стабилен |
| Дата отзыва | [data-hook="review-date"] | .review-date (зависит от региона) |
| Подтверждённая покупка | [data-hook="avp-badge"] | span.a-size-mini |
Код извлечения с помощью селекторов data-hook:
import re
def extract_reviews(soup):
reviews = []
review_divs = soup.select('[data-hook="review"]')
for div in review_divs:
# Рейтинг в звёздах
rating_el = div.select_one('[data-hook="review-star-rating"]')
rating = None
if rating_el:
rating_text = rating_el.get_text(strip=True)
match = re.search(r'(\d\.?\d?)', rating_text)
if match:
rating = float(match.group(1))
# Заголовок
title_el = div.select_one('[data-hook="review-title"]')
title = title_el.get_text(strip=True) if title_el else ""
# Текст
body_el = div.select_one('[data-hook="review-body"]')
body = body_el.get_text(strip=True) if body_el else ""
# Автор
author_el = div.select_one('span.a-profile-name')
author = author_el.get_text(strip=True) if author_el else ""
# Дата и страна
date_el = div.select_one('[data-hook="review-date"]')
date_text = date_el.get_text(strip=True) if date_el else ""
# Формат: "Reviewed in the United States on January 15, 2025"
country_match = re.search(r'Reviewed in (.+?) on', date_text)
date_match = re.search(r'on (.+)$', date_text)
country = country_match.group(1) if country_match else ""
date = date_match.group(1) if date_match else ""
# Подтверждённая покупка
verified_el = div.select_one('[data-hook="avp-badge"]')
verified = bool(verified_el)
reviews.append({
"author": author,
"rating": rating,
"title": title,
"content": body,
"date": date,
"country": country,
"verified": verified,
})
return reviews
Я уже несколько месяцев запускаю этот набор селекторов на разных ASIN, и атрибуты data-hook ни разу не менялись. А вот CSS-классы за тот же период менялись как минимум дважды.
Шаг 4: Пагинация и лимит Amazon на 10 страниц
Amazon ограничивает параметр pageNumber десятью страницами по 10 отзывов на каждой — это жёсткий потолок примерно в 100 отзывов на одну комбинацию фильтров. Кнопка «Next page» просто исчезает после 10-й страницы.
Базовый цикл пагинации:
all_reviews = []
for page in range(1, 11):
url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break # На этой странице больше нет отзывов
all_reviews.extend(page_reviews)
print(f"Страница {page}: {len(page_reviews)} отзывов")
Как получить больше 10 страниц отзывов Amazon
Обходной путь — разбиение по фильтрам. Каждая комбинация filterByStar и sortBy получает своё независимое окно в 10 страниц.
Значения звёздных фильтров: one_star, two_star, three_star, four_star, five_star
Значения сортировки: recent, helpful (по умолчанию)
Если объединить все 5 фильтров по звёздам × 2 варианта сортировки, можно получить до 100 страниц, то есть до 1 000 отзывов на товар — а для товаров с неравномерным распределением оценок часто удаётся приблизиться почти к полному набору.
star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
sort_orders = ["recent", "helpful"]
all_reviews = []
seen_titles = set() # Простая дедупликация
for star in star_filters:
for sort in sort_orders:
for page in range(1, 11):
url = (
f"https://www.amazon.com/product-reviews/{asin}"
f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
)
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break
for review in page_reviews:
# Убираем дубликаты по связке заголовок + автор
key = (review["title"], review["author"])
if key not in seen_titles:
seen_titles.add(key)
all_reviews.append(review)
print(f"[{star}/{sort}] Страница {page}: {len(page_reviews)} отзывов")
print(f"Всего уникальных отзывов: {len(all_reviews)}")
Пересечения между блоками неизбежны, поэтому дедупликация обязательна. Я обычно использую комбинацию заголовка отзыва и имени автора как быстрый ключ — не идеально, но так отсекается подавляющее большинство дублей.
Шаг 5: Обходите антибот-защиту (ротация, троттлинг, повторные попытки)
Amazon использует AWS WAF Bot Control, и он стал заметно агрессивнее. Однослойные меры защиты — просто менять User-Agent или просто добавлять задержки — уже не спасают.
| Техника | Реализация |
|---|---|
| Ротация User-Agent | Случайный выбор из 10+ реальных строк браузеров |
| Экспоненциальный backoff | Задержки повторов 2с → 4с → 8с при 503 |
| Троттлинг запросов | random.uniform(2, 5) секунд между страницами |
| Ротация прокси | Циклический обход residential-прокси |
| Отпечаток сессии | Согласованные cookies + headers для одной сессии |
| TLS-имперсонация | Используйте curl_cffi вместо стандартного requests в продакшене |
Готовая к продакшену обёртка с повторами:
import time, random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 15_7_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
]
def scrape_with_retries(session, url, max_retries=3):
for attempt in range(max_retries):
try:
session.headers["User-Agent"] = random.choice(USER_AGENTS)
time.sleep(random.uniform(2, 5))
response = session.get(url, timeout=15)
# Детектируем блокировки
if "validateCaptcha" in response.url or "Robot Check" in response.text:
wait = (2 ** attempt) * 5
print(f"Обнаружена CAPTCHA. Ждём {wait}с...")
time.sleep(wait)
continue
if response.status_code in (429, 503):
wait = (2 ** attempt) * 2
print(f"Сработало ограничение частоты ({response.status_code}). Ждём {wait}с...")
time.sleep(wait)
continue
if "ap_email" in response.text:
raise Exception("Экран входа — cookies истекли")
return BeautifulSoup(response.text, "lxml")
except Exception as e:
if attempt == max_retries - 1:
raise
print(f"Попытка {attempt + 1} не удалась: {e}")
return None
Небольшая заметка о прокси: Amazon блокирует известные диапазоны datacenter-IP на сетевом уровне — AWS, GCP, Azure, DigitalOcean. Если вы скрапите больше нескольких сотен страниц, residential-прокси практически обязательны — закладывайте $50–200+ в месяц в зависимости от объёма. Для небольших проектов (до 100 запросов в день) аккуратного троттлинга с домашнего IP обычно достаточно.
Amazon также проверяет TLS-отпечатки. Стандартная библиотека Python requests имеет известный JA3-хэш, который WAF может блокировать заранее. Для продакшен-скраперов стоит рассмотреть curl_cffi, который имитирует TLS-стек реального браузера. Для учебного уровня скрапинга (несколько сотен страниц) обычно достаточно requests с хорошими заголовками.
Шаг 6: Экспортируйте собранные отзывы Amazon в CSV или Excel
Когда отзывы собраны, превратить их в удобный формат проще всего через pandas:
import pandas as pd
df = pd.DataFrame(all_reviews)
df.to_csv("amazon_reviews.csv", index=False)
print(f"Экспортировано {len(df)} отзывов в amazon_reviews.csv")
Пример результата:
| author | rating | title | content | date | country | verified |
|---|---|---|---|---|---|---|
| Sarah M. | 5.0 | Лучшая покупка года | Battery lasts all day, screen is gorgeous... | January 15, 2025 | the United States | True |
| Mike T. | 2.0 | Разочарован через 2 недели | The charging port stopped working... | February 3, 2025 | the United States | True |
| Priya K. | 4.0 | Отличное соотношение цены и качества | Does everything I need, minor lag on heavy apps... | March 10, 2025 | the United States | False |
Для экспорта в Excel: df.to_excel("amazon_reviews.xlsx", index=False) (нужен openpyxl).
Для Google Sheets библиотека gspread работает, но требует 8+ шагов настройки Google Cloud — создание проекта, включение двух API, генерация service account credentials, расшаривание таблицы. Если кажется, что это больше настройки, чем сам скрапинг, вам не кажется. (Вот как раз тот случай, когда инструмент вроде Thunderbit, который экспортирует в Google Sheets одним кликом, начинает выглядеть очень привлекательно.)
Бонус: добавьте анализ тональности к отзывам всего в 5 строках Python
Большинство туториалов по скрапингу заканчиваются на экспорте в CSV. Но именно оценка тональности превращает сырые данные в бизнес-решения.
Самый быстрый базовый вариант — TextBlob:
from textblob import TextBlob
df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
Это даёт каждому отзыву score полярности от -1.0 (очень негативно) до +1.0 (очень позитивно). Пример результата:
| content (сокращённо) | rating | sentiment |
|---|---|---|
| "Battery lasts all day, screen is gorgeous..." | 5.0 | 0.65 |
| "The charging port stopped working after..." | 2.0 | -0.40 |
| "Does everything I need, minor lag on..." | 4.0 | 0.25 |
| "Absolute garbage. Returned immediately." | 1.0 | -0.75 |
| "It's okay. Nothing special but works." | 3.0 | 0.10 |
Самые интересные строки — это расхождения: 3-звёздочный отзыв с позитивным текстом или 5-звёздочный отзыв с негативной лексикой. Такие случаи часто раскрывают более тонкое мнение клиента, которое не видно только по звёздам.

Для более точного анализа в продакшене я рекомендую Hugging Face Transformers. VADER обучали на твитах, а не на товарных отзывах, а transformer-модели достигают более 98% точности в классификации отзывов по сравнению с лексиконными инструментами. Модель nlptown/bert-base-multilingual-uncased-sentiment даже предсказывает рейтинг от 1 до 5 звёзд напрямую:
from transformers import pipeline
clf = pipeline("sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment")
df["predicted_stars"] = df["content"].apply(
lambda x: int(clf(str(x)[:512])[0]["label"][0])
)
Отзывы Amazon имеют J-образное распределение — большой пик на 5 звёздах, меньший пик на 1 звезде и провал посередине. Это значит, что средний рейтинг часто плохо отражает реальное качество товара. Лучше выделять кластер 1-звёздочных отзывов и искать повторяющиеся темы — обычно именно там спрятана одна исправимая проблема.
Честный компромисс: Python своими руками vs. платные API vs. Thunderbit
Я поддерживал Python-скраперы для Amazon и скажу честно: они ломаются. Селекторы меняются, cookies истекают, Amazon выкатывает новый слой антибот-защиты, и внезапно ваша суббота уходит на отладку скрапера, а не на анализ данных. Участники форумов описывают то же самое — скрипты, которые «работали в прошлом месяце», теперь требуют постоянных патчей.
Вот как выглядят три основных подхода:
| Критерий | DIY Python (BS4/Selenium) | Платный Scraping API | Thunderbit (без кода) |
|---|---|---|---|
| Время на запуск | 1–3 часа | 30 мин (API key) | 2 минуты |
| Стоимость | Бесплатно (+ прокси) | $50–200+/мес | Есть бесплатный тариф |
| Работа с экраном входа | Ручное управление cookies | Обычно уже решено | Обрабатывается автоматически |
| Поддержка | Высокая нагрузка (селекторы ломаются) | Низкая (провайдер поддерживает) | Нулевая (AI адаптируется) |
| Пагинация | Нужен свой код | Встроено | Встроено |
| Поддержка нескольких стран | Отдельные сессии на каждый домен | Обычно поддерживается | Через браузер = ваш локальный регион |
| Анализ тональности | Нужно писать свой код | Иногда включён | Экспортируйте в Sheets и анализируйте где удобно |
| Лучше всего для | Обучения, полного контроля | Масштабных продакшен-пайплайнов | Быстрых выгрузок, не-IT команд |
Python даёт полный контроль и действительно лучший способ понять, как веб-скрапинг работает изнутри. Но если ваш сценарий звучит как «мне нужен файл с отзывами конкурента в таблице к пятнице», а не «я хочу построить продакшен-пайплайн данных», то цена поддержки собственного скрапера может оказаться слишком высокой.
Thunderbit берёт на себя авторизацию, селекторы, пагинацию и экспорт в несколько кликов — попробуйте бесплатный тариф и посмотрите, подходит ли он под ваш сценарий. По мере того как Amazon усиливает антибот-защиту, AI-инструменты, которые адаптируются в реальном времени, будут становиться не просто удобством, а необходимостью.
Также вы можете посмотреть наш YouTube-канал Thunderbit с видеоразборами рабочих процессов скрапинга.
Как скрапить отзывы Amazon через Thunderbit без кода и без поддержки
Мы создали Thunderbit именно для тех случаев, когда поддерживать Python-скрапер кажется избыточным. Рабочий процесс выглядит так:
- Установите расширение Thunderbit для Chrome
- Откройте страницу отзывов товара Amazon в браузере (вы уже авторизованы, так что экран входа не проблема)
- Нажмите "AI Suggest Fields" — Thunderbit читает страницу и предлагает поля вроде Author, Rating, Title, Review Text, Date, Verified Purchase
- Нажмите "Scrape" — данные извлекаются мгновенно, с встроенной пагинацией
- Экспортируйте в Excel, Google Sheets, Airtable или Notion
Главное преимущество в том, что AI в Thunderbit каждый раз читает структуру страницы заново. Никаких CSS-селекторов для поддержки, никаких cookies, никакого антибот-кода. Когда Amazon меняет HTML, AI подстраивается. Для читателей, которым нужен программный доступ без полной ручной разработки, Thunderbit также предлагает Extract API — структурированное извлечение данных через API с AI-определением полей и без поддержки селекторов.
Для более глубокого изучения данных Amazon см. наши руководства по скрапингу товаров и отзывов Amazon и извлечению и анализу данных о продажах Amazon.
Советы по масштабному скрапингу отзывов Amazon на Python
Если вы собираете отзывы по многим ASIN, несколько практик сильно сэкономят вам нервы:
- Обрабатывайте ASIN пакетами с паузами между товарами, а не только между страницами. Я использую задержки 10–15 секунд между ASIN.
- Жёстко дедуплицируйте. При объединении нескольких комбинаций звёздных фильтров и сортировок будут пересечения. Используйте набор кортежей
(title, author, date)как ключ дедупликации. - Логируйте ошибки. Отслеживайте, какие комбинации ASIN + page + filter не сработали, чтобы можно было повторить их без полного перескана.
- Для больших проектов храните данные в базе. Простая SQLite-база масштабируется намного лучше, чем растущие CSV-файлы:
import sqlite3
conn = sqlite3.connect("reviews.db")
df.to_sql("reviews", conn, if_exists="append", index=False)
- Запускайте регулярный скрапинг по расписанию. Для постоянного мониторинга настройте cron job или используйте функцию Thunderbit Scheduled Scraper — задайте URL и расписание, а всё остальное он сделает без сервера.
Дополнительные подходы мы разбираем в статьях о лучших автоматизированных инструментах веб-скрапинга и о том, как выгружать данные с сайтов в Excel.
Коротко о юридических и этических аспектах
Условия использования Amazon прямо запрещают «использование любого робота, паука, скрапера или других автоматизированных средств для доступа к Amazon Services». При этом недавняя судебная практика в США стала скорее благоприятной для скрапинга публичных данных. В деле Meta Platforms v. Bright Data (январь 2024) федеральный суд постановил, что скрапинг общедоступных данных не нарушает условия использования, если скрапер не является авторизованным "пользователем".
Нюанс в том, что скрапинг за логином, о котором и идёт речь в этом руководстве, уже попадает в область договорного права, поскольку при создании аккаунта вы соглашались с ToS Amazon. Скрапинг публично доступных featured reviews несёт меньше юридических рисков, чем сбор данных через экран входа.
Практические рекомендации: не распространяйте собранные данные в коммерческих целях, не собирайте личные данные пользователей сверх того, что уже публично отображается, соблюдайте robots.txt и при крупном или коммерческом использовании консультируйтесь с юристом. Это не юридическая консультация. Подробнее о правовом поле читайте в нашем обзоре юридических аспектов веб-скрапинга.
Заключение: скрапить отзывы Amazon на Python или сразу обойтись без кода
Кратко подведём итоги того, что разобрали в этом гайде:
- Экран входа реален, но его можно обойти с помощью авторизации через cookies — скопируйте 7 cookies из браузера и подставьте их в
requests.Session() - Используйте селекторы
data-hook, а не CSS-классы, если не хотите, чтобы код ломался каждые несколько недель - Комбинируйте звёздные фильтры и сортировки, чтобы обойти лимит в 10 страниц и получать 500+ отзывов на товар
- Добавьте анализ тональности через TextBlob для быстрого базового варианта или Hugging Face Transformers для более точного продакшен-решения
- Поддерживайте антибот-защиту: троттлинг, ротацию User-Agent, экспоненциальный backoff и residential-прокси при больших объёмах
Python даёт полный контроль и лучше всего помогает понять, что происходит внутри. Но если ваш сценарий звучит как «мне нужна таблица с отзывами конкурента к пятнице», а не «я строю продакшен-пайплайн данных», то нагрузка по поддержке собственного скрапера может не окупиться.
Thunderbit берёт на себя авторизацию, селекторы, пагинацию и экспорт в несколько кликов — попробуйте бесплатный тариф и посмотрите, вписывается ли он в ваш рабочий процесс. По мере того как Amazon продолжает ужесточать антибот-защиту, AI-инструменты, которые адаптируются в реальном времени, будут переходить из категории «приятный бонус» в категорию «необходимость».
Также можете посмотреть наш YouTube-канал Thunderbit с видеоразборами рабочих сценариев скрапинга.
FAQ
1. Можно ли скрапить отзывы Amazon без входа в аккаунт?
Да, но только примерно 8 "featured reviews", которые отображаются на странице товара (/dp/{ASIN}/). Полные страницы отзывов с сортировкой, фильтрацией и пагинацией с конца 2024 года требуют авторизации. Для большинства бизнес-сценариев экран входа придётся обходить.
2. Законно ли скрапить отзывы Amazon?
Условия использования Amazon запрещают автоматический скрапинг. Однако недавняя судебная практика в США (Meta v. Bright Data, 2024; hiQ v. LinkedIn) поддерживает скрапинг общедоступных данных. Скрапинг за логином несёт более высокий юридический риск, так как вы соглашались с ToS Amazon. Для коммерческого использования консультируйтесь с юристом.
3. Сколько отзывов Amazon можно скрапить по одному товару?
Amazon ограничивает страницы отзывов 10 страницами для каждой комбинации сортировки и звёздного фильтра. Используя все 5 звёздных фильтров × 2 варианта сортировки, можно получить до 100 страниц — примерно 1 000 отзывов на товар. С фильтрами по ключевым словам теоретический потолок выше, но и дублей там заметно больше.
4. Какая Python-библиотека лучше всего подходит для скрапинга отзывов Amazon?
Самая распространённая и надёжная связка — requests + BeautifulSoup для разбора статичного HTML. Selenium полезен, когда требуется рендеринг JavaScript. Если нужен no-code вариант, который автоматически обходит экран входа и пагинацию, попробуйте Thunderbit.
5. Как не получить блокировку при скрапинге Amazon?
Чередуйте User-Agent из пула из 10+ реальных строк браузеров, добавляйте случайные задержки 2–5 секунд между запросами, используйте exponential backoff при ошибках 503/429, применяйте residential-прокси на масштабе (datacenter-IP уже заранее блокируются) и сохраняйте единые cookies между запросами. Если нужен полностью беспроблемный вариант, Thunderbit автоматически обходит антибот-защиту через ваш браузерный сеанс.
Подробнее


