Как массово извлекать данные о продуктах Amazon на Python
Трехстрочное руководство по BeautifulSoup работает один раз, затем Amazon выдает вам CAPTCHA. Вот что на самом деле ломается при масштабировании — изменяющиеся селекторы цен, гео-цены, блокировки IP — и конвейер, который это выдерживает.
Извлечение данных о продуктах Amazon кажется тривиальным в каждом учебнике для начинающих: requests, BeautifulSoup, захватите название и цену, готово. Это работает ровно до тех пор, пока вы не запустите его несколько сотен раз, после чего Amazon выдает вам страницу проверки робота, и ваш селектор цен возвращает None. Это руководство о версии, которая выдерживает контакт с реальным сайтом — конвейер с приоритетом ASIN, селекторы, которые действительно ломаются, почему один и тот же продукт показывает разную цену для разных IP, и настройка прокси, которая удерживает вас от стены CAPTCHA. Речь идет о публичных данных о продуктах (названия, цены, рейтинги, доступность), а не о чем-либо за логином.
Структура URL: ASIN — это ключ
У каждого продукта Amazon есть ASIN — 10-символьный идентификатор, такой как B08N5WRWNW, — и весь каталог строится на его основе. Страница продукта — это просто https://www.amazon.com/dp/<ASIN>, и тот же ASIN отображается на всех рынках (amazon.co.uk/dp/<ASIN>, amazon.de/dp/<ASIN>). Страницы поиска и категорий находятся под /s? с параметрами запроса и узла просмотра. Таким образом, масштабируемый конвейер имеет два этапа: обнаружение ASIN из страниц поиска или лучших продавцов, затем гидратация каждого из его страницы /dp/. Одно предостережение — "родительский" ASIN (продукт с вариантами размера или цвета) разрешается в автоматически выбранный дочерний вариант, поэтому захватите вариант ASIN, на который вы фактически попали.
import requests
from bs4 import BeautifulSoup
PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"}
def product(asin, domain="com"):
url = f"https://www.amazon.{domain}/dp/{asin}"
r = requests.get(url, headers=HEADERS,
proxies={"http": PROXY, "https": PROXY}, timeout=20)
soup = BeautifulSoup(r.text, "html.parser")
return parse(soup, asin)
Селектор, который все копируют, а Amazon удалил
Почти каждый старый учебник считывает цену из span#priceblock_ourprice. Amazon предлагает несколько макетов блока цен и проводит A/B-тесты, поэтому этот единственный ID сегодня пуст на большинстве страниц. Надежный подход — попробовать несколько известных контейнеров цен по порядку и взять первый, который совпадает — и рассматривать отсутствие цены как реальное состояние (обычно отсутствие на складе), а не как сбой.
def parse(soup, asin):
title = soup.select_one("#productTitle")
price = None
for sel in ["span.a-price span.a-offscreen", # current layout
"#priceblock_ourprice", # legacy
"#priceblock_dealprice", # deal layout
"#corePrice_feature_div .a-offscreen"]:
el = soup.select_one(sel)
if el and el.get_text(strip=True):
price = el.get_text(strip=True)
break
rating = soup.select_one("span.a-icon-alt")
return {
"asin": asin,
"title": title.get_text(strip=True) if title else None,
"price": price, # None -> likely out of stock
"rating": rating.get_text(strip=True) if rating else None,
}

