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

Amazon хранит больше данных о товарах, чем любая отдельная исследовательская команда способна собрать вручную. Цены меняются каждый час. Отзывы накапливаются тысячами. Если вы хотите отслеживать конкурентов, обучать модель анализа тональности или создать инструмент оповещений о ценах, вам потребуется способ автоматически извлекать эти данные.
Это руководство охватывает обе стороны задачи: парсинг текущих цен и отзывов с использованием только Python, Requests и BeautifulSoup. Для большей части задач headless-браузер не требуется.
By the end, you will have a working scraper that pulls product details and review data, handles pagination, retries failed requests, and exports everything to CSV. We will also cover why raw HTTP requests get blocked on Amazon, and what actually fixes that. If you need a beginner’s guide, check out our Amazon scraping tutorial.
Используемые технологии: requests для HTTP-запросов, BeautifulSoup и lxml для парсинга, а pandas для экспорта чистых наборов данных.
Большинство руководств по скрапингу Amazon выбирают одну сторону. Они либо сосредотачиваются на ценах и относятся к отзывам как ко второстепенному, либо углубляются в текст отзывов и полностью пропускают ценообразование. Такое разделение не соответствует тому, как данные используются на самом деле. Набор данных о ценах без контекста отзывов говорит вам, сколько стоят товары, но не почему покупатели выбирают одно предложение вместо другого. В этом руководстве оба аспекта рассматриваются как одинаково важные, с отдельными шагами, отдельным кодом и отдельным решением проблем для каждого.
Зачем парсить отзывы и цены товаров на Amazon?
Страницы товаров на Amazon — один из самых богатых источников публичных данных в интернете. Одна карточка товара сообщает вам цену, историю скидок, на которую намекает перечёркнутая стоимость, рейтинг в звёздах и мнение реальных покупателей.
Вот где эти данные действительно находят применение.
- Ценообразование в электронной коммерции. Продавцы отслеживают цены конкурентов, чтобы удерживать позиции в Buy Box.
- Мониторинг конкурентов. Бренды следят за тем, как конкуренты устанавливают цены и позиционируют похожие продукты.
- Инструменты отслеживания цен. Сайты со скидками и браузерные расширения полагаются на исторические данные о ценах.
- Анализ тональности. Отзывы показывают, на что клиенты действительно жалуются, а не то, что заявляет маркетинговый текст.
- Исследование рынка. Данные об отзывах и ценах по всей категории раскрывают тренды спроса раньше, чем они проявятся в отчетах о продажах.
- Наборы данных для обучения AI. Структурированный текст товаров и отзывов полезен для построения рекомендательных моделей и наборов данных для NLP.
Цены и отзывы отвечают на разные вопросы. Данные о ценах говорят о том, сколько рынок готов платить. Данные об отзывах говорят о том, почему клиенты покупают или почему они возвращают товар. Обычно вам нужно и то, и другое, чтобы получить полную картину.
Возьмём продавца, который отслеживает товар конкурента. Цена подсказывает ему, установил ли он слишком низкую или слишком высокую стоимость на этой неделе. Отзывы показывают, выигрывает ли конкурент за счёт качества, скорости доставки или упаковки, а ничего из этого не видно в одной только выгрузке цен.
Соберите оба набора данных, и вы получите более полное представление о том, почему то или иное объявление опережает ваше.
Какие данные Amazon можно извлечь?
Давайте разделим это на два набора данных. Каждый из них соответствует своей части страницы товара.
Данные о товаре
| Поле | Описание |
| Заголовок | Полное название товара |
| Текущая цена | Цена, которая показывается покупателю прямо сейчас |
| Первоначальная цена | Цена по прейскуранту до скидки, если указана |
| Скидка | Процент скидки, рассчитанный или полученный парсингом напрямую |
| Рейтинг | Средний рейтинг в звёздах из 5 |
| Количество отзывов | Общее количество оценок |
| наличие | В наличии, ограниченный запас или недоступно |
| Бренд | Название производителя или магазина |
| ASIN | Уникальный идентификатор товара Amazon |
Данные отзывов
| Поле | Описание |
| Автор | Отображаемое имя автора отзыва |
| Заголовок отзыва | Короткий заголовок, который написал автор отзыва |
| Текст отзыва | Полный текст отзыва |
| Рейтинг | Оценка в звёздах, которую поставил рецензент |
| Подтверждённая покупка | Подтвердил ли Amazon, что покупатель приобрёл товар |
| Дата отзыва | Дата публикации отзыва |
| Изображения | URL-адреса всех фотографий, прикреплённых к отзыву |
Оба набора данных используют один общий ключ — ASIN. Именно это позволит вам позже объединить данные о товарах и отзывах в pandas.
Типичные сложности при парсинге Amazon
Amazon — один из самых сложных сайтов для надежного парсинга, и со временем сложность только выросла. Вот с чем вы столкнётесь.
Изменение структуры HTML
Amazon постоянно проводит A/B-тесты вёрстки. Селектор, который работает сегодня, на следующей неделе может не вернуть ничего. Проектируйте свой скрапер так, чтобы он падал явно, а не молча, когда поле возвращается пустым.
Быстрая проверка на здравый смысл, например подтверждение того, что поле заголовка не пустое перед сохранением строки, отлавливает большинство таких сбоев ещё до того, как они засорят ваш набор данных.
CAPTCHA и проверки на робота
Когда Amazon помечает запрос как автоматический, он подменяет страницу товара страницей «Robot Check». Хитрость в том, что эта страница по-прежнему возвращает HTTP 200. Ваш скрипт решит, что запрос выполнен успешно, а затем не найдёт в HTML ни заголовка, ни цены, ни отзывов. Именно поэтому одной проверки кода статуса недостаточно. Также необходимо убедиться, что содержимое действительно соответствует реальной странице товара.
Ответы HTTP 403 и 503
Ошибка 403 обычно означает, что ваш запрос был отклонён сразу, часто из-за отсутствующего или подозрительного заголовка. Ошибка 503 означает, что сервер отказывается отдавать страницу, иногда как мягкий сигнал ограничения частоты запросов, а не как жёсткая блокировка. Если в логике повторных попыток вы обрабатываете эти два случая по-разному, а не сваливаете все ответы, отличные от 200, в одну кучу, вы получаете более чёткую картину того, что на самом деле идёт не так.
Ограничения частоты запросов и репутация IP
Отправьте слишком много запросов слишком быстро с одного IP, и Amazon начнёт ограничивать или блокировать вас. История IP тоже имеет значение. резидентный IP который никогда не отправлял странных запросов, вызывает больше доверия, чем IP из дата-центра с историей парсинга.
Системы Amazon теперь оценивают несколько сигналов в совокупности, включая скорость запросов, согласованность заголовков и модели поведения при просмотре, а не полагаются на какой-либо один триггер для пометки сессии.
Динамическое и региональное ценообразование
Цены меняются в зависимости от наличия на складе, времени суток и даже предполагаемого местоположения покупателя. Цена, которую вы соберёте с IP из США, может отличаться от той, что увидит IP из Великобритании на том же объявлении. Если ваш сценарий использования зависит от точных по регионам цен, это не мелочь. Это может незаметно исказить весь набор данных о ценах, если вы не контролируете, откуда, по видимости, исходят ваши запросы.
Настройка проекта
Давайте установим всё необходимое. Откройте терминал и выполните:
Вот почему каждый из них включён в стек:
- requests: отправляет HTTP-запросы и обрабатывает заголовки, cookie и сессии.
- beautifulsoup4: разбирает HTML в дерево с возможностью поиска, чтобы вы могли извлекать конкретные теги и атрибуты.
- lxml: быстрый движок парсинга, который BeautifulSoup использует под капотом. На больших страницах он заметно быстрее стандартного парсера Python.
- pandas: превращает собранные словари и списки в аккуратные таблицы, а затем экспортирует их в CSV.
Создайте папку проекта с двумя файлами: scraper.py для логики и пустой output/ папка для ваших экспортов в CSV.
Шаг 1. Найдите ASIN товара
У каждого товара на Amazon есть ASIN (Amazon Standard Identification Number). Это 10-символьный код, который уникально идентифицирует товарную позицию независимо от URL-слага или домена маркетплейса.
Вы можете заметить его в URL сразу после /dp/ или /gp/product/:
Небольшая вспомогательная функция извлекает его с помощью регулярного выражения:
Получив ASIN, вы можете заново собрать чистый канонический URL как для страницы товара, так и для страницы отзывов, что позволяет избежать проблем с параметрами отслеживания, засоряющими ваши запросы.
Шаг 2. Отправьте запрос на Amazon
Пустой requests.get(url) запрос почти всегда завершится неудачей на Amazon. Вам нужны заголовки, напоминающие настоящий браузер, тайм-аут, чтобы застрявший запрос не подвешивал ваш скрипт навсегда, и стратегия повторных попыток для запросов, которые все равно завершаются неудачей.
Заголовки, которые имеют значение
Самый важный заголовок User-Agent. Без него Amazon может за миллисекунды определить, что запрос исходит от скрипта. Accept-Language и Принять дополняют набор заголовков, который выглядит ближе к реальной вкладке браузера.
Тайм-ауты и стратегия повторных попыток
Запрос без тайм-аута может зависнуть на неопределённое время, если сервер перестаёт отвечать. Цикл повторных попыток с задержкой обрабатывает временные сбои вроде ошибок 503, не перегружая сервер.
Обратите внимание на случайный джиттер, добавленный к задержке. Фиксированный шаблон задержки сам по себе является сигналом бота. Небольшая рандомизация усложняет фингерпринтинг вашего трафика.
Шаг 3. Парсинг цен и информации о товарах
Когда у вас на руках есть корректный HTML-ответ, пора его разобрать. Amazon оборачивает большинство данных о товаре в предсказуемые ID элементов, хотя имена классов меняются чаще.
Несколько замечаний о селекторах:
- Цена разбита на два тега span, целое число и дробную часть. Amazon делает так, чтобы отображать центы более мелким шрифтом, чем доллары.
- Первоначальная цена отображается только при наличии активной скидки. Если селектор ничего не возвращает, воспринимайте это как «нет скидки», а не как ошибку.
- Текст рейтинга выглядит как «4.5 out of 5 stars». Разделение по «out of» надёжнее, чем попытка разобрать число напрямую, поскольку интервалы различаются.
Обратите внимание: if text_or_none(“#productTitle”) возвращается пустым, скорее всего вы попали на страницу Robot Check, а не столкнулись с отсутствующим полем. Всегда проверяйте, не является ли title null, прежде чем доверять остальным разобранным данным.
Сбор текущей цены — это лишь первый шаг. Чтобы отслеживать изменения цен со временем, ознакомьтесь с нашим руководством по созданию Отслеживание цен на Amazon который хранит историю цен и отправляет уведомления о снижении цены.
Шаг 4. Собираем отзывы о товарах на Amazon
Отзывы располагаются по отдельному шаблону URL, обычно /product-reviews/{ASIN}. Каждый отзыв находится внутри повторяющегося блока, что делает его хорошим кандидатом для цикла по совпавшим элементам.
Зона data-hook атрибуты здесь стабильнее, чем имена классов. Amazon использует их внутренне для аналитики, поэтому они, как правило, переживают изменения верстки лучше, чем CSS-классы.
Магазин image_urls пока в виде списка. Прямо перед экспортом мы преобразуем его в строку с разделителями-запятыми, поскольку ячейки CSV лучше работают с обычными строками, чем с вложенными списками.
Шаг 5. Обработка нескольких страниц отзывов
У популярного товара могут быть тысячи отзывов, распределённых по десяткам страниц. Вам нужна логика пагинации, задержка между запросами и чёткое условие остановки, чтобы парсер не работал бесконечно.
Здесь важны три момента:
- Условие остановки. Пустая страница отзывов означает, что вы дошли до конца, а не ошибку. Завершайте работу корректно, а не зацикливайтесь навсегда.
- Задержка между запросами. Случайная пауза в 2–5 секунд между страницами не даёт вашему паттерну запросов выглядеть механическим.
- Максимальный лимит страниц. Даже для чрезвычайно популярного товара не нужны абсолютно все отзывы. Ограничение разумным числом, например 20 страницами, делает время выполнения предсказуемым.
Шаг 6. Экспортируйте всё в CSV
Pandas делает этап экспорта почти тривиальным. Преобразуйте ваши списки словарей в DataFrame, очистите столбец с изображениями отзывов и запишите в CSV.
Объединенный файл полезен, когда вы хотите, чтобы контекст товара находился рядом с каждым отдельным отзывом, например при обучении модели анализа тональности, которой также нужно знать ценовую категорию рецензируемого товара.
Полный скрапер на Python
Вот всё, что мы собрали в единый скрипт. Сохраните его как scraper.py и запустите его напрямую.
Важное замечание
Amazon часто обновляет свою HTML-структуру, CSS-селекторы и механизмы защиты от ботов. Пример в это руководство демонстрирует общий рабочий процесс скрейпинга, но отдельные селекторы или шаблоны запросов со временем могут потребовать обновления. Если ваш скрапер начинает возвращать пустые результаты или пропущенные поля, изучите исходный код последней страницы, скорректируйте селекторы и убедитесь, что Amazon не выдал страницу CAPTCHA или Robot Check вместо запрошенного содержимого.
Распространённые ошибки и их устранение
Веб-скрапинг не является разовым внедрением. Amazon регулярно меняет макет своих страниц, экспериментирует с A/B-тестированием и усиливает защиту от ботов. Даже скрапер, который работает сегодня, в будущем может потребовать незначительного обновления селекторов.
| Симптом | Вероятная причина | Исправить |
| HTTP 403 | Отсутствующие или подозрительные заголовки | Добавьте реалистичный заголовок User-Agent и Accept-Language |
| HTTP 503 | Мягкое ограничение частоты запросов или перегруженный маршрут | Отступайте с джиттером, снижайте частоту запросов |
| Страница загружается, но поля пустые | страница проверки Robot Check, а не реальное объявление | Проверьте на пустой заголовок, смените IP, добавьте прокси |
| Пропавшие селекторы после недель стабильного парсинга | Amazon изменил вёрстку в рамках A/B-теста | Повторно проанализируйте страницу, обновите селекторы, добавьте резервные селекторы |
| Пустой HTML-ответ | Соединение было разорвано или заблокировано в процессе запроса | Оборачивайте запросы в try/except и повторяйте попытку с новой сессией |
| Цены отличаются от того, что вы видите в браузере | Региональные цены, привязанные к местоположению по IP | Используйте прокси, расположенные в целевой стране |
| Число отзывов перестаёт расти после нескольких страниц | Достигнут лимит max_pages, либо отзывы действительно закончились | Проверьте, не пуст ли разобранный список, прежде чем предполагать наличие бага |
Как масштабировать скрапинг Amazon
Скрипт, который работает для одного товара на вашем ноутбуке, ведёт себя совсем иначе при 10 000 товаров в день. Масштабирование означает решение задачи объёма без срабатывания защитных механизмов Amazon.
ротационные IP-адреса
Каждый запрос с одного и того же IP повышает показатель риска этого IP. Ротация через большой пул IP распределяет объём ваших запросов, так что ни один отдельный адрес не выглядит подозрительно.
Sticky-сессии
Ротация нужна не всегда. Постраничный просмотр отзывов по одному товару удобнее выполнять с одного стабильного IP на протяжении всей сессии, поскольку смена IP посреди сессии сама по себе может выглядеть неестественно.
Настоящие заголовки браузера
Держите набор заголовков актуальным. Версии браузеров в строках User-Agent быстро устаревают, и устаревшая сразу бросается в глаза.
Случайные задержки и логика повторных попыток
Джиттер и экспоненциальную задержку мы уже рассмотрели. При работе в больших масштабах применяйте ту же логику ко всей очереди запросов, а не только к страницам отзывов одного товара.
Параллельный скрейпинг и сохранение сессии
Параллельное выполнение запросов ускоряет процесс, но каждому рабочему потоку или процессу нужна своя сессия и, в идеале, свой собственный IP. Использование общих сессий несколькими параллельными воркерами часто становится причиной случайного срабатывания ограничений по частоте запросов.
Именно здесь прокси-инфраструктура становится менее опциональной. IP из дата-центра, выполняющий тысячи запросов в день, получает флаг быстро, каким бы качественным ни были ваши заголовки и логика повторных попыток.
Резидентские прокси направляйте свой трафик через реальные домашние IP-адреса, у которых показатель риска в системе обнаружения ботов Amazon намного ниже, чем у серверных IP.
Мобильные прокси идут ещё дальше в работе с самыми сложными целями, такими как страницы профилей продавцов или результаты поиска с географической привязкой, поскольку мобильные IP используются тысячами реальных телефонов и редко блокируются целиком.
Код скрапера остаётся абсолютно одинаковым в обоих случаях. Меняется только то, какой IP-адрес стоит за requests.Session обычно настраивается через словарь proxies, передаваемый в каждый запрос. Это небольшое изменение в коде ради существенного скачка в надёжности при работе в масштабе.
Почему стоит использовать NodeMaven для парсинга Amazon?
Всё, о чём говорилось в предыдущем разделе, ведёт к одному и тому же выводу. Ваш код может быть безупречным, но вас всё равно заблокируют, если ваш IP выглядит неправильно. NodeMaven создан для решения именно этой задачи.
Геотаргетинг. Таргетируйтесь по стране, городу или ZIP-коду, что важно, когда нужно увидеть точную цену, которую увидел бы покупатель в конкретном регионе.

Устойчивые сессии (sticky sessions). Сохраняйте один и тот же IP столько, сколько требуется задаче по постраничному сбору отзывов, а затем меняйте его для следующего товара.
Фильтрация по качеству IP. Каждый IP проверяется перед тем, как попасть к вам, что снижает количество нерабочих или уже заблокированных адресов, которыми изобилуют более дешёвые пулы прокси.
Ничто из этого не заменяет грамотную архитектуру скрапера. Логика повторных попыток, заголовки и темп запросов по-прежнему важны. Но именно сочетание надёжного кода с пулом прокси, созданным для парсинга, превращает скрипт, который работает пару часов, в тот, что стабильно работает каждый день.





