Сбор данных eBay через мобильные прокси
Парсинг цен товаров, метрик продавцов и ставок аукционов eBay: нативный обход Wasm-проверки splashui, двойной парсинг JSON-LD и безлимитные мобильные прокси CGNAT.
- Прохождение проверки Wasm — Chrome решает проверку splashui нативно вместо ошибки 403.
- Двойное извлечение JSON-LD и DOM — получайте канонические цены и фото с зумом 1600px без парсинга хрупкой верстки divs.
- Репутация операторского CGNAT — мобильные IP не могут быть забанены поголовно без блокировки реальных покупателей.
- Безлимитный трафик — парсите тяжелые галереи товаров без доплат за каждый гигабайт.
Пулы реальных IP мобильных операторов обходят агрессивные черные списки подсетей дата-центров.
Собирайте тысячи фотографий товаров высокого разрешения без поминутной или помегабайтной оплаты.
Общая картина: как устроены страницы eBay
Извлечение данных о товарах на eBay (цен, рейтингов продавцов, характеристик и ставок аукционов) необходимо для анализа конкурентов, мониторинга цен и исследований в e-commerce. При открытии eBay в автоматизированном браузере происходят три этапа:
- 1. Начальная проверка безопасности: eBay проверяет подпись браузера с помощью проверки splashui (app ID orch). Настоящий браузер с поддержкой WebAssembly решает этот proof-of-work за 2–3 секунды и автоматически перенаправляет на целевой товар.
- 2. Карточки результатов поиска: Поисковые запросы возвращают модульные карточки товаров (li.s-card) внутри ul.srp-results. Числовой ID объявления доступен прямо в атрибуте data-listingid или в URL товара.
- 3. Страницы объявлений о товаре: Страницы товаров содержат встроенную структурированную разметку schema.org Product JSON-LD, а также семантические списки описания (
- ) для технических характеристик.
[ 1. Start Chrome CDP ] ──► [ 2. Search eBay ] ──► [ 3. Extract JSON-LD & DOM ] ──► [ 4. Save CSV/JSON ]
Шаг 1: Запуск Chrome и подключение Playwright (4 строки)
Чтобы избежать блокировок антиботом eBay, запустите реальный Chrome с включенной удаленной отладкой, а затем подключите Playwright через Chrome DevTools Protocol (CDP).
1. Запуск Chrome с удаленной отладкой
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug
2. Подключение Python к браузеру
import asyncio
from playwright.async_api import async_playwright
async def get_page():
p = await async_playwright().start()
browser = await p.chromium.connect_over_cdp("http://localhost:9222")
context = browser.contexts[0]
return await context.new_page()
Шаг 2: Поиск товаров и обработка 2-секундной проверки
При переходе к результатам поиска eBay может показать экран 'Pardon Our Interruption...'. Настоящий Chrome выполняет клиентскую проверку Argon2 на WebAssembly за две секунды и автоматически перенаправляет на выдачу.
async def search_ebay(page, query):
url = f"https://www.ebay.com/sch/i.html?_nkw={query.replace(' ', '+')}"
await page.goto(url, wait_until="load", timeout=45000)
# If the splashui check appears, wait for automatic redirect
if "splashui" in page.url or "Pardon" in await page.title():
print("Waiting for eBay security check to pass...")
await page.wait_for_url(lambda u: "splashui" not in u, timeout=20000)
# Wait until product cards appear
await page.wait_for_selector("li.s-card, li.s-item", timeout=15000)
return await page.content()
Шаг 3: Извлечение карточек поиска (названия, цены и фото)
На странице поиска каждый товар находится внутри элемента li.s-card. Числовой ID товара извлекается из data-listingid или канонического URL.
import re
from bs4 import BeautifulSoup
def parse_search_cards(html):
soup = BeautifulSoup(html, "html.parser")
cards = soup.select("ul.srp-results > li.s-card, li.s-item")
items = []
for card in cards:
# Extract numeric Item ID from attribute or link
item_id = card.get("data-listingid")
link = card.select_one("a.s-card__link, a[href*='/itm/']")
if not link:
continue
url = link.get("href", "")
if not item_id:
m = re.search(r"/itm/(?:.*?/)?(\d{9,14})", url)
item_id = m.group(1) if m else None
# Filter out sponsored promo cards like 'Shop on eBay'
if not item_id or not item_id.isdigit():
continue
title_el = card.select_one(".s-card__title, [role='heading']")
raw_title = title_el.get_text(strip=True) if title_el else ""
title = re.sub(r"Opens in a new window or tab", "", raw_title, flags=re.I).strip()
price_el = card.select_one(".s-card__price, .s-item__price")
price = price_el.get_text(strip=True) if price_el else ""
img_el = card.select_one("img.s-card__image, img")
img = img_el.get("src") if img_el else ""
items.append({
"id": item_id,
"title": title,
"price": price,
"url": url,
"image": img
})
return items
Шаг 4: Извлечение деталей товара (Купить сейчас против Аукциона)
Страницы товаров представлены в двух форматах: фиксированная цена (Купить сейчас) и аукцион.
Вариант A: Объявление "Купить сейчас"
Идеально для каталожных цен и характеристик. Вместо парсинга хрупкой верстки извлекайте встроенную схему JSON-LD Product от eBay:
import json
def parse_product_jsonld(html):
soup = BeautifulSoup(html, "html.parser")
for s in soup.find_all("script", type="application/ld+json"):
try:
data = json.loads(s.string)
if data.get("@type") == "Product":
offers = data.get("offers", {})
return {
"title": data.get("name"),
"price": offers.get("price"),
"currency": offers.get("priceCurrency"),
"availability": offers.get("availability", "").split("/")[-1],
"images": [img.get("url") if isinstance(img, dict) else img
for img in data.get("image", [])]
}
except Exception:
continue
return {}
Извлечение технических характеристик (- )
Характеристики, такие как RAM, процессор, накопитель и модель, расположены в семантических списках описаний:
def parse_item_specifics(html):
soup = BeautifulSoup(html, "html.parser")
specs = {}
for dl in soup.select(".ux-layout-section-evo dl, dl"):
for dt, dd in zip(dl.find_all("dt"), dl.find_all("dd")):
key = dt.get_text(strip=True).rstrip(":")
val = dd.get_text(strip=True)
if key and val:
specs[key] = val
return specs
Вариант B: Страница аукциона (ставки и таймер)
Для аукционов необходимо отслеживать текущее число ставок, оставшееся время до окончания и лидирующую ставку:
def parse_auction_data(html):
soup = BeautifulSoup(html, "html.parser")
full_text = soup.get_text(separator=" ", strip=True)
# 1. Bids count
bids_match = re.search(r"(\d+)\s+bids?", full_text, re.I)
bids = int(bids_match.group(1)) if bids_match else 0
# 2. Time left countdown
time_match = re.search(r"Ends in\s+([\w\s]+?)(?:[A-Z][a-z]+day|\n|$)", full_text)
time_left = time_match.group(1).strip() if time_match else "Ended"
# 3. Current Bid Price
price_el = soup.select_one(".x-price-primary")
current_bid = price_el.get_text(strip=True) if price_el else ""
return {
"is_auction": bids_match is not None,
"current_bid": current_bid,
"bids_count": bids,
"time_left": time_left
}
Шаг 5: Сохранение собранных данных в CSV или JSON
После того как краулер соберет объявления, сохраните данные стандартными модулями csv или json:
import csv
def save_to_csv(products, filename="ebay_products.csv"):
if not products:
return
keys = products[0].keys()
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=keys)
writer.writeheader()
writer.writerows(products)
print(f"Saved {len(products)} products to {filename}")
3 практических правила защиты от блокировок IP
Маркетплейсы следят за частотой запросов и происхождением подсети. Эти три правила исключают 99% блокировок при скрапинге:
| Симптом | Основная причина | Как исправить |
|---|---|---|
| Мгновенная ошибка HTTP 403 Forbidden | Жестко прописанный фальшивый/несоответствующий User-Agent или отпечаток TLS | Используйте сессию настоящего Chrome через CDP с нативными заголовками |
| Зависание на 'Pardon Our Interruption' | Закрытие вкладки или переход до завершения Wasm-проверки splashui | Добавьте wait_for_url(lambda u: 'splashui' not in u, timeout=20000) |
| Бан по IP через 30–50 запросов | Скрапинг через статические IP дата-центров, помеченные Akamai | Маршрутизируйте трафик через выделенные мобильные прокси 4G/5G с CGNAT |
Почему eBay сжигает IP дата-центров: мобильный CGNAT против резидентных
Доверие к подсети — решающий фактор долговечности скрапинга. eBay анализирует трафик по номеру автономной системы (ASN), делая выбор архитектуры прокси критически важным:
| Тип прокси | Рейтинг доверия IP | Частота блокировок на eBay | Модель ценообразования | Идеально подходит для |
|---|---|---|---|---|
| Центр обработки данных | Низкое (Серверный ASN) | 80–95 процентов блокировок | Фиксированная за месяц | Непригодно для eBay |
| Резидентные (с оплатой за трафик) | От умеренного до высокого | Менее 10 процентов | Оплата за ГБ ($4–$8/ГБ) | Небольшие разовые проверки |
| Специализированная мобильная сеть 4G/5G | Наивысшее (Операторский CGNAT) | Менее 1 процента | Фиксированная в месяц (Безлимит) | Непрерывный парсинг каталога |
Физические мобильные прокси работают через Carrier-Grade NAT (CGNAT) в крупнейших сетях связи: EE, Vodafone, AT&T и Movistar. Поскольку операторы закрепляют тысячи мобильных телефонов за каждым публичным IPv4, маркетплейсы не могут заблокировать подсети оператора без отключения настоящих покупателей. PXM2 предоставляет выделенные модемы 4G и 5G с безлимитным трафиком, позволяя непрерывно собирать галереи товаров и цены без риска переплат за гигабайты.
Получить выделенный мобильный прокси для скрапинга eBay
Доступные локации PXM2 — выберите выделенный модем 4G/5G на нужном рынке с безлимитным трафиком и ротацией IP по запросу:
Великобритания
Испания
Индия
Часто задаваемые вопросы
Почему eBay возвращает HTTP 403 или "Pardon Our Interruption"?
eBay защищает каталог товаров промежуточным сервисом splashui (app ID orch), вычисляющим proof-of-work на Argon2 WebAssembly. Обычные библиотеки HTTP (requests, curl) не могут исполнять WebAssembly и получают 403. Реальный браузер через CDP решает проверку за 2–3 секунды и автоматически перенаправляет на страницу товара.
Можно ли парсить eBay без headless-браузера?
Только при использовании внешнего прокси с решением капчи или предварительной генерации валидных токенов сессий. Для локальных пайплайнов запуск Playwright с подключением по CDP к постоянному экземпляру Chrome — самая надежная архитектура, сохраняющая TLS-отпечатки реального браузера и нативное исполнение V8.
Как надежно извлекать состояние товара и характеристики?
Извлекайте состояние из встроенного блока JSON-LD Product schema.org (offers.itemCondition), который стандартизирует состояния в канонические значения: UsedCondition, NewCondition или RefurbishedCondition. Технические характеристики находятся в семантических списках описаний (<dl><dt><dd>) на странице товара.
В чем разница между eBay Browse API и веб-скрапингом?
Официальный Browse API идеален для синхронизации каталога, управления заказами и авторизованной работы магазина, но имеет суточные лимиты и требует одобрения. Скрапинг дает актуальный вид страницы от лица неавторизованного покупателя — включая расчет доставки по региону, промоакции продавцов и таймеры аукционов.
Как предотвратить блокировки IP на eBay при больших объемах сбора?
Соблюдайте интервалы 1.5–3.0 секунды на воркер, проверяйте точное совпадение User-Agent с версией движка браузера и направляйте трафик через выделенные мобильные прокси 4G/5G. Благодаря CGNAT тысячи телефонов делят мобильные IP, поэтому eBay не блокирует их сплошь.
Связанные руководства по мобильным прокси-серверам
Скрапинг eBay — лишь одно из направлений; остальные материалы кластера подробно разбирают лежащие в его основе технологии.
Руководства по веб-парсингу
Основные руководства по мобильным прокси-серверам
Парсинг каталогов eBay без блокировок подсетей
Выделенные модемы 4G/5G с доверием операторского CGNAT, ротацией IP по запросу и безлимитным трафиком для скачивания изображений товаров.
Получите выделенный мобильный прокси-сервер