Как собирать данные о списках и продажах на eBay для исследования цен
История проданных товаров на eBay — это самое близкое к бесплатной базе данных рыночных цен, если вы знаете два параметра URL, которые её открывают. Вот как собирать списки, варианты и реальные цены транзакций в больших масштабах.
eBay — один из крупнейших площадок для торговли между частными лицами в интернете, что делает его кладезем для исследования цен, отслеживания конкурентов и оценки перепродажи. У него есть официальный SDK для разработчиков, но самые полезные данные — за сколько товары действительно были проданы — легче всего собрать прямо с публичных страниц поиска. Это руководство показывает, как собирать списки eBay, данные о вариантах и реальные цены продаж, а также как настроить прокси, чтобы скрипт продолжал работать после первых нескольких сотен запросов.
URL поиска — это API
Когда вы ищете на eBay, запрос полностью кодируется в URL, и несколько параметров контролируют, что именно возвращается. Освойте эти пять, и вы сможете управлять каталогом eBay программно, не касаясь браузера:
_nkw— ключевое слово поиска (кодируйте пробелы как +)._sacat— ограничение по категории (0 = все категории)._sop— порядок сортировки (например, недавно добавленные, цена + доставка)._pgn— номер страницы для пагинации._ipg— количество товаров на странице (по умолчанию 60; практический максимум на запрос).
Параметр сортировки _sop заслуживает упоминания: его значения упорядочивают результаты по недавно добавленным, самой низкой общей цене с учетом доставки или ближайшему завершению, что позволяет формировать целевые ленты — новые списки для мониторинга изменений, самая дешевая общая цена для поиска сделок. Ограничение с помощью _sacat сужает широкий запрос к нужному отделу, устраняя шум до того, как вы начнете анализировать данные. Ключевое слово, категория и сортировка вместе позволяют выразить большинство запросов на исследование в виде одного URL, что делает eBay приятным для автоматизации.
import requests
from urllib.parse import urlencode
proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}
def search_url(keyword, page=1, per_page=60, category=0):
params = {"_nkw": keyword, "_sacat": category,
"_ipg": per_page, "_pgn": page}
return "https://www.ebay.com/sch/i.html?" + urlencode(params)
r = requests.get(search_url("vintage seiko watch"),
proxies=proxies, timeout=20)
print(r.status_code) # parse r.text with your HTML library of choice

Проданные и завершенные списки: реальная рыночная цена
Это конечная точка, которая важна для ценообразования. Активные списки только показывают, что продавцы надеются получить; многие никогда не продаются. eBay предоставляет историю реальных транзакций на той же странице поиска через два дополнительных параметра: LH_Complete=1 показывает все завершенные списки, а LH_Sold=1 сужает до действительно проданных товаров. В проданном списке цена — это окончательная стоимость продажи, а не запрашиваемая цена, что делает это самым чистым бесплатным источником того, сколько вещи действительно стоят:
def sold_url(keyword, page=1):
# append the completed + sold filters to any search
return ("https://www.ebay.com/sch/i.html?"
f"_nkw={keyword.replace(' ', '+')}"
"&LH_Complete=1&LH_Sold=1"
f"&_ipg=60&_pgn={page}")
# every sold row = a real transaction: use median, not mean,
# to shrug off outliers and shill bids
r = requests.get(sold_url("nike dunk low panda 10"),
proxies=proxies, timeout=20)
Поскольку страница с проданными товарами использует ту же разметку, что и стандартный поиск, ваш парсер списка обрабатывает её без изменений — вы просто добавляете два фильтра. Возьмите медиану последних 30-60 проданных цен, а не среднее, и вы получите надежную рыночную стоимость, которой могут доверять рабочие процессы мониторинга цен конкурентов.
Разбор списка: цена, характеристики и варианты
Список с одним вариантом прост: цена находится в основном элементе цены, таблица характеристик товара (состояние, бренд, модель, размер) представляет собой набор пар метка/значение, а описание находится в iframe, который можно получить отдельно. Обратите внимание на региональную конвертацию цен eBay — в некоторых регионах отображается конвертированная цена вместе с оригинальной, поэтому захватывайте обе.
Многовариантные продукты (телефон с опциями модели, объема памяти и цвета) сложнее, поскольку цены за каждую опцию обновляются JavaScript. Эти данные не находятся в видимом HTML — это скрытые веб-данные, хранящиеся в переменной JavaScript под названием MSKU внутри тега <script>. Извлеките этот JSON, и вы получите цену и наличие каждого варианта за один раз, без рендеринга страницы:
import re, json
def extract_msku(html):
# the variant matrix lives in a JS object keyed 'MSKU'
m = re.search(r'"MSKU"\s*:\s*(\{.*?\})\s*[,}]', html, re.S)
if not m:
return {} # single-variant listing, no matrix
data = json.loads(m.group(1))
# data now holds per-variant price, currency and stock flags
return data
variants = extract_msku(r.text)

Оставайтесь незаблокированными в больших масштабах
Один список — это просто. Масштаб — это то, где eBay начинает сопротивляться — с ограничением скорости, CAPTCHA и динамическим контентом, который отмечает автоматические шаблоны. IP-адреса дата-центров быстро ограничиваются на торговых площадках; надежное решение — это резидентные прокси, которые представляются обычными покупателями, меняются, чтобы ни один IP не накапливал очевидный всплеск. Регулируйте запросы, уважайте любые 429 с откатом и локализуйте выход, когда вам нужны цены, специфичные для региона, так как eBay адаптирует результаты и валюту по географии.
Когда цель добавляет более жесткое управление ботами или вы не хотите поддерживать стек парсинга и ротации самостоятельно, Scraper API обрабатывает ротацию IP, рендеринг JS и повторные попытки за одним конечным пунктом и возвращает чистый HTML, JSON или markdown. Для более широкой стратегии на торговых площадках наше руководство по автоматизации торговых площадок на Amazon, eBay и Etsy охватывает безопасность аккаунта и гео-таргетинг.
Собирайте данные с eBay с чистыми резидентными прокси
От сбора до набора данных
Как только строки начинают поступать, дисциплина — это дедупликация и история. Присвойте каждому записи уникальный идентификатор товара eBay, чтобы повторный сбор обновлял существующую строку, а не дублировал её, и сохраняйте цену с отметкой времени и состоянием товара при каждом запросе — проданная цена имеет значение только в контексте её даты и состояния товара, был ли он новым или использованным. Поддерживайте скользящее окно недавних проданных данных для каждого продукта, и у вас будет живая оценка, которая обновляется сама по себе, что является основой любого инструмента перепродажи, переоценки или арбитража. Совместите это с оповещениями о резких изменениях цен, и набор данных начнет следить за вами.
Является ли сбор данных с eBay законным?
Это общая информация, а не юридическая консультация. Сбор общедоступных данных о списках — цен, условий, истории продаж — на уважительных скоростях широко считается законным. Линия, которую следует учитывать, — это персональные данные: имена продавцов, местоположения и контактные данные защищены GDPR в ЕС и аналогичными законами в других местах, поэтому избегайте их хранения без законного основания. Собирайте рыночные сигналы, а не данные о людях.
Часто задаваемые вопросы
Как собрать проданные списки eBay?
Возьмите любой URL поиска eBay и добавьте LH_Complete=1&LH_Sold=1. Это переключает результаты на завершенные списки, которые действительно были проданы, где отображаемая цена — это окончательная стоимость транзакции. Страница использует ту же разметку, что и обычный поиск, поэтому тот же парсер извлекает заголовок, цену и дату продажи для исследования цен.
Могу ли я собирать цены eBay без официального API?
Да. Публичные страницы поиска и списков возвращают все, что видит покупатель, без квот или OAuth. Параметры поиска (_nkw, _sacat, _pgn, _ipg) управляют запросами и пагинацией, а страницы продуктов содержат цену, характеристики товара и данные о вариантах. Вам понадобятся вращающиеся резидентные прокси, чтобы поддерживать объем без ограничения скорости.
Как получить цены вариантов eBay?
Списки с несколькими опциями хранят свои цены и наличие по вариантам в объекте JavaScript под названием MSKU, встроенном в тег script, а не в видимом HTML. Извлеките этот блок JSON, и вы получите цену каждой комбинации без рендеринга страницы или клика по каждой опции — намного быстрее и надежнее, чем управление браузером.
Почему мой скрипт для eBay блокируется?
eBay применяет ограничение скорости и CAPTCHA к трафику, который выглядит автоматическим, и диапазоны IP-адресов дата-центров быстро ограничиваются. Распределяйте запросы по вращающимся резидентным IP, регулируйте их с задержками, откатывайтесь на любые 429 и поддерживайте согласованность заголовков. Если проблемы продолжаются, Scraper API, который вращает IP и рендерит JavaScript, снимает бремя обслуживания.
Собирайте данные с поисковой страницы как с API, разблокируйте историю продаж с помощью двух параметров, извлекайте матрицы вариантов из встроенного JSON и направляйте все это через чистые резидентные IP. Делайте это, и eBay станет живым набором данных о ценах, который вы контролируете.