На любой странице продукта Amazon с несколькими продавцами ровно одно предложение занимает главное место рядом с кнопками «Добавить в корзину» и «Купить сейчас». Это место называется Buy Box, и оно собирает подавляющее большинство продаж объявления. Исследования показывают, что около 90% покупок на Amazon проходят через Buy Box, а не через список «Другие продавцы» в нижней части страницы. Для продавца, конкурирующего в рамках общего объявления, победа или поражение в Buy Box, это разница между стабильным потоком заказов и почти полной тишиной.

Это руководство показывает, как парсить данные Amazon Buy Box на Python для отслеживания выигрышного предложения со временем. Вы создадите небольшой рабочий скрапер, который получает отрисованную страницу продукта через Crawling API, парсит её с помощью BeautifulSoup и извлекает поля, определяющие текущий Buy Box: выигрышную цену, продавца, кто выполняет заказ и наличие товара. Руководство намеренно ограничено публичными данными страниц продуктов, а правовой раздел в конце стоит прочитать, прежде чем применять это к реальным объёмам.

Что вы создадите

Скрипт на Python, который принимает URL продукта Amazon, получает отрисованную страницу через Crawling API и извлекает структурированную запись, описывающую текущего победителя Buy Box. В качестве рабочего примера мы используем объявление телефона Motorola и извлекаем следующие поля:

  • Название продукта название продукта, представленного в Buy Box.
  • Цена текущая цена выигрышного предложения, которая меняется по мере конкуренции продавцов.
  • Имя продавца кто в данный момент удерживает Buy Box: сам Amazon или сторонний продавец.
  • Имя поставщика кто выполняет заказ, что говорит вам о FBA (выполнено Amazon) или выполнении продавцом.
  • Наличие статус наличия в продаже, отображаемый рядом с предложением.
  • Кнопки «Купить сейчас» / «Добавить в корзину» присутствуют ли кнопки покупки, что подтверждает активный Buy Box, а не недоступное объявление.

Что такое Amazon Buy Box и почему продавцы его отслеживают

Buy Box, это предложение в рамке справа на странице продукта, которое содержит цену, данные продавца и способ выполнения заказа, строку о наличии и кнопки «Добавить в корзину» и «Купить сейчас». Когда несколько торговцев продают один и тот же продукт в рамках одного объявления, Amazon выбирает одно предложение для отображения там. Большинство покупателей нажимают «Добавить в корзину», не прокручивая до «Другие продавцы на Amazon» или «Сравнить с похожими товарами», поэтому отображаемое предложение и получает продажу. Amazon теперь официально называет это Featured Offer, хотя большинство продавцов по-прежнему говорят Buy Box.

Алгоритм определения выигрышного предложения учитывает цену, скорость и стоимость доставки, показатели эффективности продавца, способ выполнения заказа и наличие товара, и он постоянно пересчитывается. Конкурент, снизивший вашу цену на несколько центов или перешедший на более быстрое выполнение, может отнять Buy Box менее чем за час. Поскольку позиция меняется в режиме реального времени, продавцы отслеживают её программно, а не вручную:

  • Мониторинг в реальном времени. Buy Box постоянно меняется. Скрапер, который выборочно проверяет объявление по расписанию, говорит вам, кто его удерживает сейчас и как часто он меняется, что невозможно отслеживать вручную в рамках каталога.
  • Анализ цен. Цена является одним из наиболее весомых факторов в решении, поэтому знание текущей выигрышной цены позволяет скорректировать свою для конкуренции. Более широкую схему см. в нашем руководстве по веб-скрапингу для анализа цен.
  • Анализ конкурентов. Отслеживание того, кто побеждает, по какой цене и с каким способом выполнения, показывает, что нужно для конкуренции в рамках данного объявления.
  • Стратегия в масштабе. По сотням объявлений автоматизированный сбор является единственным практическим способом следить за каждым продуктом и реагировать достаточно быстро.

Почему обычный запрос не работает на Amazon

