eBay володіє справжньою скарбницею загальнодоступних даних про ціни. Мільйони актуальних оголошень про колекційні предмети, електроніку, запчастини, що більше не випускаються, та багато іншого — все це корисно для відстеження цін, дослідження ринку або аналізу конкуренції. Проблема полягає в тому, щоб надійно отримати доступ до цих даних. Простий скрипт на Python дозволить вам переглянути, можливо, кілька сторінок, перш ніж eBay почне виводити вам CAPTCHA.
Отже, у цьому посібнику я розповім вам, як правильно збирати дані з eBay за допомогою Web Unlocker від Floppydata і дійсно отримувати результати.
Як зібрати дані з оголошень на eBay, не витрачаючи час на CAPTCHA та несправні селектори
• eBay швидко блокує прості скрепери — CAPTCHA, обмеження частоти запитів, виявлення ботів — все це. Звичайний запит на Python тут не допоможе.
• Найпростіший спосіб — це Web Unlocker від Floppydata: він обходить антибот-захист і видає чистий HTML-код.
• Далі вам знадобляться лише Python і BeautifulSoup, щоб отримати дані з оголошень для відстеження цін, досліджень та аналізу.
• Більшість доступних в Інтернеті посібників зі скрейпінгу вже не працюють — eBay перейшов з li.s-item на li.s-card, а багато селекторів так і не були оновлені.
• Нові облікові записи на Floppydata отримують п’ять безкоштовних запитів, тож ви можете скористатися цим посібником, не витрачаючи ніяких коштів наперед.
То що ж таке, власне, скрейпінг на eBay?
Чесно кажучи, це досить просто. Ви просто витягуєте загальнодоступні дані про лоти зі сторінок eBay і перетворюєте їх у формат, з яким можна працювати — CSV, JSON-файл чи що завгодно. Замість того, щоб переглядати лоти один за одним, скрейпер збирає всі ці дані одразу.
Перш ніж перейти до самого коду, варто ознайомитися з двома типами сторінок:
- Сторінки результатів пошуку — огляд з назвою, ціною, станом, інформацією про доставку та посиланням на оголошення.
- Сторінки з детальною інформацією про товар — URL-адреси у форматі
/itm/ITEM_ID, на яких розміщена більш детальна інформація, така як повний опис, відгуки про продавця, характеристики товару та варіанти товару.
У цьому посібнику ми зосередимося на сторінках результатів пошуку, оскільки саме з них починають більшість користувачів.
Навіщо збирати дані з eBay?
Отже, коли ви вже отримаєте ці дані, з ними, чесно кажучи, можна зробити безліч речей. Ось ті, якими я насправді користуюся:
- Відстеження цін. Ви зможете одразу побачити, за скільки насправді продаються товари, проаналізувавши тисячі активних та проданих оголошень, причому саме продані товари — це справжня знахідка, адже це ті ціни, які люди насправді заплатили, а не якісь вигадані цифри, які продавець просто вказав, сподіваючись на краще.
- Аналіз конкурентів. Ви можете точно бачити, що саме продається, в якому стані товар продається, хто його продає та яку ціну за нього просять, тож замість того, щоб гадати, яку ціну встановити, ви просто знаєте.
- Перепродаж та арбітраж. Саме це дозволяє оплачувати рахунки, адже зараз на ринку є об’єкти, виставлені за заниженою ціною, і завдяки цим даним ви можете їх знайти та придбати, перш ніж хтось інший їх навіть помітить.
- Дослідження ринку. Перш ніж вкладати реальні гроші у формування асортименту в певній категорії, ви можете проаналізувати статистику і за кілька хвилин з’ясувати, чи існує справжній попит, чи ви просто витратите гроші на товари, які ніколи не продадуться.
- Моніторинг продавців. А якщо ви хочете переглянути інформацію про конкретного продавця, дія залишається точно такою самою: просто вкажіть URL-адресу його магазину замість пошукового запиту — і раптом весь його каталог та ціни опиняться прямо перед вами.
Якщо ваша робота хоч якось пов’язана з перепродажем, електронною комерцією чи ціноутворенням, такі дані дозволять вам заощадити неймовірно багато часу та допоможуть набагато швидше приймати обґрунтовані рішення.
Чому б просто не скористатися офіційним API?
Чесно кажучи, для простих завдань це непоганий варіант. API-інтерфейс «Browse» досить добре справляється із запитами помірного обсягу щодо активних оголошень. Але спочатку потрібно пройти процедуру затвердження, є обмеження на частоту запитів, які вступають у дію досить швидко, і він просто не надає всіх необхідних можливостей.
Там немає списку проданих товарів, немає відгуків, немає повних даних про варіанти товару в тому вигляді, у якому вони відображаються на самій сторінці. Тож коли вам потрібна повна картина — тобто ті дані, які бачить реальний користувач під час завантаження сторінки, — скрейпінг є просто більш практичним способом.
Якщо ви ще не знайомі з цією темою, на сайті Floppydata є хороший вступний матеріал про те, як насправді працює веб-розблокувальник.
Чому з eBay так важко збирати дані?
Це не неможливо, але, безперечно, є певні перешкоди. Зокрема, дві проблеми, з якими стикається більшість людей.
По-перше, це система виявлення ботів. eBay використовує CAPTCHA та обмеження частоти запитів, і IP-адреса з низьким рівнем довіри дуже швидко призведе до отримання помилок 403. Крім того, на початку 2026 року вони посилили ці обмеження, тому підходьте до цього відповідально: використовуйте лише загальнодоступні дані, дотримуйтесь нормальної частоти запитів, не торкайтеся замовлень чи чогось подібного. Вам потрібні IP-адреси з житлових мереж та поведінка, що фактично імітує роботу браузера, інакше ви не отримаєте коректних відповідей.
Друга проблема — це розмітка, і вона досить підступна. Під час роботи над цим я зрозумів, що eBay вже перейшов з li.s-item на li.s-card, а разом із ним і всі посилання на .s-card__title, .s-card__price та .s-card__subtitle. Більшість онлайн-посібників досі посилаються на стару структуру, тому зараз вони просто не працюють. Ваші селектори рано чи пізно застаріють — так вже влаштований eBay, тому з самого початку вбудовуйте запобіжні перевірки на відсутність полів.
У будь-якому разі, саме тому я направляю всі операції через Web Unlocker від Floppydata, а не намагаюся боротися з eBay безпосередньо.
Необхідні умови
Три речі:
- Python 3.10 або новіша версія
- Обліковий запис Floppydata з ключем API Web Unlocker. Кожен новий обліковий запис надає п’ять безкоштовних запитів, тож ви зможете пройти весь цей посібник, не платячи ні копійки. Ключ знаходиться на панелі управління Web Unlocker.
- Дві бібліотеки:
requestsтаbeautifulsoup4
Спочатку встановіть дві бібліотеки:
pip install requests beautifulsoup4
Далі — папка вашого проєкту:
mkdir ebay-scraper
cd ebay-scraper
touch ebay_scraper.py
Відправлення першого запиту
Перше, що я спробував, — це просто звичайний запит, щоб подивитися, що з цього вийде:
import requests
url = "https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard"
response = requests.get(url)
print(response.status_code)
print(response.text[:500])
Заблокувати сторінку. Ніяких оголошень, просто нічого корисного. eBay одразу виявляє звичайний запит на Python: ніяких відбитків, ніяких надійних IP-адрес — це просто не спрацює. Тож замість того, щоб марнувати на це час, я просто користуюся Web Unlocker.
Збір даних з eBay за допомогою Floppydata Web Unlocker
Він бере на себе всі клопоти: IP-адресу домашнього підключення, відбиток браузера, візуалізацію сторінки — і видає вам чистий HTML-код. Оплата здійснюється лише за успішні запити, тож ви не втрачаєте кредити на невдалі спроби.
Я завжди тестую в тестовому середовищі на панелі інструментів (тестове середовище Web Unlocker без кодування), перш ніж щось писати. Вставте URL-адресу для пошуку, натисніть «Scrape» і подивіться, що вийде. Набагато простіше створювати парсер, коли вже знаєте, з чим маєте справу.
Тепер у нас є HTML-код, тож перейдемо до програмування.
Крок 1: Створити запит
import requests
import json
from bs4 import BeautifulSoup
API_URL = "https://api.floppydata.net/v1/webUnlocker"
API_KEY = "YOUR_API_KEY"
SEARCH_URL = "https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard&_pgn=1"
OUTPUT_FILE = "ebay_listings.json"
Замініть YOUR_API_KEY на ключ зі своєї панелі управління.
Крім того, _pgn=1 — це просто номер сторінки. Якщо вам потрібна друга сторінка, змініть адресу на _pgn=2. Третя сторінка — _pgn=3. Все просто.
Крок 2: Завантажте сторінку за допомогою Web Unlocker
def fetch_html(url):
response = requests.post(
API_URL,
headers={
"Content-Type": "application/json",
"X-Api-Key": API_KEY,
},
json={
"url": url,
"country": "US",
"city": "New York",
"difficulty": "medium",
"expiration": 0,
},
timeout=120,
)
response.raise_for_status()
data = response.json()
html = data.get("html")
if not html:
raise ValueError("Unlocker response did not include an 'html' field.")
return html
Параметри «Країна» та «Місто» забезпечують маршрутизацію запиту через житлову IP-адресу в США, що впливає як на ціноутворення, так і на те, які саме оголошення фактично відображаються. Рівень складності medium є оптимальним саме для eBay, оскільки цей сервіс має потужний захист від ботів. Якщо встановити нижче значення, вас просто заблокують. Параметр «Expiration» 0 змушує завантажувати нову сторінку щоразу, замість використання кешованої відповіді. Відображений HTML-код повертається у полі « html » JSON-об’єкта, і саме його BeautifulSoup аналізує на наступному кроці. Якщо ви хочете переглянути всі доступні параметри, їх перелік наведено у довіднику API Web Unlocker.
Крок 3: Витягнути списки
Кожен результат на сторінці пошуку — це li.s-card контейнер. Щоб акуратно витягувати дані з оголошень на eBay, ми пробігаємо циклом по кожній картці та витягуємо потрібні поля, використовуючи запобіжні перевірки, щоб відсутність якогось поля ніколи не призводила до збою у виконанні:
def extract_listings(html):
soup = BeautifulSoup(html, "html.parser")
cards = soup.select("li.s-card")
listings = []
for card in cards:
title_el = card.select_one(".s-card__title")
title = title_el.get_text(" ", strip=True) if title_el else None
if title:
# eBay appends this as accessibility text
title = title.replace("Opens in a new window or tab", "").strip()
# Skip the placeholder card at the top of search results
if not title or title == "Shop on eBay":
continue
price_el = card.select_one(".s-card__price")
condition_el = card.select_one(".s-card__subtitle")
# Shipping info sits inside attribute rows
shipping = None
for row in card.select(".s-card__attribute-row"):
text = row.get_text(" ", strip=True)
if any(word in text.lower() for word in ("ship", "free", "delivery")):
shipping = text
break
# Grab the first link that points to an item detail page
url = None
for a in card.select("a.s-card__link"):
href = a.get("href")
if href and "/itm/" in href:
url = href.split("?")[0]
break
listings.append({
"title": title,
"price": price_el.get_text(" ", strip=True) if price_el else None,
"condition": condition_el.get_text(" ", strip=True) if condition_el else None,
"shipping": shipping,
"url": url,
})
return listings
Дві тонкощі, про які варто знати.
- eBay завжди розміщує картку-заповнювач «Shop on eBay» у верхній частині результатів пошуку. Якщо ви її не пропустите, перший елемент у масиві результатів виявиться просто непотрібним сміттям.
- Заголовок також витягує текст «Відкривається в новому вікні або вкладці» як текст доступності з тегу анкора, щоб рядок заміни очистив його до того, як до нього буде додано будь-що.
Крок 4: Збережіть результати
def main():
print(f"Fetching data from: {SEARCH_URL}")
html = fetch_html(SEARCH_URL)
listings = extract_listings(html)
if not listings:
raise SystemExit("No listings found. eBay may have changed its markup.")
with open(OUTPUT_FILE, "w", encoding="utf-8") as file:
json.dump(listings, file, indent=2)
print(f"Found {len(listings)} listings")
print(f"Saved results to {OUTPUT_FILE}")
if __name__ == "__main__":
main()
Запустіть скрипт:
python ebay_scraper.py
І ви повинні побачити щось на зразок:
[
{
"title": "MSI Forge GK600 TKL Wireless Mechanical Keyboard RGB Bluetooth 2.4GHz",
"price": "$49.99",
"condition": "Brand New",
"shipping": "Free shipping",
"url": "https://www.ebay.com/itm/227344950627"
}
]
Ось так працює простий скрепер.
Відтепер, щоб змінити ключове слово, достатньо просто змінити _nkw=mechanical+keyboard в URL-адресі. Якщо вам потрібна інша сторінка, ви можете перейти з _pgn=1 на _pgn=2, _pgn=3 тощо.
Усунення несправностей
Отже, це очевидно: якщо достатньо довго переглядати eBay, то, швидше за все, натрапите на щось із цього:
- Помилки 403: eBay заблокував вашу IP-адресу. Вирішити цю проблему можна, використовуючи Web Unlocker із приватними IP-адресами.
- Порожні відповіді: зазвичай це проблема з відображенням. Перевірте ще раз, чи ви зчитуєте дані з поля «
html» у відповіді Web Unlocker, а не з необробленого тіла JSON. - Відсутні поля: не в кожному оголошенні вказано стан товару або інформацію про доставку. Захисні перевірки на сайті
extract_listingsвже враховують це. - Результатів немає: eBay знову змінив назви CSS-класів. Поверніться до тестового середовища, перегляньте нову розмітку та оновте свої селектори.
Ваш наступний крок
Послухайте, eBay — це не найскладніший сайт для роботи, але з огляду на CAPTCHA, обмеження частоти запитів та те, що націнка іноді просто змінюється, робота без належного налаштування лише призведе до марної трати часу. Використання сервісу, який бере на себе всі ці завдання, дозволяє відразу перейти до фактичної роботи з даними.
Саме в цьому і полягає перевага Web Unlocker від Floppydata. Ротація проксі-серверів для домашнього використання, справжні відбитки браузерів, повне відтворення сторінок, а платите ви лише за успішні відповіді, тож невдалі спроби збору даних вам нічого не коштують. Додайте до цього кілька рядків коду BeautifulSoup — і, чесно кажучи, все стає досить простим.
З кожним новим обліковим записом надається п’ять безкоштовних скрейпів, тож ви зможете пройти весь цей посібник, не платячи ні копійки.
Поділіться цією статтею:
Зміст
Проксі за $1
Отримайте необмежені можливості


