Як скрапити дані з eBay з використанням Python

Коментарі: 0

eBay - це відома онлайн-платформа, що пропонує можливості торгівлі широким асортиментом товарів серед зареєстрованих користувачів. У цьому посібнику буде пояснено, як скрапити дані з оголошень на eBay з використанням Python. Нас будуть цікавити деталі, доступні безпосередньо з самого оголошення, а також більш детальна інформація, отримана шляхом відвідування кожного з товарів.

Попередні умови

Перед початком переконайтеся, що встановлено такі бібліотеки Python:

  • Requests: Для надсилання HTTP-запитів.
  • lxml: Для парсингу HTML-контенту.
  • Pandas: Для збереження даних у файл CSV.

Встановіть ці бібліотеки за допомогою такої команди:


pip install requests lxml pandas

Розуміння структури URL eBay для пагінації

Під час пошуку товарів на eBay URL кожної сторінки можна змінити для навігації сторінками з результатами. Наприклад:

  • Сторінка 1: https://www.ebay.com/sch/i.html?_nkw=laptop;
  • Сторінка 2: https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn=2.

Параметр _pgn використовується для навігації по безлічі сторінок оголошень, що дає змогу витягувати великі дані. Давайте почнемо процес скрапінгу.

Крок 1: Надсилання запитів на eBay

Для початку налаштуємо заголовки, щоб імітувати запит від реального браузера, що допоможе уникнути виявлення і потенційного блокування з боку антифрод-систем на платформі eBay. Потім відправляється запит на сторінку для збору посилань на кожен товар.


import requests
from lxml.html import fromstring

# Визначення заголовків для імітації реального браузера
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

# Параметри запиту для пошукового запиту
params = {
    '_nkw': 'laptop',
}

# Надсилання запиту на сторінку з оголошеннями eBay
listing_page_response = requests.get('https ссылка', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)

Крок 2: Парсинг сторінки з оголошеннями

На сторінці з оголошеннями будуть витягнуті URL-адреси окремих товарів. Це дасть змогу відвідати кожну сторінку товару для збору конкретних даних, як-от назва товару, ціна та інше.


# Парсинг сторінки з оголошеннями для вилучення посилань на товари
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Виведення прикладу знайдених посилань
print("Product Links:", links[:5])  # Показати перші п'ять посилань на товари

Крок 3: Скрапінг даних про товар

Отримавши URL-адреси товарів, перейдемо на кожну сторінку товару і витягнемо такі деталі:

  • Назва товару;
  • Ціна;
  • Вартість доставки;
  • Стан товару;
  • Доступна кількість;
  • Кількість проданих одиниць;
  • Варіанти оплати;
  • Політика повернення.

Далі, виконаємо перебір кожного посилання і використаємо вирази XPath для пошуку необхідної інформації на сторінці товару.


product_data = []

for url in links:
    # Надсилання запиту на сторінку товару
    product_page_response = requests.get(url, headers=headers)
    product_parser = fromstring(product_page_response.text)
    
    # Витяг даних за допомогою XPath
    try:
        product_title = product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0]
        price = product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0]
        shipping_cost = product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        product_condition = product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0]
        available_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0]
        sold_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1]
        payment_options = ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label'))
        return_policy = product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        
        # Збереження даних у словнику
        product_info = {
            'Title': product_title,
            'Price': price,
            'Shipping Cost': shipping_cost,
            'Condition': product_condition,
            'Available Quantity': available_quantity,
            'Sold Quantity': sold_quantity,
            'Payment Options': payment_options,
            'Return Policy': return_policy,
        }
        product_data.append(product_info)
    
    except IndexError as e:
        print(f"An error occurred: {e}")

Крок 4: Збереження даних у файл CSV

Після збору даних можна зберегти їх у файл CSV за допомогою бібліотеки Pandas.


import pandas as pd

# Перетворення даних у DataFrame
df = pd.DataFrame(product_data)

# Збереження в CSV
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Як уникнути обмеження швидкості з боку eBay

eBay застосовує обмеження швидкості для запобігання навантаження на сервери безліччю запитів. Ось кілька методів, щоб уникнути виявлення:

  • Використання проксі: ротація різних IP-адрес;
  • Регулювання інтервалів запитів: введення затримок між запитами;
  • Рандомізація User Agents: зміна рядка user-agent для уникнення виявлення.

Дотримуючись цих практик, можна мінімізувати ризик блокування і продовжувати ефективно збирати дані.

Фінальна версія коду

Нижче представлено повний код для скрапінгу даних з eBay і збереження їх у файл CSV.


import requests
import random
from lxml.html import fromstring
import pandas as pd

useragents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36']

# Визначення заголовків для запиту
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': random.choice(useragents),
}

# Параметри пошукового запиту і конфігурація проксі
params = {'_nkw': 'laptop'}
proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Отримання даних зі сторінки з оголошеннями
listing_page_response = requests.get('https://www.ebay.com/sch/i.html', params=params, headers=headers, proxies=proxies)
listing_parser = fromstring(listing_page_response.text)
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Витяг даних про товари
product_data = []
for url in links:
    product_page_response = requests.get(url, headers=headers, proxies=proxies)
    product_parser = fromstring(product_page_response.text)
    try:
        product_info = {
            'Title': product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0],
            'Price': product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0],
            'Shipping Cost': product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0],
            'Condition': product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0],
            'Available Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0],
            'Sold Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1],
            'Payment Options': ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label')),
            'Return Policy': product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        }
        product_data.append(product_info)
    except IndexError:
        continue

# Збереження в CSV
df = pd.DataFrame(product_data)
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Скрапінг eBay за допомогою Python дає змогу ефективно збирати дані про товари, ціни та тенденції. У цьому посібнику ми розглянули скрапінг оголошень, управління пагінацією, налаштування заголовків і використання проксі для обходу виявлення. Важливо дотримуватися умов використання eBay, застосовуючи відповідальні інтервали запитів і ротацію проксі. З цими інструментами тепер можна легко збирати й аналізувати дані eBay для отримання ринкових інсайтів.

Коментарії:

0 Коментаріїв