Карточка товара на Amazon строится вокруг изображений: главный геройский снимок, галерея альтернативных ракурсов, lifestyle-фотографии и инфографика, расписывающая характеристики и размеры. Эти изображения общедоступны, и умение массово их вытягивать полезно для построения каталогов, исследования товаров, конкурентного анализа и наполнения датасета для классификации изображений или визуального поиска.
Это руководство показывает, как скачивать изображения со страницы товара Amazon на Python надёжным способом. Вы построите небольшой, запускаемый скрапер, который получает отрисованную страницу товара через Crawling API, извлекает URL изображений (главное изображение плюс галерею и миниатюры) и сохраняет каждое в локальный файл. Весь разбор остаётся в рамках публичных изображений товаров, а раздел о законности ближе к концу это не формальность, так что прочитайте его, прежде чем направлять это на любой реальный объём.
Что вы построите
Скрипт на Python, который принимает URL товара Amazon, получает отрисованную страницу через Crawling API, собирает URL каждого изображения товара и скачивает каждое в локальную папку. В качестве рабочего примера мы возьмём одну страницу товара и извлечём такие данные:
- Главное изображение основной геройский снимок, показанный вверху карточки.
- Изображения галереи альтернативные ракурсы и lifestyle-кадры за лентой миниатюр.
- Миниатюры небольшие превью, сопоставленные каждому кадру галереи.
- URL изображений прямая ссылка в полном разрешении на каждый файл изображения.
- Локальные файлы каждое изображение, сохранённое на диск в папке по товару.
Почему простой запрос терпит неудачу на Amazon
Если запросить URL товара Amazon голым HTTP-клиентом, вы редко получаете ту галерею, за которой пришли. Против вас работают две вещи. Во-первых, Amazon загружает большую часть галереи изображений на стороне клиента: варианты в высоком разрешении и сопоставление миниатюры с главным изображением заполняются JavaScript уже после того, как приходит исходный HTML, поэтому сырой запрос часто видит лишь заглушку низкого разрешения или неполный набор. Во-вторых, Amazon быстро помечает автоматический трафик. IP дата-центров и шаблоны запросов, которые не похожи на настоящий браузер, получают CAPTCHA или блокировку ещё до того, как дотянутся до отрисованной карточки.
Поэтому рабочему скраперу изображений Amazon нужны две вещи в одном запросе: браузер, который реально отрисовывает страницу, и IP, который платформа читает как настоящего покупателя. Вы можете собрать это сами из headless-браузера плюс пула вращающихся резидентных прокси, но сшивание их вместе и поддержание в рабочем состоянии и есть большая часть работы. Crawling API складывает оба в один вызов: вы отправляете ему URL с JavaScript-токеном, он отрисовывает страницу за доверенным резидентным IP и возвращает готовый HTML, который вам остаётся разобрать.
Crawlbase предлагает два типа токенов. Обычный токен получает статический HTML; JavaScript-токен (JS) сначала отрисовывает страницу в настоящем браузере. Amazon подгружает галерею высокого разрешения на стороне клиента, поэтому JS-токен даёт вам полный набор изображений. Использование обычного токена может вернуть более скудную страницу, на которой некоторые варианты галереи так и не загрузились.
Предварительные требования
Прежде чем писать какой-либо код, нужно подготовить несколько вещей. Ни одна из них не займёт много времени.
Базовый Python. Вам стоит уметь писать и запускать скрипт на Python и устанавливать пакеты через pip. Если язык для вас новый, официальная документация Python и любой курс для начинающих доведут вас до уровня, который предполагает этот туториал. Сопутствующее руководство о том, как скачивать изображения с помощью Python, глубже разбирает механику записи файлов.
Python 3.8 или новее. Подтвердите свою версию командой python --version. Если его нет, установите с python.org или через дистрибутив вроде Anaconda.
Аккаунт Crawlbase и JS-токен. Зарегистрируйтесь, откройте панель управления и скопируйте свой JavaScript-токен (JS) со страницы документации аккаунта. Вы получаете до 20 000 бесплатных запросов, и вы платите только за успешные. Относитесь к токену как к паролю: он аутентифицирует ваши запросы, поэтому держите его вне системы контроля версий.
Настройка проекта
Создайте виртуальное окружение, чтобы зависимости проекта оставались изолированными, затем установите библиотеки, которые нужны скраперу.
python --version python -m venv amazon_env source amazon_env/bin/activate pip install crawlbase beautifulsoup4 requests
В Windows активируйте окружение командой amazon_env\Scripts\activate вместо строки с source. Работу делают три зависимости: crawlbase это официальный клиент для Crawling API, beautifulsoup4 разбирает возвращённый HTML, чтобы вы могли вытаскивать URL изображений по селектору, а requests скачивает каждый файл изображения на диск.
Разбираемся в галерее изображений Amazon
Amazon показывает на странице товара несколько типов изображений, и полезно знать их, прежде чем писать селекторы. Главное изображение это основной снимок товара вверху карточки. Альтернативные изображения показывают разные ракурсы или функции. Lifestyle-изображения показывают товар в реальном использовании, а инфографика расписывает функции, размеры или характеристики. Все они находятся в одной галерее и используют один и тот же хост изображений.
Прежде чем писать селекторы, откройте страницу товара в браузере, щёлкните правой кнопкой по главному изображению и выберите «Просмотреть код». Вы увидите геройское изображение внутри контейнера со стабильным id, равным landingImage (также доступным как #imgTagWrapperId img), и ленту миниатюр, отрисованную как список небольших изображений с id altImages. Amazon отдаёт вариант каждого изображения нужного размера, кодируя размеры в имя файла, поэтому URL миниатюры и его аналог в полном разрешении различаются только этим токеном размера. Именно эта деталь и позволяет превратить небольшую ссылку-превью в загрузку в высоком разрешении.
Шаг 1: Получите отрисованную страницу товара
Начните с получения готовой страницы. Импортируйте класс CrawlingAPI, инициализируйте его своим JS-токеном и запросите URL товара. Проверка кода состояния перед разбором делает сбои громкими, а не тихими.
from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def crawl(page_url): options = {"ajax_wait": "true", "page_wait": 4000} 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__": product_url = "https://www.amazon.com/dp/B0CHX3QBCH" html = crawl(product_url) print(html[:500] if html else "No HTML returned")
Две опции ожидания важны для галереи, отрисовываемой на стороне клиента, как эта. ajax_wait велит API дождаться завершения загрузки асинхронного контента, а page_wait удерживает фиксированное число миллисекунд после загрузки, чтобы поздно отрисовываемые варианты изображений появились до захвата страницы. Четыре секунды это разумное начало; повысьте, если галерея возвращается скудной. Тело декодируется как latin1, потому что страницы Amazon примешивают символы, на которых строгое декодирование UTF-8 может споткнуться. Запустите скрипт, и вы должны увидеть настоящую разметку товара, что подтверждает работу отрисовки до того, как вы напишете хоть один селектор.
Amazon требует отрисованную страницу за доверенным IP, в одном вызове, ещё до того, как его галерея полного разрешения вообще окажется в HTML. Crawling API принимает JS-токен, прогоняет страницу в настоящем браузере, ротирует резидентные IP на стороне сервера и отдаёт вам готовый HTML, так что вы избегаете запуска собственного флота headless-браузеров и пула прокси. Для начала направьте его на один URL товара на бесплатном тарифе.
Шаг 2: Извлеките URL изображений
Имея на руках отрисованный HTML, загрузите его в BeautifulSoup и вытяните ссылки на изображения. Прочитайте главное изображение из #landingImage, затем соберите галерею из ленты миниатюр под #altImages. Amazon хранит миниатюры небольшого размера, поэтому вы переписываете каждый URL миниатюры в его форму полного разрешения, убирая токен размера, который Amazon кодирует в имя файла.
import re from bs4 import BeautifulSoup def full_res(url): # Amazon encodes a size token like _SX466_ or _AC_US40_ into the # filename; dropping it returns the full-resolution image. return re.sub(r"\._[^.]+_\.", ".", url) def extract_image_urls(html): soup = BeautifulSoup(html, "html.parser") urls = [] main = soup.select_one("#landingImage, #imgTagWrapperId img") if main and main.get("src"): urls.append(full_res(main["src"])) for thumb in soup.select("#altImages img"): src = thumb.get("src") if src and "images/I/" in src: urls.append(full_res(src)) # De-duplicate while preserving order. seen = set() unique = [] for u in urls: if u not in seen: seen.add(u) unique.append(u) return unique
Помощник full_res это ключевой шаг. Amazon отдаёт одно и то же изображение во многих размерах, вставляя токен вроде ._SX466_ или ._AC_US40_ между id изображения и расширением файла; регулярное выражение удаляет этот токен, чтобы вы оставили оригинальный файл полного разрешения, а не миниатюру. Главное изображение берётся из #landingImage, с #imgTagWrapperId img в качестве запасного варианта, а галерея берётся из изображений-миниатюр под #altImages. Фильтрация по images/I/ в источнике пропускает спрайты и иконки Amazon, которые не являются фотографиями товаров, а финальный проход дедупликации отбрасывает случай, когда главное изображение также появляется как первая миниатюра.
Разметка галереи Amazon меняется между вариантами страниц и со временем. id #landingImage и #altImages входят в число более устойчивых зацепок, но конкретная карточка может отрисовывать свою галерею иначе. Когда список возвращается пустым, заново осмотрите живую страницу товара в инструментах разработчика браузера и обновите селекторы. Периодическое сопровождение селекторов это норма для любого продакшен-скрапера, а не признак того, что что-то сломалось.
Шаг 3: Скачайте каждое изображение в локальный файл
Теперь превратите URL в файлы. Для каждого URL изображения запросите байты и запишите их в папку по товару, выводя имя файла из id изображения в URL. Маршрутизация загрузки через Crawling API держит её на том же доверенном пути IP, что и получение страницы, что не даёт отдельному запросу с вашего собственного IP быть заблокированным.
import os from urllib.parse import urlparse def download_images(urls, folder="amazon_images"): os.makedirs(folder, exist_ok=True) saved = [] for i, url in enumerate(urls): name = os.path.basename(urlparse(url).path) or f"image_{i}.jpg" path = os.path.join(folder, name) response = api.get(url) if response["status_code"] == 200: with open(path, "wb") as f: f.write(response["body"]) saved.append(path) print(f"Saved {path}") else: print(f"Skipped {url}: {response['status_code']}") return saved
Функция один раз создаёт выходную папку с exist_ok=True, чтобы повторный запуск не выдавал ошибку, затем проходит по списку URL. Имя файла берётся из последнего сегмента пути URL, который для Amazon является уникальным id изображения, поэтому два разных кадра галереи никогда не сталкиваются на диске. Каждое изображение записывается в бинарном режиме, а ответ, отличный от 200, сообщается и пропускается, а не обрушивает прогон. Поскольку запрос идёт обратно через api.get, получение изображения переиспользует тот же путь доверенного IP, что и получение страницы.
Шаг 4: Соберите всё вместе
Теперь свяжите получение, извлечение и загрузку в один запускаемый скрипт.
import os import re import json from urllib.parse import urlparse from crawlbase import CrawlingAPI from bs4 import BeautifulSoup api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def crawl(page_url): options = {"ajax_wait": "true", "page_wait": 4000} 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 def full_res(url): return re.sub(r"\._[^.]+_\.", ".", url) def extract_image_urls(html): soup = BeautifulSoup(html, "html.parser") urls = [] main = soup.select_one("#landingImage, #imgTagWrapperId img") if main and main.get("src"): urls.append(full_res(main["src"])) for thumb in soup.select("#altImages img"): src = thumb.get("src") if src and "images/I/" in src: urls.append(full_res(src)) seen, unique = set(), [] for u in urls: if u not in seen: seen.add(u) unique.append(u) return unique def download_images(urls, folder="amazon_images"): os.makedirs(folder, exist_ok=True) saved = [] for i, url in enumerate(urls): name = os.path.basename(urlparse(url).path) or f"image_{i}.jpg" path = os.path.join(folder, name) response = api.get(url) if response["status_code"] == 200: with open(path, "wb") as f: f.write(response["body"]) saved.append(path) print(f"Saved {path}") return saved def main(): product_url = "https://www.amazon.com/dp/B0CHX3QBCH" html = crawl(product_url) if not html: return urls = extract_image_urls(html) print(json.dumps(urls, indent=2)) download_images(urls) if __name__ == "__main__": main()
Сохраните это как amazon_images.py, вставьте свой токен и запустите python amazon_images.py. Скрипт печатает список URL изображений полного разрешения, затем скачивает каждое в папку amazon_images рядом со скриптом. Если вы заодно скрапите структурированные поля товара (заголовок, цену, ASIN и так далее), сопутствующее руководство о том, как скрапить данные о товарах Amazon, расширяет это же получение до полной записи.
Как выглядит результат
Напечатанный список это набор URL изображений, найденных парсером, в порядке галереи, а папка наполняется одним файлом на каждый URL.
[ "https://m.media-amazon.com/images/I/71xKDtMfaZL.jpg", "https://m.media-amazon.com/images/I/61hr19MzN3L.jpg", "https://m.media-amazon.com/images/I/71f7tsamQ4L.jpg", "https://m.media-amazon.com/images/I/81Qj0nFLanL.jpg" ]
На диске вы получаете соответствующие файлы, каждый назван по своему id изображения:
amazon_images/ 71xKDtMfaZL.jpg 61hr19MzN3L.jpg 71f7tamQ4L.jpg 81Qj0nFLanL.jpg
Масштабирование на множество товаров
Один товар это демонстрация; реальная задача прогоняется по списку товаров. Поскольку каждый шаг это обычная функция, вы масштабируетесь, проходя циклом по списку URL товаров и давая каждому свою выходную папку, чтобы файлы не смешивались. Размеряйте цикл небольшой задержкой, чтобы не долбить Amazon в плотном ритме, что является самым быстрым способом получить троттлинг.
import time def scrape_many(product_urls): for url in product_urls: asin = url.rstrip("/").split("/")[-1] html = crawl(url) if not html: continue urls = extract_image_urls(html) download_images(urls, folder=f"amazon_images/{asin}") print(f"{asin}: {len(urls)} images") time.sleep(2)
Каждый товар получает папку, названную по своему ASIN, последнему сегменту пути URL вида /dp/ASIN, поэтому партия товаров остаётся аккуратно разделённой на диске. time.sleep(2) между товарами размеряет прогон. Для вывода и проверки этого ASIN из любого URL Amazon глубже разбирает руководство о том, как найти и скрапить ASIN на Amazon.
Как оставаться незаблокированным
Даже когда отрисовка решена, Amazon следит за трафиком, похожим на скрапер. Несколько привычек поддерживают прогон здоровым, и они применимы к любой сложной коммерческой цели.
-
Размеряйте свои запросы. Разносите запросы задержкой между товарами и избегайте скрапинга одной и той же карточки в плотном цикле.
time.sleepв цикле партии это пол, а не потолок. - Опирайтесь на ротацию. Пул резидентных IP распределяет запросы по множеству адресов реальных пользователей, поэтому ни один из них не срабатывает на лимите частоты. Crawling API делает это за вас; если вы собираете собственный стек, это та часть, которую нужно сделать правильно.
- Читайте коды состояния. Прогон, который начинает возвращать вызовы или ошибки, говорит вам, что текущей частоты или уровня IP уже недостаточно. Воспринимайте это как сигнал отступить, а не как шум, который можно игнорировать.
Для более широкого свода правил смотрите руководство о том, как скрапить сайты, не получая блокировок. Тот же паттерн «получить, затем скачать» работает и на других сайтах, насыщенных изображениями; сопутствующий разбор скрапинга изображений с DeviantArt применяет его к совсем иной раскладке галереи.
Законно ли скрапить изображения Amazon?
Допустимо ли скачивание изображений Amazon, зависит от условий обслуживания Amazon, вашей юрисдикции и того, что вы делаете с изображениями. Условия использования Amazon ограничивают автоматический доступ и накладывают чёткие пределы на повторное использование его контента, поэтому скрапинг может противоречить этим условиям независимо от того, насколько аккуратен ваш инструментарий. Ничто из кода здесь этого не меняет; он лишь заставляет работать техническую часть. Прочитайте Условия использования Amazon и его robots.txt и относитесь к обоим как к границе того, что вы собираете.
Самый важный момент это дальнейшее использование. Изображения товаров на Amazon почти всегда защищены авторским правом, принадлежат бренду, продавцу или фотографу, а не вам и не Amazon для дальнейшего лицензирования. Сбор публичных изображений для анализа это одно: подача их в классификацию изображений, построение внутреннего каталожного справочника или сравнение вариантов между карточками. Перераспространение или переиздание этих изображений, выдача их за свои собственные или повторное использование в собственной витрине это уже другое дело и может нарушать авторское право. Не перераспространяйте защищённые авторским правом изображения товаров и не удаляйте и не изменяйте водяные знаки. Когда сомневаетесь, получите разрешение от правообладателя.
Это руководство намеренно ограничено публичными изображениями товаров, потому что именно эта линия делает работу защищаемой. Оно не охватывает ничего за логином, данных аккаунта или заказа, персональной информации или любых попыток обойти аутентификацию. Для лицензированного или массового доступа Amazon предлагает Product Advertising API и программы для продавцов, и это правильный инструмент, когда вам нужны большие объёмы, гарантированная структура или коммерческие права на медиа. Если вашему проекту нужно больше, чем публичные изображения для вашего собственного анализа, правильный путь это официальный API или прямое соглашение с правообладателем, а не более хитрый скрапер.
Ключевые выводы
- Amazon подгружает свою галерею на стороне клиента. Простое получение часто возвращает скудный набор изображений, поэтому вы отрисовываете страницу с JS-токеном, прежде чем разбирать её.
-
Один вызов даёт вам отрисовку и доверенный IP. Crawling API с
ajax_waitиpage_waitждёт загрузки галереи, затем возвращает готовый HTML. -
У главного изображения и галереи есть стабильные зацепки. Читайте
#landingImageдля геройского снимка и#altImages imgдля миниатюр, затем уберите токен размера Amazon, чтобы получить файл полного разрешения. -
Скачивайте через тот же путь API. Маршрутизация получения изображений обратно через
api.getдержит их на доверенном IP и называет каждый файл по его уникальному id изображения. - Используйте публичные изображения только для анализа. Уважайте ToS и robots.txt Amazon, не перераспространяйте защищённые авторским правом изображения товаров и предпочитайте официальный API для лицензированного или массового доступа.
Часто задаваемые вопросы
Почему простой запрос возвращает галерею низкого разрешения или неполную?
Потому что Amazon заполняет варианты изображений высокого разрешения и сопоставление миниатюр с помощью JavaScript уже после загрузки исходного HTML. Сырой HTTP-запрос видит страницу до того, как эти скрипты отработают, поэтому часто получает заглушку или частичный набор. Отрисовка страницы сначала, что и делает JS-токен Crawling API, даёт вам полную галерею до того, как вы её разбираете.
Как получить изображение полного разрешения вместо миниатюры?
Amazon кодирует запрошенный размер в имя файла токеном вроде ._SX466_ или ._AC_US40_ между id изображения и расширением. Удаление этого токена небольшим регулярным выражением возвращает оригинальный файл полного разрешения. Помощник full_res в этом руководстве делает ровно это и для главного изображения, и для каждой миниатюры.
Какие селекторы хранят изображения товаров Amazon?
Главное изображение находится в #landingImage (также доступно через #imgTagWrapperId img), а альтернативные, lifestyle- и инфографические кадры берутся из ленты миниатюр под #altImages. Фильтрация по images/I/ в источнике пропускает спрайты и иконки. Эти id устойчивы, но не вечны, поэтому заново осмотрите живую страницу, если список возвращается пустым.
Можно ли скрапить изображения Amazon, не получая блокировок?
Держите частоту запросов низкой, добавьте задержку между товарами и маршрутизируйте через вращающиеся резидентные IP, чтобы ни один адрес не срабатывал на лимите частоты. Crawling API управляет ротацией и пулом доверенных IP за вас; если вы строите собственный стек, это та часть, в которую стоит вложиться. Следите за кодами состояния и отступайте, когда начинаете видеть вызовы.
Законно ли скачивать изображения с Amazon?
Сбор публичных изображений товаров для собственного анализа в целом низкорискован, но сами изображения обычно защищены авторским правом бренда, продавца или фотографа. Перераспространение, переиздание или коммерческое повторное использование могут нарушать это авторское право, а автоматический доступ может противоречить условиям Amazon в любом случае. Прочитайте Условия использования Amazon и robots.txt, не перераспространяйте защищённые авторским правом изображения и предпочитайте официальный Product Advertising API для лицензированного доступа.
Можно ли скачать изображения сразу для целого списка товаров?
Да. Поскольку каждый шаг это обычная функция, вы проходите циклом по списку URL товаров, даёте каждому свою папку, названную по его ASIN, чтобы файлы не смешивались, и добавляете небольшую задержку между товарами, чтобы размерить прогон. Помощник scrape_many в этом руководстве это рабочая отправная точка для такой пакетной задачи.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
