перейти к содержанию

Ebay — одна из крупнейших торговых площадок электронной коммерции в Интернете с миллионами активных объявлений в тысячах категорий. Будучи открытой торговой площадкой, Ebay содержит множество общедоступных данных, которые можно извлечь и проанализировать с помощью веб-скрейпинга.

В этом подробном руководстве мы расскажем, как создать веб-скребок Python для извлечения ключевых полей данных из списков Ebay и результатов поиска.

Зачем очищать данные Ebay?

Вот некоторые из основных причин, по которым вы можете захотеть очистить данные с Ebay:

  • Исследования рынка – Анализируйте списки продуктов, цены, информацию о продавцах, чтобы получить представление о тенденциях и возможностях рынка.

  • Мониторинг цен – Отслеживайте цены с течением времени для анализа цен или отслеживания сделок.

  • Dropshipping – Идеи для продуктов и инвентарь можно получить от продавцов Ebay.

  • Лидогенерация – Находите и извлекайте контактную информацию крупных продавцов Ebay.

  • Пополнение каталога – Сопоставьте существующий каталог товаров со списками Ebay.

  • Машинное обучение – Собирайте структурированные данные для обучения моделей машинного обучения для решения таких задач, как обнаружение дубликатов продуктов.

  • Персонализированные оповещения – Получайте уведомления, когда публикуются новые объявления, соответствующие вашим интересам.

Будучи одним из крупнейших открытых каталогов товаров в сети, Ebay является золотой жилой для аналитики электронной коммерции на основе парсинга.

Доступные поля данных для очистки

Страницы Ebay содержат огромное количество данных, которые мы можем извлечь с помощью веб-скрапинга. В этом руководстве мы сосредоточимся на сборе следующих ключевых полей:

  • URL-адрес продукта
  • Product ID
  • Название
  • Описание
  • Варианты (для объявлений с несколькими вариантами)
  • Цены)
  • Конвертированные цены (автоматическая конвертация валюты)
  • URL-адреса изображений
  • Имя продавца
  • URL-адрес продавца
  • Условия предмета
  • Пункт Особенности
  • Рейтинг
  • Количество отзывов

И более. Описанные методы можно адаптировать для извлечения дополнительных полей данных, таких как стоимость доставки, политика возврата, характеристики товара и т. д.

Теперь давайте посмотрим, как извлечь эти поля со страниц Ebay.

Установка

Мы будем использовать Python для очистки веб-страниц Ebay. Ключевые пакеты, которые нам нужны:

  • Запросы – для получения содержимого страницы
  • Красивый суп – для анализа и извлечения данных из HTML и XML

Установите их через pip:

pip install requests beautifulsoup4

Альтернативно вы можете использовать Selenium с фреймворком автоматизации браузера, например Scrapy, вместо Requests/BeautifulSoup.

Парсинг списков с одним вариантом

Сначала мы рассмотрим парсинг-листинги, в которых продается только один продукт (без вариантов).

Например: https://www.ebay.com/itm/275263444016

Просматривая исходный код страницы, мы видим элементы HTML, содержащие данные, которые мы хотим извлечь:

Выделение одного листинга на Ebay

Давайте напишем парсер Python для извлечения этих элементов:

import requests
from bs4 import BeautifulSoup

URL = "https://www.ebay.com/itm/275263444016"