Если запросить URL продукта Amazon с помощью простого HTTP-клиента, вы получите статус 200 и страницу почти без данных Buy Box. Против вас работают два фактора. Во-первых, Amazon загружает большую часть блока предложения, включая данные продавца, способ выполнения и наличие, динамически через JavaScript и AJAX после поступления начального HTML. Необработанный запрос захватывает оболочку до того, как эти части отрисовываются. Во-вторых, Amazon быстро помечает автоматизированный трафик: IP-адреса датацентров и небраузерные паттерны запросов сталкиваются с CAPTCHA, ограничением частоты или прямой IP-блокировкой ещё до достижения отрисованного предложения.

Поэтому рабочий скрапер Amazon требует двух вещей в одном запросе: настоящего браузера, отрисовывающего страницу, и IP-адреса, который платформа воспринимает как обычного покупателя. Можно собрать это самостоятельно, используя headless-браузер и пул ротируемых резидентных прокси, но их совместная настройка и поддержание в рабочем состоянии занимает большую часть работы. Crawling API объединяет обе задачи в один вызов: вы отправляете ему URL с токеном JavaScript, он отрисовывает страницу за доверенным резидентным IP-адресом и возвращает готовый HTML для парсинга.

Зачем нужен JS-токен

Crawlbase предлагает два типа токенов. Обычный токен получает статический HTML; токен JavaScript (JS) сначала отрисовывает страницу в настоящем браузере. Amazon загружает свой блок предложения на стороне клиента, поэтому здесь нужен JS-токен. Обычный токен возвращает ту же частичную оболочку, что и обычный запрос, и в ней нет полей Buy Box для парсинга.

Предварительные требования

Перед написанием кода необходимо подготовить несколько вещей. Это не займёт много времени.

Базовые знания Python. Вы должны уметь писать и запускать скрипты Python, а также устанавливать пакеты с помощью pip. Если вы новичок в языке, наше введение в скрапинг с Python и официальная документация выведут вас на уровень, который предполагается в этом руководстве.

Python 3.8 или выше. Проверьте свою версию командой python --version. Если у вас её нет, установите с python.org или через дистрибутив, например Anaconda.

Аккаунт Crawlbase и JS-токен. Зарегистрируйтесь, откройте панель управления и скопируйте токен JavaScript (JS). Crawlbase даёт вам 1000 бесплатных запросов к Crawling API для начала, карта не требуется. Относитесь к токену как к паролю: он аутентифицирует ваши запросы, поэтому не включайте его в систему контроля версий.

Настройка проекта

Создайте виртуальное окружение, чтобы зависимости проекта оставались изолированными, затем установите три библиотеки, необходимые скраперу.

bash
python --version

python -m venv buybox_env
source buybox_env/bin/activate

pip install crawlbase beautifulsoup4 pandas

В Windows активируйте окружение командой buybox_env\Scripts\activate вместо строки source. Три зависимости выполняют основную работу: crawlbase является официальным клиентом для Crawling API, beautifulsoup4 парсит возвращаемый HTML, позволяя извлекать каждое поле по CSS-селектору, а pandas записывает записи в CSV в конце, чтобы вы могли добавлять выборки со временем.

Шаг 1: получение отрисованной страницы продукта

Начните с получения готовой страницы. Импортируйте класс CrawlingAPI, инициализируйте его с JS-токеном и запросите URL продукта. Два параметра ожидания важны здесь, поскольку блок предложения отрисовывается позже. Проверка кода статуса перед парсингом делает ошибки явными, а не скрытыми.

python
from crawlbase import CrawlingAPI

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"})

