Получить цену со страницы товара Amazon звучит тривиально, пока не попробуешь автоматизировать это в масштабе. Страница рендерится на стороне клиента, разметка меняется между макетами, и один и тот же товар может одновременно показывать цену по акции, прейскурантную цену, купон и цену по подписке. Прежний ответ представлял собой набор хрупких CSS-селекторов или XPath, ломавшихся при каждом обновлении Amazon. Искусственный интеллект меняет расчёт: вместо того чтобы описывать, где в DOM находится цена, вы передаёте модели содержимое страницы и говорите ей, что вам нужно, на простом языке.
В этом руководстве показано, как надёжно парсить цены с Amazon с помощью AI. Используйте Crawling API для загрузки и рендеринга публичной страницы товара в чистый markdown, затем передайте этот контент большой языковой модели, которая вернёт цену и связанные поля в виде структурированного JSON. Разделение задач является ключевым: Crawlbase обрабатывает загрузку и рендеринг через настоящий браузер за доверенным IP, модель обрабатывает чтение и структурирование. Каждый инструмент выполняет ту часть работы, в которой он действительно хорош.
Зачем сочетать AI со слоем загрузки
Языковая модель хорошо умеет читать неструктурированный контент и возвращать структурированные данные по запросу. Чего она не может делать, так это загружать веб-страницу. У неё нет HTTP-клиента, браузера, пула прокси и возможности преодолеть антибот-защиту, которая охраняет такой сайт, как Amazon. Передайте ей URL, и она не сможет его открыть; передайте ей сырой HTML, собранный самостоятельно, и она будет извлекать данные из того, что вы реально получили, а на Amazon это обычно почти пустой каркас или страница CAPTCHA.
Этот пробел и заполняет слой загрузки. Amazon рендерит цены и наличие в браузере и быстро атакует автоматизированный трафик, поэтому обычный запрос requests.get обычно возвращает статус 200 без нужных вам данных. Вам нужен браузер, запускающий JavaScript страницы, и IP, который сайт воспринимает как адрес настоящего посетителя. Можно собрать это самостоятельно с помощью headless-браузера плюс ротирующихся жилых прокси, однако поддержание такой инфраструктуры в рабочем состоянии составляет большую часть работы. Crawling API объединяет оба компонента в одном вызове: передайте URL с JavaScript-токеном, он рендерит страницу и возвращает готовый контент, подготовленный для модели.
Сохраняйте чёткое разграничение. Crawlbase загружает и рендерит страницу Amazon в чистый markdown. Модель извлекает цену и связанные поля из этого контента. Модель никогда не обращается к сети в этой схеме, а Crawlbase никогда не пытается понять данные. Смешение этих двух задач является наиболее распространённой причиной ненадёжности таких пайплайнов.
Законно ли парсить цены Amazon?
Это зависит от условий обслуживания Amazon, вашей юрисдикции и того, как вы используете данные. Условия Amazon ограничивают автоматизированный доступ, поэтому парсинг может нарушать эти условия независимо от тщательности вашего инструментария. Ни один из приведённых здесь кодов этого не меняет; он лишь обеспечивает техническую работоспособность. Относитесь к правовому вопросу серьёзно, а не как к формальности.
Несколько правил, которых стоит придерживаться. Собирайте только публичные данные: цены, заголовки, рейтинги и наличие, которые может видеть любой пользователь на странице товара без входа в систему. Соблюдайте файл robots.txt Amazon и заявленные ожидания по частоте запросов, держите объём запросов достаточно низким, чтобы не создавать нагрузку на серверы. Если вы планируете повторно использовать данные в коммерческих целях, получите разрешение или официальное соглашение о данных, а не предполагайте, что молчание означает согласие. И никогда не собирайте персональные данные, включая всё, что связано с отдельными аккаунтами покупателей или отзывами, по которым можно идентифицировать человека.
Это пошаговое руководство намеренно ограничено публичными данными о товарах, поскольку это та граница, которая делает работу обоснованной. Оно не охватывает ничего, что находится за авторизацией, данных аккаунтов или заказов, платёжных процессов или любых попыток обойти аутентификацию. Если ваш проект требует большего, чем публичные страницы товаров, правильным решением является официальный API или соглашение о данных с Amazon, а не более изощрённый скрапер.
Что вы создадите
Небольшой работающий скрипт на Python, который принимает URL товара Amazon, загружает отрендеренную страницу через Crawling API в виде чистого markdown, отправляет этот markdown языковой модели с запросом на извлечение и записывает структурированный результат в JSON-файл. Мы направим его на реальную страницу товара, но тот же скрипт работает с любым публичным URL Amazon, который вы подставите.
Настройка окружения
Вам нужен Python 3.8 или новее. Проверьте вашу версию, создайте виртуальное окружение для изоляции зависимостей проекта, затем установите библиотеки.
python --version python -m venv amazon_env source amazon_env/bin/activate pip install openai crawlbase python-dotenv
В Windows активируйте окружение командой amazon_env\Scripts\activate вместо строки с source. Три зависимости выполняют основную работу: crawlbase является официальным клиентом для Crawling API, openai является клиентом для языковой модели, а python-dotenv загружает ваши ключи из локального файла, чтобы они никогда не попали жёстко закодированными в скрипт.
Вам нужны два учётных данных. Получите API-ключ вашего провайдера модели в его дашборде, а JavaScript (JS) токен Crawlbase получите в дашборде Crawlbase после регистрации. Сохраните оба в файл .env в папке вашего проекта.
OPENAI_API_KEY=your_model_api_key_here CRAWLBASE_JS_TOKEN=your_crawlbase_js_token_here
Crawlbase предлагает два типа токенов. Обычный токен загружает статичный HTML; JavaScript (JS) токен сначала рендерит страницу в настоящем браузере. Amazon загружает цены на стороне клиента, поэтому JS-токен является правильным выбором здесь. Использование обычного токена на странице с клиентским рендерингом возвращает тот же пустой каркас, что и обычный запрос, и модель не сможет извлечь цену, которой никогда там не было.
Шаг 1: Загрузка отрендеренной страницы Amazon
Crawling API может возвращать страницу, уже конвертированную в markdown, что именно и нужно перед отправкой в языковую модель. Markdown убирает шум навигации, скриптов и стилей, оставляя читабельный контент. Это сокращает количество токенов, отправляемых модели, что делает вызов дешевле, а извлечение точнее. Передайте параметр format: 'markdown', и API вернёт чистый текст вместо сырого HTML.
import os from dotenv import load_dotenv from crawlbase import CrawlingAPI load_dotenv() api = CrawlingAPI({"token": os.environ["CRAWLBASE_JS_TOKEN"]}) url = "https://www.amazon.com/dp/B0CHX1W1XY" def fetch_markdown(target_url): options = {"format": "markdown", "ajax_wait": "true", "page_wait": 3000} response = api.get(target_url, options) return response["body"].decode("utf-8") page_markdown = fetch_markdown(url) print(page_markdown[:500])
Оба параметра ожидания важны для цели с клиентским рендерингом, такой как Amazon. ajax_wait указывает API дождаться завершения загрузки асинхронного контента, а page_wait выдерживает фиксированное количество миллисекунд после загрузки, чтобы поздно отрисовываемые элементы с ценой появились перед сохранением страницы. Три секунды являются разумным начальным значением; увеличьте время, если цена не отображается. Запустите скрипт и вы должны увидеть реальную разметку товара в выводе, а не пустой каркас, что подтверждает работоспособность рендеринга ещё до написания единственной строки логики извлечения.
Модель AI читает страницы, но не загружает их. Crawling API закрывает этот пробел одним вызовом: передайте JS-токен, он рендерит страницу Amazon в настоящем браузере, ротирует жилые IP на стороне сервера и возвращает чистый HTML или готовый для LLM markdown, избавляя от необходимости управлять парком headless-браузеров и пулом прокси самостоятельно. Начните с публичной страницы товара на бесплатном тарифе.
Шаг 2: Отправка контента модели с запросом JSON
Имея чистый markdown, опишите нужные поля в промпте и позвольте модели выполнить извлечение. Ключевой приём для надёжного пайплайна состоит в принудительном получении JSON-вывода. Клиент OpenAI поддерживает формат ответа JSON, поэтому установите его, и модель будет возвращать парсируемый JSON вместо прозы, обёрнутой в блоки кода. Этот единственный параметр устраняет большую часть хрупкости, на которую жалуются люди при LLM-извлечении.
from openai import OpenAI client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) def extract_fields(content): prompt = f"""You are a data extraction tool. From the Amazon product page content below, extract the product title, current price, list price, currency, rating, review count, and availability. Return only JSON with keys: title, price, list_price, currency, rating, reviews, availability. Use null for any field not present. CONTENT: {content} """ response = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}], response_format={"type": "json_object"}, ) return response.choices[0].message.content raw_json = extract_fields(page_markdown) print(raw_json)
Несколько вещей делают этот промпт рабочим. Он задаёт роль («инструмент извлечения данных»), чтобы модель оставалась лаконичной; он называет точные нужные ключи, чтобы схема была стабильной между запусками; и он указывает модели использовать null для отсутствующих полей, чтобы товар без прейскурантной цены не нарушал вывод. Передача markdown вместо сырого HTML означает, что модель тратит своё внимание на контент, а не на шаблонный код. Если вам нужна более богатая схема, добавьте больше ключей и опишите неоднозначные; модель обрабатывает вложенные объекты и массивы без дополнительных усилий.
Шаг 3: Разбор и сохранение структурированного результата
Поскольку вы запросили формат ответа JSON, текст ответа уже является валидным JSON. Разберите его в словарь Python и запишите на диск. Оберните разбор в блок try/except, чтобы редкий некорректный ответ логировал сырой текст вместо сбоя запуска.
import json def save_json(raw, path="amazon_price.json"): try: data = json.loads(raw) except json.JSONDecodeError: print("Model did not return valid JSON:") print(raw) return with open(path, "w") as f: json.dump(data, f, indent=2) print(f"Saved {path}") save_json(raw_json)
Полный скрипт
Вот всё, собранное в один работающий файл. Заполните два учётных данных в .env, измените URL на интересующий вас товар и скорректируйте ключи промпта под нужные поля.
import os import json from dotenv import load_dotenv from crawlbase import CrawlingAPI from openai import OpenAI load_dotenv() api = CrawlingAPI({"token": os.environ["CRAWLBASE_JS_TOKEN"]}) client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) url = "https://www.amazon.com/dp/B0CHX1W1XY" def fetch_markdown(target_url): options = {"format": "markdown", "ajax_wait": "true", "page_wait": 3000} response = api.get(target_url, options) return response["body"].decode("utf-8") def extract_fields(content): prompt = f"""You are a data extraction tool. From the Amazon product page content below, extract the product title, current price, list price, currency, rating, review count, and availability. Return only JSON with keys: title, price, list_price, currency, rating, reviews, availability. Use null for any field not present. CONTENT: {content} """ response = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}], response_format={"type": "json_object"}, ) return response.choices[0].message.content def main(): markdown = fetch_markdown(url) raw = extract_fields(markdown) try: data = json.loads(raw) except json.JSONDecodeError: print("Model did not return valid JSON:", raw) return with open("amazon_price.json", "w") as f: json.dump(data, f, indent=2) print(json.dumps(data, indent=2)) if __name__ == "__main__": main()
Как выглядит результат
Запустите скрипт командой python amazon_scraper.py и получите чистые структурированные данные, записанные в amazon_price.json и выведенные на консоль.
{ "title": "Echo Dot (5th Gen) Smart speaker with Alexa", "price": "$34.99", "list_price": "$49.99", "currency": "USD", "rating": "4.7", "reviews": "128,540", "availability": "In Stock" }
Обратите внимание на то, чего вы не писали: никаких CSS-селекторов, XPath, никакой логики разбора для каждого поля, чтобы отделить акционную цену от прейскурантной. Вы описали поля, и модель их нашла. Направьте тот же скрипт на другой товар или даже на страницу результатов поиска, и он адаптируется без изменений кода, что является реальным преимуществом подхода AI-извлечения данных перед точно настроенными селекторами. Для того же паттерна с другой моделью см. как использовать Gemini AI для веб-скрапинга.
Масштабирование на множество товаров
Одна страница является демонстрацией; реальная задача мониторинга цен охватывает список товаров. Структура остаётся той же: перебирайте URL, загружайте каждый через Crawling API, извлекайте с помощью модели и собирайте строки. Два момента, которые нужно учитывать при масштабировании. Модель тарифицируется по токенам, поэтому отправка markdown вместо полного HTML снижает стоимость каждого вызова, а Crawling API имеет собственную пропускную способность, так что вам не нужно самостоятельно управлять прокси или экземплярами браузера.
urls = [ "https://www.amazon.com/dp/B0CHX1W1XY", "https://www.amazon.com/dp/B09B8V1LZ3", ] results = [] for u in urls: markdown = fetch_markdown(u) raw = extract_fields(markdown) try: row = json.loads(raw) row["url"] = u results.append(row) except json.JSONDecodeError: print(f"Skipped {u}: invalid JSON") with open("prices.json", "w") as f: json.dump(results, f, indent=2)
Если вы специально и регулярно парсите Amazon, стоит сравнить этот подход с Crawling API, который возвращает готовый JSON для поддерживаемых сайтов, включая Amazon, без LLM в цикле. Для часто используемых сценариев он быстрее и дешевле. Подход с AI в данном руководстве является гибким запасным вариантом для нестандартных макетов, разовых товаров или полей, которые специальный парсер не раскрывает. Объяснение того, почему markdown является правильным форматом входных данных для модели, см. в готовом для LLM markdown для веб-скрапинга.
Ограничения, о которых нужно знать перед выходом в прод
Пайплайн AI плюс Crawlbase является гибким, но не подходит для каждой задачи. Имейте в виду следующее.
Стоимость токенов накапливается. Модель тарифицирует каждый отправленный и полученный токен. Отправка полного HTML вместо markdown может умножить ваш счёт без какой-либо выгоды, поэтому всегда сокращайте входные данные. Для очень больших страниц извлеките только релевантный раздел перед вызовом модели.
Это медленнее, чем разбор по правилам. Обращение к LLM занимает больше времени, чем проход по CSS-селектору в BeautifulSoup или Cheerio. Для высокочастотных задач с малой задержкой, таких как мониторинг цен посекундно, побеждает специализированный парсер или Scraper API. Подход с AI отлично подходит, когда макеты варьируются или часто меняются.
Модели могут ошибаться. Страницы Amazon плотные и повторяющиеся, поэтому модель может изредка захватить цену связанного товара или перепутать акционную цену с прейскурантной. Принудительный JSON-вывод и именование точных ключей значительно снижают это, но для критически важных задач валидируйте разобранный словарь по ожидаемой схеме перед тем, как доверять ему.
Для защиты от блокировок в объёме Crawling API обрабатывает ротацию IP и рендеринг за вас. Если вы предпочитаете маршрутизировать собственный трафик через ротируемый пул, Smart AI Proxy предоставляет ту же ротацию жилых IP в качестве подставного прокси-эндпоинта. В любом случае, подробная инструкция находится в руководстве по скрапингу без блокировок, а более широкий контекст электронной коммерции представлен в веб-скрапинге в электронной коммерции.
Ключевые выводы
- Разделяйте задачи. Crawlbase загружает и рендерит страницу Amazon; модель извлекает цену и связанные поля. Ни один инструмент не выполняет работу другого, и именно это разделение обеспечивает надёжность пайплайна.
-
Используйте JS-токен и формат markdown. JS-токен рендерит клиентские цены Amazon; параметр
format: 'markdown'возвращает чистый контент с малым количеством токенов, который является идеальным входом для модели. - Принудительно получайте JSON-вывод. Установите формат ответа как JSON-объект и назовите точные ключи, чтобы результат был парсируемым при каждом запуске.
- Селекторы не нужны. Вы описываете поля на простом языке, поэтому тот же скрипт адаптируется к разным макетам товаров без переписывания кода извлечения.
- Оставайтесь в рамках публичных данных. Соблюдайте условия использования Amazon и файл robots.txt; никаких аккаунтов, данных заказов, обхода аутентификации; при важности скорости обращайтесь к Scraper API.
Часто задаваемые вопросы
Может ли модель AI самостоятельно парсить цены Amazon?
Нет, в части загрузки. Языковая модель читает и структурирует контент, который вы ей передаёте, но у неё нет HTTP-клиента, браузера или пула прокси, поэтому она не может открыть URL Amazon или преодолеть антибот-защиту. Вы сочетаете её со слоем загрузки, таким как Crawling API, который рендерит страницу и возвращает чистый markdown; модель затем извлекает цену и другие поля из этого контента.
Зачем конвертировать страницу Amazon в markdown перед отправкой модели?
Markdown убирает шум навигации, скриптов и стилей, оставляя читабельный контент. Это снижает количество токенов, отправляемых модели, что уменьшает стоимость и улучшает точность, поскольку модель тратит своё внимание на реальные данные о товаре, а не на шаблонный код. Crawling API может возвращать markdown напрямую с параметром format: 'markdown', так что отдельный шаг конвертации не нужен.
Нужен ли обычный токен или JS-токен для Amazon?
Используйте JS-токен. Amazon рендерит цены на стороне клиента, поэтому обычный токен возвращает пустой каркас, и модели нечего извлекать. JS-токен сначала рендерит страницу в настоящем браузере, поэтому цена и наличие присутствуют, когда контент достигает модели.
Стоит ли использовать Scraper API вместо этого для Amazon?
Зачастую да. Crawling API возвращает готовый JSON для Amazon без LLM в цикле, что быстрее и дешевле для рутинного мониторинга цен. Подход с AI в данном руководстве является гибким запасным вариантом для нестандартных макетов, разовых товаров или полей, которые парсер не раскрывает. Многие команды используют Scraper API для массовых задач и пайплайн с AI для пограничных случаев.
Законно ли парсить цены с Amazon?
Это зависит от условий использования Amazon, вашей юрисдикции и цели; их условия ограничивают автоматизированный доступ. Строго ограничивайтесь публичными данными о товарах, такими как цены, заголовки и рейтинги, соблюдайте файл robots.txt и ожидания по частоте запросов и никогда не обращайтесь к аккаунтам, данным заказов, платёжным процессам или аутентификации. Для коммерческого повторного использования получите разрешение или официальное соглашение о данных, а не полагайтесь на скрапер.
Как избежать блокировок при парсинге цен Amazon?
Держите скорость запросов на каждый IP низкой, варьируйте загружаемые товары вместо перегрузки одного URL и маршрутизируйте через ротирующиеся жилые IP, чтобы ни один адрес не превысил лимит запросов. Crawling API управляет ротацией и доверенным пулом IP за вас; если вы собираете собственную инфраструктуру, именно в это стоит инвестировать. Следите за кодами статусов и снижайте нагрузку, когда начинают появляться CAPTCHA.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
