# Как массово извлекать данные о продуктах 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, на который вы фактически попали.

```python
import requests
from bs4 import BeautifulSoup

PROXY = "http://USER:PASS@residentialpremium.quantumproxies.io:8080"
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 сегодня пуст на большинстве страниц. Надежный подход — попробовать несколько известных контейнеров цен по порядку и взять первый, который совпадает — и рассматривать отсутствие цены как реальное состояние (обычно отсутствие на складе), а не как сбой.

```python
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 с приоритетом ASIN в пять шагов: страницы поиска и бестселлеров, список ASIN без дубликатов, выходной IP, закрепленный за целевым рынком, гидратация каждой страницы /dp/ для названия, цены и рейтинга, затем плоские строки CSV; карточка показывает схему строки, где в каждую строку записан домен маркетплейса.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335159/blog/generated/qp-b9-021-diag1.png)
*Обнаружьте ASIN из поиска, гидратируйте каждый из его страницы /dp/, и закрепите выходной IP за рынком, цену которого вы хотите.*

## Почему один и тот же продукт показывает две цены

Это факт, который тихо разрушает наборы данных о ценах. Amazon локализует цену и доступность для места доставки покупателя — настройки "Доставить в" — которую он в основном определяет по вашему IP. Извлеките `amazon.com` с IP немецкого дата-центра, и вы можете получить цены в евро, другие предложения или другого победителя в "Коробке покупки", чем видит покупатель из США. Если вы собираете [данные о конкурентных ценах](https://quantumproxies.io/blog/competitor-price-monitoring-with-proxies), география выходного IP *является* экспериментом: чтобы захватить цену, которую видит покупатель из США, вы маршрутизируете через американский [резидентный прокси](https://quantumproxies.io/residential-proxies); для рынка Великобритании — выход из Великобритании. Один продукт, много цен, по одной на каждый рынок, который вы исследуете.

[Получите резидентные прокси с гео-направлением](https://quantumproxies.io/residential-proxies)

## Почему наивные скреперы блокируются

Amazon использует автоматизированные системы управления запросами: слишком быстрый всплеск с одного IP, и вы получаете CAPTCHA, блокировку IP или упрощенную страницу. Три вещи поддерживают скрепер в рабочем состоянии при больших объемах. Во-первых, меняйте IP, чтобы ни один адрес не нес всю нагрузку — вращающийся резидентный пул распределяет запросы по многим реальным потребительским IP. Во-вторых, соблюдайте темп: случайные задержки и ограничение параллельности, а не непрерывный цикл. В-третьих, отправляйте согласованные заголовки — реальный браузер User-Agent и `Accept-Language`, а не строку по умолчанию в Python. Когда страница возвращается подозрительно короткой или содержит маркер проверки робота, отбрасывайте ее и повторяйте на свежем IP, а не анализируйте мусор.

```python
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 по расписанию без повторного обнаружения при каждом запуске. Для более широкого построения наш гид по [лучшим прокси для веб-скрапинга](https://quantumproxies.io/blog/best-proxies-for-web-scraping) охватывает сторону пула этого.

Для самого вывода держите схему строки плоской и стабильной: `asin`, исходный `url`, `title`, `price`, `rating`, количество отзывов, `image_url` и `domain` рынка, с которого вы извлекли данные. Записывайте домен в каждую строку, чтобы набор данных с разных рынков никогда не путал цену США с ценой Великобритании. Захватывайте ASIN даже когда цена пуста — отсутствие на складе является точкой данных, а не пробелом, и отслеживание, когда продукт появляется и исчезает на складе, часто так же ценно, как и цена. CSV или таблица базы данных с этими столбцами легко интегрируются в отслеживание цен, оповещения о доступности или исследование "Коробки покупки" без дальнейшей переработки.

![Страница товара Amazon с отметками мест, где ломается наивный скрепер: старый ID priceblock_ourprice пуст, цена и валюта зависят от гео IP, 200 может оказаться страницей проверки на робота, а всплески с одного IP банятся; карточка дает исправление для каждого случая, от нескольких селекторов цены до ротации со случайными задержками.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335159/blog/generated/qp-b9-021-diag2.png)
*Почти каждый сбой скрепера Amazon — это одна из этих пяти причин — и для каждой есть конкретное решение.*

## Прокси против API для скрапинга: когда переключаться

Самодельные `requests` плюс хороший резидентный пул — это правильный выбор, пока вы контролируете объем и цель остается кооперативной. Как только вы поддерживаете вращающиеся селекторы, обработку CAPTCHA, закрепление гео и логику повторных попыток для тысяч ASIN в день, это становится работой. [Scraper API](https://quantumproxies.io/scraper-api) упрощает это: отправьте URL Amazon, получите обратно структурированные данные о продукте с обработкой ротации, рендеринга и гео. Честное правило — делайте сами, пока трение низкое, переключайтесь, когда поддержка антибота требует больше инженерного времени, чем стоят данные. Наш анализ [построить или купить](https://quantumproxies.io/blog/build-vs-buy-scraping-infrastructure) ставит цифры на эту линию.

## Часто задаваемые вопросы

### Как извлекать данные о продуктах 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](https://quantumproxies.io/scraper-api)
