Как скрапить данные с eBay с использованием Python
Сводка через AI:
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 для получения рыночных инсайтов.