def crawl(product_url):
    options = {"page_wait": 2000, "ajax_wait": "true"}
    response = api.get(product_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/Motorola-Stylus-Battery-Unlocked-Emerald/dp/B0BFYRV4CD"
    html = crawl(product_url)
    print(html[:500] if html else "No HTML returned")

Два параметра ожидания обеспечивают работу динамической цели. ajax_wait указывает API ждать завершения загрузки асинхронного контента, а page_wait удерживает фиксированное количество миллисекунд после загрузки, чтобы блок предложения с поздней отрисовкой появился до захвата страницы. Тело декодируется как latin1, поскольку страницы Amazon содержат символы, которые могут вызвать ошибку при строгом декодировании UTF-8. Запустите скрипт, и вы должны увидеть реальную разметку продукта, а не частичную оболочку, возвращаемую обычным запросом. Это подтверждает работоспособность рендеринга, прежде чем писать хоть один селектор.

Crawlbase Amazon Scraper

Блок предложения заполнился только потому, что страница отрисовалась за доверенным IP-адресом. Crawling API принимает JS-токен, запускает страницу в настоящем браузере, ротирует резидентные IP-адреса на стороне сервера и передаёт готовый HTML, поэтому вам не нужно самостоятельно запускать headless-флот и пул прокси. Начните с одного URL продукта на бесплатном тарифе.

Шаг 2: осмотр страницы и сопоставление селекторов

Прежде чем писать парсер, откройте страницу продукта в браузере, нажмите правой кнопкой мыши на блок предложения и выберите «Просмотр кода». Каждое поле Buy Box находится в стабильном элементе, на который можно таргетироваться по CSS-селектору. Наводите указатель мыши на элементы в панели инструментов разработчика, чтобы увидеть, какую часть страницы они охватывают, затем копируйте селектор. Вот устойчивые селекторы для полей Buy Box, взятые с живой страницы продукта Amazon:

  • Название продукта #productTitle
  • Цена .a-price .a-offscreen (доступная копия строки цены)
  • Наличие #availability span
  • Имя поставщика #fulfillerInfoFeature_feature_div span.offer-display-feature-text-message
  • Имя продавца #merchantInfoFeature_feature_div span.offer-display-feature-text-message
  • Кнопка «Купить сейчас» span#submit.buy-now и кнопка «Добавить в корзину» span#submit.add-to-cart

Селекторы поставщика и продавца являются двумя, которые говорят вам о том, как выигрывается предложение. Когда оба показывают "Amazon.com", заказ продаётся и выполняется Amazon. Когда продавец является третьей стороной, но поставщик, Amazon, это FBA-предложение (выполнено Amazon). Когда сторонний продавец также осуществляет доставку, предложение выполняется продавцом. Отслеживание этих двух полей со временем показывает вам не только ценовую войну за объявление, но и стратегию выполнения того, кто в нём побеждает.

Шаг 3: парсинг данных Buy Box с помощью BeautifulSoup

Имея отрисованный HTML, загрузите его в BeautifulSoup и извлеките каждое поле по его селектору. Две небольшие вспомогательные функции поддерживают чистоту извлечения: одна возвращает текст элемента или значение по умолчанию при его отсутствии, другая сообщает о наличии кнопки. Обратите внимание, что ID с точками (submit.buy-now и submit.add-to-cart) экранируются в CSS-селекторе как submit\.buy-now, поскольку голая точка читается как класс.

python
from bs4 import BeautifulSoup

def scrape_buy_box(html_content):
    soup = BeautifulSoup(html_content, "html.parser")
    buy_box = {}

    def text_or_default(selector, default="Not found"):
        el = soup.select_one(selector)
        return el.text.strip() if el else default

    def is_present(selector):
        return "Present" if soup.select_one(selector) else "Not Present"

    buy_box["Buy Now Button"] = is_present("span#submit\\.buy-now")
    buy_box["Add to Cart Button"] = is_present("span#submit\\.add-to-cart")
    buy_box["Availability"] = text_or_default("#availability span")
    buy_box["Product Title"] = text_or_default("#productTitle")
    buy_box["Price"] = text_or_default(".a-price .a-offscreen")
    buy_box["Shipper Name"] = text_or_default(
        "#fulfillerInfoFeature_feature_div span.offer-display-feature-text-message"
    )
    buy_box["Seller Name"] = text_or_default(
        "#merchantInfoFeature_feature_div span.offer-display-feature-text-message"
    )

    return buy_box

Каждый поиск выполняется через text_or_default, поэтому отсутствующий элемент возвращает "Not found", а не выбрасывает исключение при обращении к .text пустого объекта. Эта устойчивость важна здесь: когда у объявления нет текущего Buy Box или товар отсутствует на складе, несколько из этих полей будут отсутствовать, и вам нужна чистая запись, которая это отражает, а не сбой. Вспомогательная функция is_present превращает наличие кнопок покупки в простой флаг, что является самым быстрым сигналом о том, что предложение в данный момент можно купить.

Шаг 4: сборка полного скрипта

Теперь свяжите получение данных, парсинг и хранение в один рабочий скрипт. Он сканирует страницу продукта, извлекает запись Buy Box, выводит её в формате JSON и добавляет в CSV, чтобы вы могли формировать историю выборок со временем.

python
import json
import os
from datetime import datetime, timezone
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup
import pandas as pd

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"})

def crawl(product_url):
    options = {"page_wait": 2000, "ajax_wait": "true"}
    response = api.get(product_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("latin1")
    print(f"Request failed: {response['status_code']}")
    return None

def scrape_buy_box(html_content):
    soup = BeautifulSoup(html_content, "html.parser")
    buy_box = {}

    def text_or_default(selector, default="Not found"):
        el = soup.select_one(selector)
        return el.text.strip() if el else default

    def is_present(selector):
        return "Present" if soup.select_one(selector) else "Not Present"

    buy_box["Buy Now Button"] = is_present("span#submit\\.buy-now")
    buy_box["Add to Cart Button"] = is_present("span#submit\\.add-to-cart")
    buy_box["Availability"] = text_or_default("#availability span")
    buy_box["Product Title"] = text_or_default("#productTitle")
    buy_box["Price"] = text_or_default(".a-price .a-offscreen")
    buy_box["Shipper Name"] = text_or_default(
        "#fulfillerInfoFeature_feature_div span.offer-display-feature-text-message"
    )
    buy_box["Seller Name"] = text_or_default(
        "#merchantInfoFeature_feature_div span.offer-display-feature-text-message"
    )

    return buy_box

def save_to_csv(record, path="buy_box_history.csv"):
    record["Captured At"] = datetime.now(timezone.utc).isoformat()
    df = pd.DataFrame([record])
    write_header = not os.path.exists(path)
    df.to_csv(path, mode="a", header=write_header, index=False)

def main():
    product_url = "https://www.amazon.com/Motorola-Stylus-Battery-Unlocked-Emerald/dp/B0BFYRV4CD"
    html = crawl(product_url)
    if not html:
        return
    buy_box = scrape_buy_box(html)
    print(json.dumps(buy_box, indent=2))
    save_to_csv(buy_box)

if __name__ == "__main__":
    main()

Скрипт сканирует страницу, парсит Buy Box и добавляет одну строку с временной меткой за каждый запуск в buy_box_history.csv. Поле Captured At превращает единичный снимок в отслеживание: запускайте скрипт по расписанию (cron, планировщик задач или обратный вызов асинхронного Crawler), и каждая строка фиксирует, кто удерживал Buy Box, по какой цене и с каким способом выполнения в известный момент. Сравнение этих строк за дни или недели показывает, как часто меняется победитель и какая цена нужна для удержания позиции.

Как выглядит вывод

Запустите полный скрипт командой python scraper.py, и вы получите структурированную запись текущего Buy Box, выведенную в формате JSON и добавленную в CSV.

json
{
  "Buy Now Button": "Present",
  "Add to Cart Button": "Present",
  "Availability": "In Stock",
  "Product Title": "Motorola Moto G Stylus 5G | 2021 | 2-Day Battery | Unlocked | Made for US 4/128GB | 48MP Camera | Cosmic Emerald",
  "Price": "$149.99",
  "Shipper Name": "Amazon.com",
  "Seller Name": "Amazon.com",
  "Captured At": "2024-01-15T09:30:00+00:00"
}

В этом примере и продавец, и поставщик показывают "Amazon.com", значит Amazon сам удерживает Buy Box и выполняет заказ. В объявлении, выигранном третьей стороной, вы увидите имя торговца в поле Seller Name и либо "Amazon.com" в поле Shipper Name (FBA-предложение), либо того же торговца снова (выполнение продавцом). Сравнение этих двух полей по нескольким записям позволяет понять историю выполнения за каждой победой в Buy Box.

Масштабирование на каталог объявлений

Один URL является демонстрацией; реальный трекер следит за многими продуктами. Поскольку каждая запись Buy Box является одним независимым получением страницы, масштабирование достигается перебором списка URL продуктов с соблюдением темпа запросов, чтобы не перегружать Amazon в плотном цикле.

python
import time

def track_listings(product_urls):
    for url in product_urls:
        html = crawl(url)
        if not html:
            continue
        buy_box = scrape_buy_box(html)
        buy_box["Product URL"] = url
        save_to_csv(buy_box)
        print(f"{buy_box['Seller Name']} @ {buy_box['Price']} -> {url}")
        time.sleep(2)

Пауза time.sleep(2) между запросами задаёт темп, чтобы вы не отправляли последовательные запросы к одной цели, что является самым быстрым способом получить ограничение. Для более крупных каталогов асинхронный Crawler позволяет отправлять множество URL и получать результаты по обратному вызову вместо ожидания каждого. Если вам нужно только несколько полей и вы хотите вовсе обойти написание селекторов, Crawling API может автоматически разобрать страницы продуктов Amazon в структурированный JSON.

Как оставаться незаблокированным

Даже при решённом вопросе с рендерингом Amazon следит за трафиком, характерным для скраперов. Несколько привычек помогают поддерживать работоспособность, и они применимы к любой сложной коммерческой цели.

  • Соблюдайте темп запросов. Распределяйте получение данных с задержкой между объявлениями, а не сканируйте на полной скорости. Значение time.sleep в цикле является нижней границей, а не потолком.
  • Полагайтесь на ротацию. Пул резидентных IP-адресов распределяет запросы по множеству реальных адресов пользователей, чтобы ни один из них не превысил лимит. Crawling API обрабатывает это за вас; если вы используете собственный стек, это именно та часть, которую нужно правильно реализовать.
  • Читайте коды статусов. Прогон, который начинает возвращать запросы на проверку или коды, отличные от 200, сигнализирует о том, что текущей частоты или уровня IP уже недостаточно. Воспринимайте это как сигнал к замедлению, а не как шум, который нужно игнорировать.

Для более широкого руководства смотрите как парсить сайты, не получая блокировку. Если вы хотите парсить полное объявление, а не только Buy Box, сопутствующее руководство по парсингу данных продуктов Amazon охватывает остальную часть страницы, а наше руководство по Amazon «Бестселлеры» показывает, как собирать объявления для подачи в трекер, подобный этому.

Законно ли парсить Amazon?

Разрешённость парсинга Amazon зависит от условий использования Amazon, вашей юрисдикции и того, что вы делаете с данными. Условия использования Amazon ограничивают автоматизированный доступ и сбор данных, поэтому парсинг может противоречить этим условиям независимо от осторожности ваших инструментов. Ни один из кодов здесь не изменяет этого; он только обеспечивает работу технической части. Прочитайте Условия использования Amazon и его robots.txt, и относитесь к обоим как к границам того, что вы собираете.

Несколько правил, которых стоит придерживаться. Собирайте только публичные данные: название продукта, цену предложения, метки продавца и способа выполнения и наличие, которые любой желающий может видеть на странице продукта без учётной записи. Поддерживайте объём запросов достаточно низким, чтобы не создавать нагрузку на серверы Amazon, и соблюдайте темп, как показано выше. Избегайте персональных данных, включая всё, связанное с идентифицируемыми покупателями или рецензентами за пределами публичного текста отзыва. Не распространяйте защищённые авторским правом материалы, такие как изображения или описания продуктов, как свои собственные. Это руководство намеренно ограничено публичным блоком предложения, поэтому оно не охватывает ничего за логином: данные аккаунтов, историю заказов, панели управления Seller Central или платёжные и кассовые потоки выходят за рамки, и обход аутентификации для их получения является недопустимым для скрапера.

Если вы являетесь продавцом Amazon, санкционированным путём к собственным данным Buy Box и ценам является официальный Selling Partner API Amazon, который предоставляет структурированный, лицензированный доступ без скрапинга. Для конкурентного мониторинга в масштабе или любого использования с коммерческим распространением официальный API или соглашение об данных является правильным инструментом, когда вам нужна гарантированная структура, объём или права. Используйте скрапинг для того, в чём он хорош: лёгкое, публичное, доступное только для чтения выборочное получение страниц, которые вы могли бы открыть в браузере сами.

Итоги

Ключевые выводы

  • Buy Box, это предложение, которое выигрывает продажу. Около 90% покупок на Amazon проходят через него, поэтому продавцы отслеживают, кто его удерживает, по какой цене и с каким способом выполнения.
  • Amazon отрисовывает блок предложения на стороне клиента. Обычный запрос возвращает частичную оболочку, поэтому необходимо отрисовать страницу с JS-токеном, прежде чем появятся поля продавца, поставщика и наличия.
  • Продавец плюс поставщик рассказывают историю выполнения. Оба показывают "Amazon.com", выполнено Amazon; сторонний продавец с Amazon как поставщиком, FBA; один и тот же торговец в обоих полях, выполнение продавцом.
  • Временные метки превращают снимки в отслеживание. Добавление строки с Captured At за каждый запуск по расписанию позволяет сравнивать победы в Buy Box и изменения цен со временем.
  • Оставайтесь в рамках публичных данных. Соблюдайте условия использования и robots.txt Amazon, предпочитайте официальный Selling Partner API для лицензированных или данных продавца и никогда не трогайте аккаунты, заказы или что-либо за логином.

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

Что такое Amazon Buy Box и почему он важен?

Buy Box, это рекомендованное предложение на странице продукта, которое содержит цену, данные продавца и способа выполнения, а также кнопки «Добавить в корзину» и «Купить сейчас». Когда несколько торговцев продают один и тот же продукт, Amazon выводит одного из них там, и большинство покупателей покупают именно это предложение, не сравнивая другие. Около 90% продаж Amazon проходят через Buy Box, поэтому его выигрыш является единственным наиболее важным рычагом, который продавец в рамках общего объявления имеет над объёмом своих заказов.

Почему обычный запрос не возвращает данные Buy Box?

Потому что Amazon загружает большую часть блока предложения, включая данные продавца, поставщика и наличия, динамически через JavaScript и AJAX после поступления начального HTML. Необработанный HTTP-запрос захватывает оболочку до того, как эти части отрисовываются, поэтому нужные поля пусты. Сначала отрисовать страницу, что и делает JS-токен Crawling API, является тем, что заставляет данные Buy Box появиться в HTML для парсинга.

Как отличить FBA от предложения, выполненного продавцом?

Сравните поля Seller Name и Shipper Name. Если оба показывают "Amazon.com", Amazon продаёт и отправляет товар. Если продавец является третьей стороной, но поставщик, "Amazon.com", предложение является FBA (выполнено Amazon). Если в обоих полях значится одно и то же имя третьей стороны, продавец выполняет заказ самостоятельно. Два селектора для этих полей: #merchantInfoFeature_feature_div и #fulfillerInfoFeature_feature_div соответственно.

Как отслеживать Buy Box со временем, а не делать один снимок?

Добавляйте каждую запись как строку с временной меткой в CSV, как это делает полный скрипт с полем Captured At, и запускайте скрапер по расписанию. Cron, планировщик задач или обратный вызов асинхронного Crawler, все подходят. Имея историю, сравнивайте последовательные строки, чтобы видеть, когда менялись продавец-победитель, цена или способ выполнения для объявления.

Нужен ли мне обычный токен или JS-токен для Amazon?

JS-токен. Обычный токен получает статический HTML, который на Amazon не содержит динамически загружаемого блока предложения. JS-токен сначала отрисовывает страницу в настоящем браузере, поэтому поля Buy Box присутствуют при парсинге BeautifulSoup. Amazon требует большого JavaScript, поэтому JS-токен является правильным выбором по умолчанию для его страниц продуктов.

Мои селекторы возвращают "Not found". Что изменилось?

Обычно одно из двух. Либо Amazon обновил свою разметку, и тогда нужно повторно осмотреть живую страницу продукта в инструментах разработчика браузера и обновить селектор. Либо блок предложения не успел отрисоваться, и тогда нужно увеличить значение page_wait, чтобы API дольше удерживал состояние перед захватом HTML. Периодическое обслуживание селекторов является нормой для любого производственного скрапера, а не признаком неисправности.

Начать создавать

Обходите любой сайт в масштабе, без борьбы с инфраструктурой.

Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

Самообслуживание · Звонок отдела продаж не требуется · Доступны корпоративные объёмы краулинга