Цены на маркетплейсе постоянно меняются, и один просмотр страницы говорит вам только о том, сколько что-то стоит прямо сейчас. Прайс-инцеллидженс, это дисциплина превращения этой движущейся цели в структурированные данные, которые можно отслеживать: извлекать цены конкурентов и маркетплейсов с публичных страниц товаров, нормализовать их в чистые строки, хранить во времени и читать тренд. В этом руководстве показано, как использовать веб-скрапинг для прайс-инцеллидженс от начала до конца, с работающим Python, который можно запустить на реальных листингах уже сегодня.
Для честности всё руководство остаётся на публичных данных о товарах: названия, цены, валюты и URL листингов, которые любой может видеть без авторизации. Оно не затрагивает аккаунты пользователей, страницы за авторизацией, действия при оформлении заказа или персональные данные. В конце есть короткая заметка о ToS, которая не является шаблонной, прочитайте её перед запуском в больших объёмах.
Что на самом деле нужно ценовой аналитике
Легко думать об этом как о "скрапить цену". На практике полезная система прайс-инцеллидженс выполняет четыре задачи, и скрапинг, только первая из них.
- Собрать цены с публичных страниц, которые вас интересуют, достаточно надёжно для запуска по расписанию.
- Нормализовать беспорядочные сырые значения (символы валют, разделители тысяч, цены "от") в чистые числа.
- Сохранить каждое наблюдение с временной меткой, чтобы у вас была история, а не просто снимок.
- Проанализировать историю: сравнивать по источникам, вычислять средние значения и помечать движения, на которые стоит реагировать.
Это та же форма задачи, что и любой e-commerce веб-скрапинг. Отличие прайс-инцеллидженс в том, что ценность живёт в временном ряду, поэтому сбор должен быть воспроизводимым, а данные должны попадать туда, где их можно запрашивать позже.
Почему сбор данных, самая сложная часть
Если указать голый HTTP-клиент на страницу поиска крупного маркетплейса, обычно получаете один из двух разочаровывающих результатов: ответ 200 с почти отсутствующими данными о товарах в теле, или блокировку. Две вещи работают против вас. Многие маркетплейсы рендерят листинги в браузере через JavaScript, поэтому исходный HTML, это оболочка, заполняющаяся только после запуска скриптов. И они быстро помечают автоматический трафик: IP дата-центров и паттерны запросов, не похожие на настоящий браузер, получают вызов до того, как когда-либо увидят отрендеренный контент.
Поэтому надёжный сбор данных требует двух вещей в одном запросе: рендерера для клиентских страниц и IP, который платформа воспринимает как реального посетителя. Можно собрать всё это самостоятельно через headless-браузер плюс пул резидентских прокси, но поддержание этого флота в рабочем состоянии, большая часть работы. Crawling API объединяет и то, и другое в один вызов. Для крупных маркетплейсов он также поставляется с готовыми парсерами, поэтому можно полностью пропустить написание селекторов.
Crawling API возвращает сырой отрендеренный HTML для любого URL, который вы затем парсите самостоятельно. Crawling API и встроенные скраперы Crawling API идут на шаг дальше: для поддерживаемых сайтов вроде Amazon и eBay они возвращают чистый JSON, поэтому нет HTML-парсинга для поддержки. В этом руководстве используются встроенные скраперы для сбора и сырой HTML как запасной вариант, когда источник не поддерживается.
Настройка проекта
Вам нужен Python 3. Создайте каталог, затем установите четыре библиотеки для этого руководства: requests для HTTP, price_parser для нормализации строк валют и pandas для шага анализа.
mkdir price-intelligence && cd price-intelligence python -m venv .venv && source .venv/bin/activate pip install requests price_parser pandas
Также потребуется аккаунт Crawlbase и API-токен, который вы получаете в дашборде после регистрации. Новые аккаунты получают бесплатные запросы, поэтому можно протестировать всё ниже без каких-либо обязательств. Вставляйте токен всюду, где видите YOUR_CRAWLBASE_TOKEN.
Сбор цен с маркетплейса
Начните со страниц поиска, которые хотите отслеживать. Для товара вроде телефона поиск на Amazon и eBay по одному запросу даёт два конкурирующих источника для сравнения. Поскольку оба поддерживаются встроенными скраперами Crawling API, вы передаёте параметр scraper и получаете структурированный JSON товаров вместо HTML.
import requests import urllib.parse API_TOKEN = "YOUR_CRAWLBASE_TOKEN" API_ENDPOINT = "https://api.crawlbase.com/" def collect(url, scraper, country="US"): params = { "token": API_TOKEN, "url": url, "scraper": scraper, "country": country, } resp = requests.get(API_ENDPOINT, params=params, timeout=90) resp.raise_for_status() return resp.json()["body"]["products"] def search_url(host, path, query): q = urllib.parse.quote_plus(query) return f"https://www.{host}/{path}{q}"
Параметр scraper выполняет основную работу: amazon-serp и ebay-serp говорят API возвращать разобранные списки товаров вместо сырой разметки. Параметр country направляет запрос через IP в этом регионе, что важно, поскольку цены и доступность локализованы. Один небольшой обёртчик теперь управляет обоими источниками.
def collect_amazon(query, country="US"): url = search_url("amazon.com", "s?k=", query) return collect(url, "amazon-serp", country) def collect_ebay(query, country="US"): url = search_url("ebay.com", "sch/i.html?_nkw=", query) return collect(url, "ebay-serp", country)
Каждый вызов возвращает список словарей товаров. Форма различается по источникам (Amazon даёт name и плоскую строку price; eBay вкладывает текущую цену в price.current.to), именно поэтому следующий шаг существует.
Приведение к единому чистому формату
Сырые данные о ценах никогда не готовы к анализу. Встречаются символы валют, разделители тысяч, диапазоны "от" и разная структура полей для каждого источника. Нормализуйте при захвате, чтобы всё последующее видело одни и те же столбцы: источник, название товара, числовую цену, валюту и URL листинга. Нормализация один раз, здесь, это то, что делает код хранения и анализа простым.
from price_parser import Price def to_row(source, name, raw_price, url): parsed = Price.fromstring(raw_price or "") if parsed.amount is None: return None return { "source": source, "product": name.strip(), "price": float(parsed.amount), "currency": parsed.currency or "", "url": url, } def normalize(query, country="US"): rows = [] for item in collect_amazon(query, country): row = to_row("Amazon", item["name"], item.get("price"), item["url"]) if row: rows.append(row) for item in collect_ebay(query, country): raw = item["price"]["current"]["to"] row = to_row("eBay", item["title"], raw, item["url"]) if row: rows.append(row) return rows
price_parser берёт на себя парсинг валют: он читает "£1 138,00" или "$709.00" и возвращает чистую сумму и код валюты, поэтому задача сравнения цен никогда не должна знать, какой символ использовал источник. После этого шага каждое наблюдение выглядит одинаково независимо от источника.
[ { "source": "Amazon", "product": "Apple iPhone 15 Pro Max 256GB", "price": 1138.0, "currency": "USD", "url": "https://www.amazon.com/dp/B0DGTJ6Y1S" }, { "source": "eBay", "product": "Apple iPhone 15 Pro Max 256GB Blue Titanium", "price": 709.0, "currency": "USD", "url": "https://www.ebay.com/itm/236096139018" } ]
Прайс-инцеллидженс держится или падает на надёжном сборе данных. Crawling API рендерит клиентские страницы за ротирующими резидентскими IP в одном вызове, а для крупных маркетплейсов его встроенные скраперы возвращают чистый JSON товаров, поэтому вы пропускаете и headless-флот, и большую часть кода парсинга. Сначала укажите его на публичную страницу поиска через бесплатный тариф.
Сохраняйте каждый запуск с временной меткой
Один нормализованный список, это снимок. Прайс-инцеллидженс, это тренд, поэтому каждый запуск должен попадать в хранилище с прикреплённой временной меткой. Плоский CSV с добавленным столбцом captured_at достаточен для начала и загружается прямо в pandas или таблицу позже.
import csv, os from datetime import datetime, timezone FIELDS = ["captured_at", "source", "product", "price", "currency", "url"] def store(rows, path="price_history.csv"): stamp = datetime.now(timezone.utc).isoformat() new_file = not os.path.exists(path) with open(path, "a", newline="") as f: writer = csv.DictWriter(f, fieldnames=FIELDS) if new_file: writer.writeheader() for row in rows: writer.writerow({"captured_at": stamp, **row}) if __name__ == "__main__": rows = normalize("Apple iPhone 15 Pro Max 256GB", country="US") store(rows) print(f"stored {len(rows)} rows")
Запускайте это по расписанию (cron-задача каждые несколько часов или ежечасно, если ваш тариф позволяет), и price_history.csv превращается в настоящий временной ряд. Когда вы перерастёте плоский файл, записывайте те же строки в таблицу базы данных; нормализованная форма означает, что больше ничего не меняется. Если вы собираете данные по многим товарам и регионам, асинхронный Crawler позволяет пушить большие пакеты URL и получать результаты через вебхук, а не ждать каждого запроса по очереди.
Анализ: сравнение источников и выявление сдвигов
Имея историю на диске, анализ краток. Загрузите CSV в pandas, сгруппируйте по источнику и сравнивайте. Вот классический вопрос прайс-инцеллидженс: для данного товара где сейчас дешевле и насколько?
import pandas as pd df = pd.read_csv("price_history.csv", parse_dates=["captured_at"]) # Latest run only, for a head-to-head comparison latest = df[df["captured_at"] == df["captured_at"].max()] by_source = latest.groupby("source")["price"].agg(["mean", "min", "count"]).round(2) print(by_source) # Day-over-day move per source, from the stored history daily = df.set_index("captured_at").groupby("source")["price"] trend = daily.resample("D").mean().round(2) print(trend.pct_change().round(3))
Первый блок говорит, кто дешевле сегодня; второй превращает сохранённую историю в дневной тренд и процентное изменение, сигнал, на который вы фактически реагируете. Падение ниже порога может запустить оповещение; стабильный рост говорит, что рынок движется и вашу собственную ценовую политику стоит пересмотреть. Всё здесь, обычный pandas, потому что тяжёлая работа произошла раньше, на этапах сбора и нормализации.
Опционально: добавьте AI поверх
Машинное обучение не обязательно для прайс-инцеллидженс, но с ним становятся проще две задачи при сборе в больших масштабах.
Первая, сопоставление товаров. Один и тот же товар называется по-разному на каждом сайте ("iPhone 15 Pro Max 256GB" против "Apple iPhone 15 Pro Max (256 GB) Blue Titanium"), поэтому сравнение подобного с подобным означает кластеризацию листингов, ссылающихся на один товар. Эмбеддинг заголовков и группировка по схожести делают это гораздо лучше строкового совпадения, и это разница между реальным сравнением и шумом.
Вторая, обнаружение аномалий. На достаточно длинной истории большинство ценовых движений, нормальный сезонный дрейф. Простая скользящая статистика (помечать любое наблюдение, отклоняющееся более чем на несколько стандартных отклонений от скользящего среднего товара) улавливает настоящие события: внезапный демпинг или ошибку ценообразования, не заставляя вас смотреть на дашборд. Начните с этого правила; обращайтесь к модели только когда простой вариант перестаёт хватать.
Как избежать блокировок при масштабировании
Даже при обработке рендеринга и IP через API несколько привычек поддерживают периодическую задачу сбора в здоровом состоянии, и они применимы к любому сложному коммерческому ресурсу.
- Задавайте темп запросов. Стандартный рейт Crawling API щедрый для e-commerce, но долбить один поиск в плотном цикле всё равно провоцирует дросселирование. Разносите запуски и варьируйте запросы. Если начинают появляться 429, это сигнал об ограничении.
- Опирайтесь на ротацию. Пул резидентских прокси распределяет запросы по множеству IP реальных пользователей, чтобы ни один адрес не достигал лимита. API делает это за вас; если вы строите собственный стек, именно эту часть нужно проработать. Smart AI Proxy предоставляет ту же ротацию как стандартный прокси-эндпоинт, если вы предпочитаете такую интеграцию.
- Следите за кодами статуса. За неудавшиеся запросы вы не платите, поэтому повторная попытка заблокированного краула дёшева. Запуск, начинающий возвращать вызовы, говорит, что текущего тира уже недостаточно.
Полное руководство, как скрапить сайты без блокировок. Если сбор данных вырастает с нескольких товаров до тысяч артикулов по регионам, масштабный e-commerce скрапинг охватывает архитектуру для таких объёмов.
Честно о главном: ToS и публичные данные
Скрапинг крупного коммерческого маркетплейса находится в правовой серой зоне, и разрешённость зависит от условий использования платформы, вашей юрисдикции и того, что вы делаете с данными. Большинство условий маркетплейсов ограничивают автоматизированный доступ, поэтому сбор данных может противоречить этим условиям независимо от аккуратности вашего инструментария. Ни один из кодов здесь не меняет этого; он просто заставляет техническую часть работать.
Несколько принципов, которых стоит придерживаться. Собирайте только публичные данные: названия товаров, цены, валюты и URL листингов, которые кто угодно видит без аккаунта. Соблюдайте robots.txt каждого сайта и его заявленные ожидания по частоте, держите объём достаточно низким, чтобы не нагружать серверы. Никогда не собирайте персональные данные, включая всё, связанное с отдельными аккаунтами продавцов или покупателей. И если вы планируете повторно использовать данные коммерчески, получите разрешение или официальное соглашение о данных, а не предполагайте, что молчание, согласие. Это руководство намеренно ограничено публичными данными листингов, потому что это линия, делающая работу защитимой.
Ключевые выводы
- Прайс-инцеллидженс, это четыре задачи, а не одна. Собрать, нормализовать, сохранить с временной меткой, затем проанализировать. Скрапинг, только первый шаг.
- Надёжный сбор требует рендеринга и доверенного IP. Crawling API делает и то, и другое в одном вызове, а его встроенные скраперы возвращают чистый JSON для поддерживаемых маркетплейсов, поэтому нет HTML-парсинга для поддержки.
- Нормализуйте при захвате. Разбирайте строки валют в числа один раз, в одну форму, и весь код хранения и анализа остаётся простым.
-
Ценность, в временном ряду. Добавляйте к каждому запуску метку
captured_at, чтобы читать тренды и суточные изменения, а не просто снимок. - AI, опциональная полировка. Эмбеддинги помогают сопоставлять один товар на разных сайтах; правило скользящей статистики помечает настоящие ценовые аномалии. Обращайтесь к ним только когда простой вариант перестаёт масштабироваться.
- Оставайтесь на публичных данных. Соблюдайте ToS и robots.txt; никаких аккаунтов, никаких персональных данных.
Часто задаваемые вопросы
Что такое веб-скрапинг для ценовой аналитики?
Это практика автоматического сбора цен с публичных страниц товаров, нормализации их в чистые числа и отслеживания во времени, чтобы можно было сравнивать конкурентов и выявлять рыночные движения. Скрапинг собирает сырые наблюдения; аналитика достигается хранением временного ряда и анализом тренда, а не чтением единственного снимка.
Нужно ли парсить HTML, чтобы собирать цены?
Не для крупных маркетплейсов. Встроенные скраперы Crawling API (и Scraper API) возвращают разобранный JSON товаров для поддерживаемых сайтов вроде Amazon и eBay, поэтому селекторы полностью пропускаются. К HTML-парсингу приходится возвращаться только когда целевой сайт не поддерживается; в этом случае API всё равно возвращает отрендеренную страницу для работы.
Как часто стоит собирать цены?
Это зависит от скорости движения вашего рынка и бюджета запросов. Ежечасно вполне достаточно для большинства каталогов; быстро меняющиеся категории могут требовать чаще, медленные, реже. Какой бы ни была периодичность, добавляйте к каждому запуску временную метку, чтобы накапливать реальную историю. Задавайте темп запросов и варьируйте запросы, чтобы периодическая задача не выглядела как взрывная атака.
Как сравнить один и тот же товар на разных сайтах?
Заголовки на каждом маркетплейсе разные, поэтому точное строковое совпадение не работает. Нормализуйте каждый листинг в одни и те же поля при захвате, затем сопоставляйте товары по схожести, а не по идентичному тексту. Для нескольких артикулов подходит ручное сопоставление; в масштабе эмбеддинг заголовков и кластеризация по схожести, надёжный подход.
Заблокируют ли меня при сборе цен в больших масштабах?
Можете, если отправляете трафик, похожий на скрапер, с одного IP. Держите скорость на IP низкой, варьируйте параметры поиска и направляйте через ротирующие резидентские IP, чтобы ни один адрес не достигал лимита. Crawling API и Smart AI Proxy управляют ротацией и пулом доверенных IP за вас; если вы строите собственный стек, именно в это стоит инвестировать. За неудавшиеся запросы вы не платите, поэтому повторная попытка заблокированного краула дёшева.
Законно ли скрапить цены для ценовой аналитики?
Это зависит от условий использования ресурса, вашей юрисдикции и цели, а большинство условий маркетплейсов ограничивают автоматизированный доступ. Строго придерживайтесь публичных данных листингов (названия, цены, валюты, URL), соблюдайте robots.txt и ожидания по частоте, никогда не трогайте аккаунты или персональные данные. Для коммерческого повторного использования получите разрешение или официальное соглашение о данных, а не полагайтесь на скрапер.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