def scrape_listing(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")

    title = soup.select_one("#itemTitle").text.strip()
    price = soup.select_one("#prcIsum").text
    seller = soup.select_one("a[class*=‘seller-info‘]").text

    # And so on for other fields

    return {
        "title": title,
        "price": price,
        "seller": seller
        #...
    }

data = scrape_listing(URL)
print(data)

Это находит элементы по идентификаторам и классам CSS, извлекает внутренний текст или атрибуты и возвращает словарь Python, содержащий очищенные данные.

Тот же принцип применим и к любым другим полям данных, которые вы хотите извлечь: проверьте источник страницы, чтобы найти шаблоны и найдите элементы для извлечения.

Парсинг многовариантных списков

Некоторые списки Ebay содержат несколько вариантов товаров, например одежду разных размеров/цветов или модели телефонов.

Например: https://www.ebay.com/itm/284807601540

Данные о продукте, такие как цена, количество и т. д., могут различаться для каждого варианта.

На сайте Ebay эти данные загружаются динамически с помощью JavaScript. Чтобы извлечь его, нам нужно:

  1. Найдите переменную JavaScript, в которой хранится массив данных вариантов.

  2. Разберите данные JSON в структуру данных Python.

Вот пример использования re и json модули:

import re
import json
import requests
from bs4 import BeautifulSoup

URL = "https://www.ebay.com/itm/284807601540"

def scrape_variants(url):
  response = requests.get(url)
  soup = BeautifulSoup(response.text, ‘html.parser‘)

  # Search for array variable that contains variant data
  pattern = re.compile(r‘var modelData = (.*);‘)
  script = soup.find(‘script‘, text=pattern)

  # Extract JSON and parse into Python dictionary
  data = json.loads(pattern.search(script.text).group(1))  

  variants = {}

  for v in data:
    variant_id = v[‘productId‘]

    variants[variant_id] = {
      "price": v[‘price‘],
      "available": v[‘quantityAvailable‘],
      # And so on, extract other needed variant fields
    }

  return variants

variants = scrape_variants(URL) 
print(variants)

Это позволяет нам извлекать все данные о ценах и запасах для каждого варианта продукта на странице листинга Ebay.

Тот же принцип можно применить к очистке другого динамически загружаемого контента со страниц Ebay.

Парсинг результатов поиска на Ebay

Помимо парсинга отдельных объявлений, мы также можем создавать парсеры, которые извлекают данные со страниц результатов поиска Ebay.

Например: https://www.ebay.com/sch/i.html?_nkw=laptop

Эти страницы содержат карточки предварительного просмотра для каждого результата поиска:

Результаты поиска на Ebay

Чтобы извлечь данные из этих карточек результатов, мы можем использовать цикл:

import requests
from bs4 import BeautifulSoup

URL = "https://www.ebay.com/sch/i.html?_nkw=laptop"  

def scrape_search_results(url):
  response = requests.get(url)  
  soup = BeautifulSoup(response.text, ‘html.parser‘)

  results = []

  for card in soup.select(".s-item__wrapper"):

    title = card.select_one(".s-item__title").text
    price = card.select_one(".s-item__price").text
    image = card.select_one("img").get("src")

    url = card.select_one(".s-item__link").get("href")

    results.append({
        "title": title,
        "price": price,
        "url": f"https://www.ebay.com{url}",
        "image": image
    })

  return results

data = scrape_search_results(URL)

print(data)

При этом находится каждая карточка результатов, извлекаются нужные поля и добавляются очищенные данные в список Python.

Некоторые ключевые моменты:

  • Мы находим карточки результатов с помощью .s-item__wrapper класса.
  • Перейдите вниз от контейнера карты, чтобы извлечь внутренние элементы, такие как заголовок, цена и т. д.
  • Создайте полные URL-адреса продуктов, объединив очищенный относительный URL-адрес с базовым URL-адресом Ebay.

Тот же подход можно использовать для создания парсеров для страниц категорий Ebay, ежедневных предложений и любых других индексных страниц поиска/списков.

Стратегии очистки, чтобы избежать блокировки

При создании масштабируемых парсеров для извлечения больших объемов данных с Ebay нам необходимо следить за тем, чтобы нас не блокировали. Вот несколько советов:

Используйте случайные задержки

Добавьте случайные задержки между запросами, чтобы имитировать поведение человека в Интернете, например:

import time
import random 

# Random delay between 2-6 seconds
time.sleep(random.uniform(2.0, 6.0))  

Ротация пользовательских агентов

Подделывайте различные настольные/мобильные браузеры, меняя строки пользовательского агента:

from fake_useragent import UserAgent

ua = UserAgent()

headers = {‘User-Agent‘: ua.random} 

Используйте прокси

Направляйте запросы через IP-адреса резидентных прокси-серверов, чтобы замаскировать скраперы и избежать блокировки IP-адресов.

Обработка CAPTCHA

Обнаруживайте и обрабатывайте проблемы CAPTCHA вручную или с помощью службы решения CAPTCHA.

Используйте сервисы парсинга

Используйте API-интерфейсы очистки, такие как ScrapingBee, ScraperAPI или SerpApi, для обхода блоков.

Пример сквозного парсинга Ebay

Давайте объединим эти концепции в один комплексный веб-скребок для данных Ebay.

Это будет:

  • Возьмите поисковый запрос в качестве входных данных
  • Очистить страницу результатов поиска
  • Извлечение ключевых полей данных
  • Пройдите по циклу, чтобы очистить каждый листинг
  • Вывод структурированных данных JSON

Вот код:

import json
import random
import time 

import requests
from bs4 import BeautifulSoup
from scrape import Scraper # 3rd party scraping API client

scraper = Scraper() # Initialize scraping API client

def scrape_listing(url):
  """Scrape key data fields from listing page"""

  page = scraper.get(url)
  soup = BeautifulSoup(page.content, ‘html.parser‘)

  title = soup.select_one("#itemTitle").text.strip()
  price = soup.select_one("#prcIsum").text

  # And so on...

  return {
    "title": title,
    "price": price,
    #...
  }

def scrape_search(query, pages=1):

  print(f"Scraping Ebay for: {query}") 

  base_url = "https://www.ebay.com/sch/i.html?_nkw={query}"

  results = []

  for page in range(1, pages+1):

    url = base_url + f"&_pgn={page}"

    # Fetch page using scraping API to avoid blocks
    page = scraper.get(url) 
    soup = BeautifulSoup(page.content, ‘html.parser‘)

    for card in soup.select(".s-item"):

      url = card.select_one(".s-item__link").get("href")
      url = f"https://www.ebay.com{url}"

      # Scrape each listing page
      data = scrape_listing(url)  

      results.append(data)

    # Random delay
    time.sleep(random.uniform(3.0, 6.0))

  return results

data = scrape_search("iphone 12", pages=2)  

print(json.dumps(data, indent=2))

Это предоставляет шаблон для создания надежного веб-скребка для данных Ebay в любом масштабе.

Полный код доступен на GitHub.

Обзор

Некоторые ключевые моменты, рассмотренные в этом уроке:

  • Мы можем извлечь множество полезных полей данных со страниц Ebay, включая цены, ассортимент, информацию о продавце, рейтинги и многое другое.

  • Для списков с одним вариантом извлекайте данные с помощью селекторов CSS и Beautiful Soup.

  • Чтобы очистить варианты данных, проанализируйте объект JavaScript, содержащий эту информацию.

  • Создавайте парсеры для извлечения результатов поиска и динамического перемещения по страницам.

  • Используйте такие стратегии, как прокси и случайные задержки, чтобы избежать блокировки.

  • Соедините парсеры подробностей списков с парсерами поиска для сквозного парсинга.

Описанные методы представляют собой основу для создания надежных веб-парсеров Ebay на Python. Извлеченные данные могут использоваться в широком спектре сценариев использования аналитики электронной коммерции.

Дополнительные примеры и шаблоны вы можете найти в полный репозиторий на GitHub.

Теги:

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *