Результаты поиска Amazon, один из самых насыщенных публичных наборов данных в розничной торговле. Каждый запрос возвращает ранжированную сетку товаров с названиями, ценами, звёздными рейтингами, количеством отзывов, ASIN и ссылками на страницы каждого товара. Эти данные используются для отслеживания конкурентных цен, исследования каталогов, анализа спроса и изучения ассортимента. Сложность в том, что Amazon отрисовывает эти товары с помощью JavaScript и активно защищается от автоматизированного трафика, поэтому обычный HTTP-запрос возвращает практически пустую оболочку вместо искомых товаров.
Это руководство показывает, как надёжно парсить страницы поиска Amazon с помощью Python. Вы создадите небольшой, готовый к запуску скрапер, который получает отрисованную страницу результатов поиска через Crawling API, разбирает каждую карточку товара в чистую запись, обрабатывает постраничный обход и экспортирует данные в JSON и CSV. Всё руководство ограничено публичными данными поиска и товарных листингов, а раздел о законности в конце не является шаблонным, поэтому прочитайте его, прежде чем направить скрапер на реальные объёмы.
Что вы создадите
Скрипт на Python, который принимает поисковый запрос Amazon, получает отрисованную страницу результатов через Crawling API и извлекает структурированную запись по каждому товару. В качестве рабочего примера мы будем использовать поисковый запрос "games" и извлекать следующие поля из каждой карточки товара:
- Title название товара в том виде, в каком оно отображается на карточке поиска.
- Price указанная цена, показанная на карточке.
- Rating средняя оценка покупателей, например "4.5 out of 5 stars".
- ASIN десятисимвольный идентификатор товара Amazon для каждого листинга.
- Link URL страницы детальной информации о товаре.
Этот пост ограничен страницей результатов поиска (SERP). Если вы хотите перейти к конкретному товару, зная его ссылку или ASIN, соответствующие руководства по парсингу данных о товарах Amazon и парсингу по ASIN продолжают этот материал.
Почему обычный запрос не работает на Amazon
Если запросить URL поиска Amazon с помощью чистого HTTP-клиента, вы получите ответ со статусом 200 и почти без данных о товарах в теле. Против вас работают два фактора. Во-первых, Amazon загружает большую часть поисковой сетки на стороне клиента: начальный HTML является оболочкой, а результаты, фильтры и цены заполняются только после выполнения JavaScript и Ajax-запросов страницы в браузере. Во-вторых, Amazon быстро помечает автоматизированный трафик. IP-адреса дата-центров и паттерны запросов, не похожие на реальный браузер, проходят проверку CAPTCHA, ограничиваются по частоте или блокируются ещё до того, как доберутся до отрисованных листингов.
Таким образом, работающий скрапер Amazon требует двух вещей в одном запросе: браузера, который действительно отрисовывает страницу, и IP-адреса, который платформа воспринимает как реального покупателя. Можно собрать это самостоятельно с помощью headless-браузера и пула ротируемых резидентных прокси, но поддержка этой инфраструктуры занимает большую часть времени. Crawling API объединяет оба компонента в одном вызове: вы отправляете ему URL с JavaScript-токеном, он отрисовывает страницу за доверенным резидентным IP и возвращает готовые данные для разбора.
Crawlbase предлагает два типа токенов. Обычный токен (TCP) получает статический HTML; токен JavaScript (JS) сначала отрисовывает страницу в реальном браузере. Поисковая сетка Amazon работает на JavaScript, поэтому здесь нужен JS-токен. Использование обычного токена вернёт ту же пустую оболочку, что и простой запрос, и в ней не будет ничего полезного для разбора.
Предварительные требования
Прежде чем писать код, необходимо подготовить несколько вещей. Это не займёт много времени.
Базовые знания Python. Вы должны уметь писать и запускать скрипты на Python, а также устанавливать пакеты с помощью pip. Если вы новичок в языке, руководство по веб-скрапингу с Python охватывает основы, которые предполагает этот учебник.
Python 3.8 или выше. Проверьте версию командой python --version. Если Python не установлен, установите его с сайта python.org или через дистрибутив, например Anaconda.
Аккаунт Crawlbase и JS-токен. Зарегистрируйте бесплатный аккаунт, откройте панель управления и скопируйте токен JavaScript (JS). Бесплатный уровень включает до 20 000 запросов без привязки карты, и вы платите только за успешные запросы сверх этого лимита. Относитесь к токену как к паролю: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.
Настройка проекта
Создайте виртуальное окружение, чтобы зависимости проекта оставались изолированными, затем установите две библиотеки, необходимые скраперу.
python --version python -m venv amazon_env source amazon_env/bin/activate pip install crawlbase pandas
В Windows активируйте окружение командой amazon_env\Scripts\activate вместо строки с source. Две зависимости выполняют основную работу: crawlbase, официальный клиент без зависимостей для Crawling API, а pandas организует собранные записи и выводит их в CSV. Поскольку мы используем встроенный скрапер amazon-serp Crawling API, разобранные поля возвращаются в виде структурированного JSON, поэтому отдельный HTML-парсер, например BeautifulSoup, в этом посте не нужен.
Структура страницы поиска Amazon
Amazon предоставляет поиск через простой URL-паттерн. Запрос передаётся в параметре k:
https://www.amazon.com/s?k=games
Каждая страница поиска отображает сетку карточек товаров, по одной на листинг. Карточка содержит название, цену, звёздный рейтинг с количеством отзывов, изображение, ссылку на страницу детальной информации и ASIN товара. Amazon также размещает в начале и середине результатов спонсорские листинги, которые парсер помечает отдельно, чтобы вы могли сохранить или отбросить их. Под сеткой расположены элементы пагинации для перехода по страницам результатов одного и того же запроса. Данные есть, но загружаются они динамически, именно поэтому шаг с отрисовкой в следующем разделе важен.
Шаг 1: Получение отрисованной страницы поиска
Начните с получения готовой страницы. Импортируйте класс CrawlingAPI, инициализируйте его с помощью JS-токена, создайте URL поиска из запроса и запросите его с параметрами ожидания, позволяющими динамическому содержимому загрузиться. Проверка кода статуса перед разбором делает сбои явными, а не скрытыми.
from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def crawl(page_url): options = {"page_wait": 2000, "ajax_wait": "true"} response = api.get(page_url, options) if response["status_code"] == 200: return response["body"].decode("latin1") print(f"Request failed: {response['status_code']}") return None if __name__ == "__main__": query = "games" search_url = f"https://www.amazon.com/s?k={query}" html = crawl(search_url) print(html[:500] if html else "No HTML returned")
Два параметра ожидания важны для цели, отрисовываемой на стороне клиента. ajax_wait указывает API ждать завершения асинхронных запросов перед захватом страницы, а page_wait удерживает фиксированное количество миллисекунд после загрузки, чтобы поздно отрисовываемая сетка появилась первой. Двух секунд достаточно для начала; увеличьте значение, если карточки возвращаются неполными. Тело декодируется как latin1, поскольку страницы Amazon содержат символы, при декодировании которых строгий UTF-8 может давать сбой. Запустите скрипт и вы должны увидеть реальную разметку товаров, а не пустую оболочку, которую возвращает простой запрос. Это подтверждает, что отрисовка работает, прежде чем вы попросите API что-либо разобрать.
Amazon требует отрисованной страницы за доверенным IP в одном вызове. Crawling API принимает JS-токен, запускает страницу в реальном браузере, ротирует резидентные IP на стороне сервера и передаёт вам готовый результат, так что вам не нужно самостоятельно запускать парк headless-браузеров и пул прокси. Начните с поискового запроса на бесплатном уровне.
Шаг 2: Разбор результатов с помощью скрапера amazon-serp
Можно получить отрисованный HTML и написать собственные селекторы, однако Crawling API поставляется со встроенными скраперами для популярных сайтов, включая Amazon. Передача опции scraper указывает API разобрать страницу на стороне сервера и вернуть структурированный JSON вместо необработанного HTML. Скрапер для страниц результатов поиска называется amazon-serp. Он возвращает массив товаров, каждый из которых содержит поля: name, price, customerReview, ASIN, image, link, а также блок пагинации.
Вот упрощённая структура одной записи товара от amazon-serp, чтобы вы знали, какие ключи читать:
{ "name": "Product Name", "price": "$19.99", "rawPrice": 19.99, "currency": "$", "offer": "Offer Details", "customerReview": "4.5 out of 5 stars", "customerReviewCount": "1,234", "asin": "B0XXXXXXXX", "image": "Product Image URL", "url": "Product URL", "isPrime": true, "sponsoredAd": false }
Добавьте опцию scraper в запрос, и тело ответа станет JSON. Разобранные данные находятся под ключом body, товары, под products, а рядом расположен блок pagination. Функция ниже извлекает пять интересующих нас полей по каждому товару, сопоставляя name с title, customerReview с rating и читая asin и url напрямую.
import json from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) options = { "page_wait": 2000, "ajax_wait": "true", "scraper": "amazon-serp", } def parse_products(scraper_result): products = scraper_result.get("products", []) results = [] for product in products: results.append({ "title": product.get("name", ""), "price": product.get("price", ""), "rating": product.get("customerReview", ""), "reviews": product.get("customerReviewCount", ""), "asin": product.get("asin", ""), "link": product.get("url", ""), "isPrime": product.get("isPrime", False), "sponsored": product.get("sponsoredAd", False), }) return results
Каждое поле читается через .get() со значением по умолчанию, поэтому листинг без цены или рейтинга возвращает пустую строку, а не прерывает выполнение, это нормально, поскольку не каждый товар уже имеет отзывы. Флаги isPrime и sponsored мы тоже сохраняем в записи: флаг спонсора позволяет отфильтровать платные размещения из органического анализа позже. Поскольку скрапер выполняет извлечение на стороне сервера, вам не нужно самостоятельно отслеживать CSS-классы Amazon, а именно они чаще всего ломаются в самодельных скраперах.
Шаг 3: Сборка и экспорт
Теперь соедините получение и разбор в один работоспособный скрипт. Запросите страницу поиска с опцией scraper, загрузите тело JSON, извлеките товары, затем запишите их в JSON и CSV, чтобы данные были готовы для таблицы или последующей обработки.
import json import pandas as pd from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) options = { "page_wait": 2000, "ajax_wait": "true", "scraper": "amazon-serp", } def scrape_search(page_url): response = api.get(page_url, options) if response["status_code"] != 200: print(f"Request failed: {response['status_code']}") return [], None payload = json.loads(response["body"].decode("latin1")) scraper_result = payload["body"] return parse_products(scraper_result), scraper_result.get("pagination") def parse_products(scraper_result): products = scraper_result.get("products", []) results = [] for product in products: results.append({ "title": product.get("name", ""), "price": product.get("price", ""), "rating": product.get("customerReview", ""), "reviews": product.get("customerReviewCount", ""), "asin": product.get("asin", ""), "link": product.get("url", ""), "isPrime": product.get("isPrime", False), "sponsored": product.get("sponsoredAd", False), }) return results def main(): query = "games" search_url = f"https://www.amazon.com/s?k={query}" products, _ = scrape_search(search_url) print(f"Found {len(products)} products") with open("amazon_products.json", "w") as f: json.dump(products, f, indent=2) pd.DataFrame(products).to_csv("amazon_products.csv", index=False) if __name__ == "__main__": main()
Вспомогательная функция scrape_search возвращает два значения: список разобранных товаров и блок пагинации, который используется в следующем разделе для обхода всех страниц. Запись в JSON и CSV покрывает две наиболее распространённые потребности: JSON позволяет легко передавать записи в другой скрипт, а вызов pandas to_csv создаёт таблицу, готовую для работы в таблицах, одной строкой.
Как выглядит результат
Запустите полный скрипт командой python scraper.py и получите чистый список записей, по одной на каждый результат, готовых для записи куда угодно.
[ { "title": "Catan Board Game (Base Game)", "price": "$43.99", "rating": "4.8 out of 5 stars", "reviews": "32,114", "asin": "B00U26V4VQ", "link": "https://www.amazon.com/dp/B00U26V4VQ", "isPrime": true, "sponsored": false }, { "title": "Ticket to Ride Board Game", "price": "$34.99", "rating": "4.8 out of 5 stars", "reviews": "28,907", "asin": "B0001WN5LE", "link": "https://www.amazon.com/dp/B0001WN5LE", "isPrime": true, "sponsored": false } ]
CSV-версия тех же данных имеет по одному столбцу на поле (title, price, rating, reviews, asin, link, isPrime, sponsored) и по одной строке на товар, что удобно для быстрого просмотра в таблице или листа сравнения цен.
Постраничный обход результатов
Одна страница, это демонстрация; реальная задача охватывает все страницы результатов по запросу. Скрапер amazon-serp возвращает блок пагинации с текущей страницей, следующей страницей и общим количеством страниц:
"pagination": { "currentPage": 1, "nextPage": 2, "totalPages": 20 }
Amazon разбивает поиск на страницы с помощью параметра &page=, как это делает сайт в браузере: ?k=games&page=1, ?k=games&page=2 и так далее. Читайте totalPages из первого ответа, затем перебирайте страницы со второй по последнюю, собирая товары по мере продвижения.
import time def scrape_all_pages(query, max_pages=5): base = f"https://www.amazon.com/s?k={query}" all_results, pagination = scrape_search(base) if not pagination: return all_results total_pages = min(pagination.get("totalPages", 1), max_pages) for page in range(2, total_pages + 1): page_url = f"{base}&page={page}" products, _ = scrape_search(page_url) if not products: break all_results.extend(products) print(f"Page {page}: {len(products)} products") time.sleep(2) return all_results
Ограничение max_pages не позволяет широкому запросу, например "games", случайно обойти все двадцать страниц, а прерывание по пустым результатам останавливает выполнение досрочно, если у запроса мало страниц. time.sleep(2) между страницами задаёт темп запросов, чтобы вы не обращались к поиску в плотном цикле, это самый быстрый способ попасть под ограничение. Замените одностраничный вызов в main на scrape_all_pages(query), и тот же экспорт в JSON и CSV обработает объединённый набор данных.
Выбор между скрапером и самодельным парсером
Опция scraper и делает этот скрипт таким коротким. Уберите её, и API вернёт полный отрисованный HTML, который вы бы разбирали самостоятельно с помощью библиотеки вроде BeautifulSoup, вручную указывая селекторы карточек товаров Amazon. Этот путь даёт полный контроль, но перекладывает бремя поддержки на вас: CSS-классы Amazon меняются, поэтому самодельный парсер требует периодического обслуживания. Скрапер amazon-serp берёт эту работу на себя, именно поэтому он является подходом по умолчанию. Если вам всё же нужен ручной путь для нестандартного поля, которое скрапер не предоставляет, руководство по BeautifulSoup охватывает технику парсинга, а Crawling API предоставляет те же скраперы Amazon через выделенную конечную точку, если вы предпочитаете обращаться к нему таким способом.
Как избежать блокировки
Даже при обработке отрисовки Amazon следит за трафиком, характерным для скраперов. Несколько привычек помогают поддерживать запуск в здоровом состоянии, и они применимы к любому коммерческому ресурсу с защитой.
-
Задавайте темп запросов. Распределяйте запросы с задержкой между страницами и меняйте запросы вместо обхода одного термина на полной скорости.
time.sleepв цикле пагинации, это минимум, а не максимум. - Опирайтесь на ротацию. Пул резидентных IP распределяет запросы по многим реальным пользовательским адресам, чтобы ни один не превысил лимит. Crawling API делает это за вас; если вы строите собственную инфраструктуру, именно здесь нужно сосредоточить усилия.
- Читайте коды статуса. Запуск, начавший возвращать проверки или ошибки, сигнализирует о том, что текущая частота или IP-уровень больше недостаточны. Это сигнал к снижению активности, а не шум, который можно игнорировать.
Более широкое руководство о том, как парсить сайты без блокировки, доступно в нашем блоге.
Законно ли парсить Amazon?
Допустимость парсинга Amazon зависит от условий обслуживания Amazon, вашей юрисдикции и того, что вы делаете с данными. Условия использования Amazon ограничивают автоматизированный доступ и извлечение данных, поэтому парсинг может противоречить этим условиям независимо от тщательности вашего инструментария. Ни один из кодов здесь не изменяет этого; он лишь обеспечивает техническую реализацию. Прочитайте Условия использования Amazon и его файл robots.txt и считайте оба документа границами того, что вы собираете.
Несколько правил, которых стоит придерживаться. Собирайте только публичные данные: названия товаров, цены, рейтинги, количество отзывов, ASIN и ссылки на листинги, которые любой может видеть на странице результатов поиска без учётной записи. Уважайте заявленные Amazon ожидания по частоте запросов и поддерживайте объём запросов достаточно низким, чтобы не нагружать серверы. Избегайте персональных данных, в том числе всего, что связано с идентифицируемыми покупателями, рецензентами или сторонними продавцами за пределами того, что публично указано на странице результатов. Не распространяйте защищённые авторским правом материалы, такие как изображения товаров или тексты отзывов, как будто они ваши. Если вы планируете коммерческое использование данных, получите разрешение или официальное соглашение, а не считайте молчание согласием.
Это руководство намеренно ограничено публичными страницами поиска и листингов, поскольку это граница, которая делает работу защитимой. Оно не охватывает ничего за авторизацией, данных аккаунтов или заказов, персональной информации, платёжных или кассовых потоков, а также любых попыток обойти аутентификацию. Для лицензированного или объёмного доступа Amazon предлагает Product Advertising API и другие официальные программы, это правильный инструмент, когда вам нужны большие объёмы, гарантированная структура или коммерческие права. Если ваш проект требует большего, чем публичные листинги, официальный API или соглашение об использовании данных, правильный путь, а не более умный скрапер.
Ключевые выводы
- Поиск Amazon отрисовывается на JavaScript. Простой запрос возвращает пустую оболочку, поэтому необходимо отрисовать страницу прежде, чем читать какие-либо товары.
-
JS-токен обеспечивает отрисовку и доверенный IP одновременно. Один вызов Crawling API с
page_waitиajax_waitдожидается динамической сетки и возвращает готовый результат. -
Скрапер amazon-serp разбирает данные за вас. Передайте
scraper, и вы получите структурированный JSON с name, price, customerReview, asin и url по каждому товару без необходимости писать селекторы. -
Пагинация через параметр page. Читайте
totalPagesиз блока пагинации, обходите&page=с ограничением и задержкой и объединяйте результаты. - Оставайтесь в рамках публичных данных. Соблюдайте Условия использования и robots.txt Amazon, предпочитайте официальный Product Advertising API для лицензированных или объёмных данных и никогда не затрагивайте аккаунты, заказы или персональную информацию.
Часто задаваемые вопросы
Почему обычный запрос не возвращает товары с Amazon?
Потому что Amazon загружает большую часть поисковой сетки на стороне клиента с помощью JavaScript и Ajax. Начальный HTML, это оболочка, которая заполняется только после выполнения скриптов страницы в браузере, поэтому сырой HTTP-запрос возвращает статус 200 с пустыми листингами. Чтобы получить реальные данные, необходимо сначала отрисовать страницу, именно это обеспечивает JS-токен Crawling API.
Какой токен нужен для Amazon, обычный или JS?
JS-токен. Обычный токен получает статический HTML, который на Amazon является той же пустой оболочкой, что возвращает простой запрос. JS-токен отрисовывает страницу в реальном браузере перед разбором, поэтому карточки товаров присутствуют, когда скрапер amazon-serp их извлекает.
Что возвращает скрапер amazon-serp?
Он возвращает объект JSON с массивом products и блоком pagination. Каждый товар содержит поля: name, price, rawPrice, currency, customerReview, customerReviewCount, asin, image, url, isPrime и sponsoredAd. В этом посте часть из них сопоставляется с чистой записью: title, price, rating, ASIN и link.
Как обойти все страницы поиска Amazon?
Читайте totalPages из блока пагинации в первом ответе, затем перебирайте URL поиска с нарастающим параметром &page=, начиная со второй страницы. Парсите каждую страницу той же функцией, ограничивайте количество страниц, чтобы широкий запрос оставался управляемым, и добавляйте небольшую задержку между запросами для контроля темпа.
Можно ли парсить данные заказов, аккаунтов или оформления покупок с Amazon?
Нет, и это руководство не охватывает данную тему. История заказов, данные аккаунта и потоки оформления покупок находятся за авторизацией и не являются публичными данными. Парсинг контента, защищённого авторизацией, или обход аутентификации выходят за рамки этого руководства и противоречат условиям Amazon. Для санкционированного доступа к более широким данным правильный путь, официальный Product Advertising API или партнёрское соглашение.
Как избежать блокировки при парсинге Amazon?
Поддерживайте низкую частоту запросов на IP, добавляйте задержку между страницами, меняйте запросы вместо цикличного перебора одного термина и маршрутизируйте через ротируемые резидентные IP, чтобы ни один адрес не превысил лимит. Crawling API управляет ротацией и доверенным пулом IP за вас; если вы строите собственную инфраструктуру, именно здесь нужно сосредоточить усилия. Следите за кодами статуса и снижайте активность при появлении проверок.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
