Как скрапить данные с 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 комментариев