Почему один и тот же продукт показывает две цены
Это факт, который тихо разрушает наборы данных о ценах. Amazon локализует цену и доступность для места доставки покупателя — настройки "Доставить в" — которую он в основном определяет по вашему IP. Извлеките amazon.com с IP немецкого дата-центра, и вы можете получить цены в евро, другие предложения или другого победителя в "Коробке покупки", чем видит покупатель из США. Если вы собираете данные о конкурентных ценах, география выходного IP является экспериментом: чтобы захватить цену, которую видит покупатель из США, вы маршрутизируете через американский резидентный прокси; для рынка Великобритании — выход из Великобритании. Один продукт, много цен, по одной на каждый рынок, который вы исследуете.
Получите резидентные прокси с гео-направлением
Почему наивные скреперы блокируются
Amazon использует автоматизированные системы управления запросами: слишком быстрый всплеск с одного IP, и вы получаете CAPTCHA, блокировку IP или упрощенную страницу. Три вещи поддерживают скрепер в рабочем состоянии при больших объемах. Во-первых, меняйте IP, чтобы ни один адрес не нес всю нагрузку — вращающийся резидентный пул распределяет запросы по многим реальным потребительским IP. Во-вторых, соблюдайте темп: случайные задержки и ограничение параллельности, а не непрерывный цикл. В-третьих, отправляйте согласованные заголовки — реальный браузер User-Agent и Accept-Language, а не строку по умолчанию в Python. Когда страница возвращается подозрительно короткой или содержит маркер проверки робота, отбрасывайте ее и повторяйте на свежем IP, а не анализируйте мусор.
import time, random
def fetch_many(asins, domain="com"):
rows = []
for asin in asins:
for attempt in range(3):
data = product(asin, domain)
if data["title"]: # got a real page
rows.append(data)
break
time.sleep(1.5 + random.random()) # back off, rotate, retry
time.sleep(random.uniform(1, 3)) # pace between products
return rows
Поиск, лучшие продавцы и пагинация
Страницы продуктов — это детали; страницы поиска и лучших продавцов — это то, как вы обнаруживаете, что извлекать. Поиск по ключевым словам — это /s?k=<query>&page=<n>; лучшие продавцы привязаны к узлам просмотра категорий. Пройдитесь по страницам, извлеките ASIN из каждой карточки результата, затем передайте их на этап продукта выше. Держите два этапа отдельно — это позволяет вам удалять дубли ASIN, возобновлять обход и перепроверять известный список ASIN по расписанию без повторного обнаружения при каждом запуске. Для более широкого построения наш гид по лучшим прокси для веб-скрапинга охватывает сторону пула этого.
Для самого вывода держите схему строки плоской и стабильной: asin, исходный url, title, price, rating, количество отзывов, image_url и domain рынка, с которого вы извлекли данные. Записывайте домен в каждую строку, чтобы набор данных с разных рынков никогда не путал цену США с ценой Великобритании. Захватывайте ASIN даже когда цена пуста — отсутствие на складе является точкой данных, а не пробелом, и отслеживание, когда продукт появляется и исчезает на складе, часто так же ценно, как и цена. CSV или таблица базы данных с этими столбцами легко интегрируются в отслеживание цен, оповещения о доступности или исследование "Коробки покупки" без дальнейшей переработки.

Прокси против API для скрапинга: когда переключаться
Самодельные requests плюс хороший резидентный пул — это правильный выбор, пока вы контролируете объем и цель остается кооперативной. Как только вы поддерживаете вращающиеся селекторы, обработку CAPTCHA, закрепление гео и логику повторных попыток для тысяч ASIN в день, это становится работой. Scraper API упрощает это: отправьте URL Amazon, получите обратно структурированные данные о продукте с обработкой ротации, рендеринга и гео. Честное правило — делайте сами, пока трение низкое, переключайтесь, когда поддержка антибота требует больше инженерного времени, чем стоят данные. Наш анализ построить или купить ставит цифры на эту линию.
Часто задаваемые вопросы
Как извлекать данные о продуктах Amazon с помощью Python?
Получите страницу продукта по адресу /dp/<ASIN> с помощью requests и реального браузера User-Agent, затем проанализируйте название, цену, рейтинг и доступность с помощью BeautifulSoup. Попробуйте несколько селекторов цен, а не только устаревший priceblock_ourprice. Маршрутизируйте через вращающийся резидентный прокси, чтобы всплески не вызывали блокировку, и закрепите выходное гео за рынком, цену которого вы хотите.
Законно ли извлекать данные о продуктах Amazon?
Сбор публично видимых данных о продуктах — названия, цены, рейтинги — обычно рассматривается иначе, чем обход логинов или копирование защищенного контента, но условия Amazon ограничивают автоматизированный доступ, и правовая картина варьируется в зависимости от юрисдикции и использования. Это общая информация, а не юридическая консультация: извлекайте только публичные данные, уважайте ограничения скорости и получайте консультацию для всего коммерческого или пограничного.
Почему мой скрепер Amazon получает другую цену, чем на сайте?
Amazon локализует цены и доступность для места доставки, которое он определяет по вашему IP. Если ваш прокси выходит в другой стране, чем рынок, который вы изучаете, вы увидите неправильную валюту и предложения. Закрепите выходной IP за целевым рынком — американский резидентный IP для цен США, британский IP для цен Великобритании — чтобы данные совпадали с тем, что видит реальный покупатель там.
Как избежать блокировки при извлечении данных Amazon?
Меняйте множество резидентных IP, чтобы ни один адрес не нес всю нагрузку, регулируйте с помощью случайных задержек и ограничения параллельности, и отправляйте согласованные заголовки браузера. Проверяйте каждый ответ — 200 может все еще быть страницей проверки робота — и повторяйте на свежем IP, а не анализируйте заблокированный. При большом объеме Scraper API обрабатывает все это за вас.
Amazon в масштабе не сложен потому, что парсинг сложен — он сложен потому, что сайт сопротивляется, и цена зависит от того, где вы находитесь. Стройте с приоритетом ASIN, сопоставляйте несколько контейнеров цен, закрепляйте ваше гео, меняйте ваши IP и рассматривайте короткий ответ как блокировку, а не данные. Сделайте это правильно, и учебник для начинающих наконец масштабируется.
Извлекайте данные Amazon с помощью Scraper API от QuantumProxies