CoderCastrov logo
CoderCastrov
EBay

Парсинг eBay с помощью Python

Парсинг eBay с помощью Python
просмотров
8 мин чтение
#EBay

Путем парсинга eBay вы можете собрать большое количество данных о продавцах, их ценах, их рейтингах и т. д. Эти данные могут помочь вам анализировать динамический рынок или, если вы сами являетесь продавцом на eBay, то вы можете отслеживать своих конкурентов. С течением времени, когда у вас будет большой набор данных, вы сможете выявить тенденции в популярности продуктов, поведении продавцов и предпочтениях покупателей, что может помочь вам оставаться впереди конкурентов в вашей отрасли.

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

Настройка предварительных требований

Надеюсь, вы уже установили Python 3.x на свой компьютер. Если нет, то вы можете загрузить его здесь. Кроме того, нам понадобятся две сторонние библиотеки Python.

  • Requests– С помощью этой библиотеки мы будем устанавливать HTTP-соединение с веб-страницей Amazon. Эта библиотека поможет нам извлечь необработанный HTML-код из целевой страницы.
  • BeautifulSoup– Это мощная библиотека для разбора данных. С помощью нее мы будем извлекать необходимые данные из необработанного HTML-кода, полученного с помощью библиотеки requests.

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

mkdir ebayscraper

Теперь мы должны установить эти две библиотеки в эту папку. Вот как это сделать.

pip install beautifulsoup4
pip install requests

Теперь вы можете создать файл на Python с любым именем, которое вам нравится. Это будет основной файл, в котором мы разместим наш код. Я называю его ebay.py.

Загрузка исходных данных с ebay.com

Прежде чем мы начнем, давайте протестируем небольшой скрипт на Python, чтобы убедиться, что наш код сможет собирать информацию с eBay без блокировки.

Наша целевая страница - вот эта. Это наручные часы.

import requests
from bs4 import BeautifulSoup

target_url="https://www.ebay.com/itm/182905307044"

resp = requests.get(target_url)

print(resp.status_code)

Хорошо, код очень понятный и лаконичный. Но давайте разберем его построчно.

При выполнении этого кода вы сможете получить HTTP-код состояния ответа, полученного с целевого URL-адреса. Код состояния может предоставить информацию о успешности или неуспешности запроса, например, 200 для успешного запроса или 404 для ошибки "страница не найдена".

После запуска этого кода вы должны увидеть 200 в консоли.

Итак, наш скрипт настроек успешно собрал информацию с eBay и загрузил нужную нам HTML-страницу. Теперь давайте решим, какую именно информацию мы хотим извлечь из страницы.

Что мы собираемся парсить с eBay?

Принятие этого решения заранее помогает нам одновременно определить расположение всех элементов данных внутри DOM.

Мы собираемся парсить семь элементов данных со страницы.

  • Изображения товара
  • Название товара
  • Рейтинг
  • Цена
  • Указанная цена
  • Скидка/Сэкономленная сумма
  • Стоимость доставки.

Для начала мы будем использовать библиотеку requests для отправки GET-запроса на целевую страницу. После этого мы воспользуемся библиотекой BeautifulSoup для извлечения нужных данных из ответа. Хотя существуют альтернативные библиотеки, такие как lxml, BeautifulSoup выделяется своим надежным и удобным API.

Перед отправкой запроса мы проанализируем страницу и определим положение каждого элемента внутри модели объекта документа (DOM). Рекомендуется выполнить это упражнение, чтобы точно определить расположение каждого элемента на странице.

Мы сделаем это, используя инструмент разработчика. Чтобы получить к нему доступ, просто щелкните правой кнопкой мыши на нужном элементе и выберите «Инспектировать». Это часто используемый метод, и вы возможно уже знакомы с ним.

Определение местоположения каждого элемента

Парсинг заголовка продукта

Как видно, заголовок продукта хранится внутри тега h1 с классом x-item-title__mainTitle. Поэтому парсить его будет очень просто.

l=[]
o={}
image_list=[]

soup=BeautifulSoup(resp.text,'html.parser')

o["title"]=soup.find("h1",{"class":"x-item-title__mainTitle"}).text

Сначала мы объявляем несколько пустых списков и объект для хранения всех полученных данных.

Четвертая строка создает объект BeautifulSoup с именем soup, разбирая HTML-контент объекта ответа resp. Используемый парсер HTML указан как 'html.parser'.

Последняя строка находит элемент h1 с атрибутом класса "x-item-title__mainTitle" в разобранном HTML-контенте. Затем он обращается к атрибуту text, чтобы получить текстовое содержимое элемента h1. Наконец, он присваивает этот текст словарю o с ключом "title".

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


Парсинг рейтинга продукта

Как видно на приведенном выше изображении, рейтинг скрыт внутри тега span с классом ebay-review-start-rating. Парсинг рейтинга очень прост. Вот как это можно сделать.

o["рейтинг"]=soup.find("span",{"class":"ebay-review-start-rating"}).text.strip()

Затем применяется метод strip(), чтобы удалить ведущие и завершающие пробельные символы из извлеченного текста.

Парсинг фактической цены

Цена скрыта внутри тега span с атрибутом itemprop и значением price.

o["фактическая_цена"]=soup.find("span",{"itemprop":"price"}).text

Парсинг цены и скидки

Когда вы производите инспекцию, вы заметите, что и цена и скидка указаны внутри тега div с классом x-additional-info. Итак, давайте сначала найдем этот класс, используя метод .find() из BS4.

box = soup.find("div", {"class": "x-additional-info"})

Теперь давайте найдем, где хранятся цена и скидка.

Таким образом, цена указана внутри тега span с классом ux-textspans — STRIKETHROUGH.

o["list_price"] = box.find("span", {"class": "ux-textspans--STRIKETHROUGH"}).text

Аналогично, скидка хранится внутри тега span с классом ux-textspans — EMPHASIS.

o["discount"] = box.find("span", {"class": "ux-textspans--EMPHASIS"}).text

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

Стоимость доставки хранится внутри тега span с классом ux-textspans — BOLD, а этот тег span находится внутри тега div с идентификатором SRPSection.

o["shipping_price"]=soup.find("div",{"id":"SRPSection"}).find("span",{"class":"ux-textspans--BOLD"}).text

Парсинг изображений товаров

Все изображения товаров хранятся внутри тега div с классом ux-image-carousel-item. Внутри каждого из этих тегов div есть тег img, в котором хранится URL изображения.

Итак, давайте сначала обойдем все эти теги div, а затем с помощью цикла for извлечем значения атрибутов src тега img.

images=soup.find_all("div",{"class":"ux-image-carousel-item"})

Здесь мы ищем элементы <div> с атрибутом класса "ux-image-carousel-item". Метод find_all() возвращает список всех найденных совпадающих элементов в HTML-документе. Извлеченные элементы присваиваются переменной images.

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

for image in images:
    image_url=image.find("img").get('data-src')
    image_list.append(image_url)


l.append(o)
l.append(image_list)
print(l)

Все изображения находятся в атрибуте src. Но после парсинга страницы оно будет отображаться как data-src вместо простого src. Вот почему мы использовали data-src выше.

Таким образом, мы спарсили все данные, которые ранее решили. Вы также можете использовать оператор try/except, чтобы избежать любых ошибок.

Полный код

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

Вы даже можете использовать cron job для запуска парсера в определенное время, и когда товар будет доступен по вашей целевой цене, он отправит вам электронное письмо.

Но пока код будет выглядеть так.

import requests
from bs4 import BeautifulSoup

l=[]
o={}
image_list=[]
target_url="https://www.ebay.com/itm/182905307044"

resp = requests.get(target_url)

soup=BeautifulSoup(resp.text,'html.parser')


o["title"]=soup.find("h1",{"class":"x-item-title__mainTitle"}).text
o["rating"]=soup.find("span",{"class":"ebay-review-start-rating"}).text.strip()
o["actual_price"]=soup.find("span",{"itemprop":"price"}).text
box=soup.find("div",{"class":"x-additional-info"})
images=soup.find_all("div",{"class":"ux-image-carousel-item"})
for image in images:
    image_url=image.find("img").get('data-src')
    image_list.append(image_url)
o["list_price"]=box.find("span",{"class":"ux-textspans--STRIKETHROUGH"}).text
o["discount"]=box.find("span",{"class":"ux-textspans--EMPHASIS"}).text
o["shipping_price"]=soup.find("div",{"id":"SRPSection"}).find("span",{"class":"ux-textspans--BOLD"}).text
l.append(o)
l.append(image_list)
print(l)

После запуска этого кода он вернет следующее.

Использование Scrapingdog для парсинга eBay

Техника, которую мы использовали, не будет достаточной для парсинга eBay в большом масштабе. Поскольку eBay обнаруживает, что трафик идет от бота/скрипта, он заблокирует наш IP, и ваша система сбора данных перестанет получать данные с веб-сайта.

В этом случае вы можете использовать веб-скрапинг API, такие как Scrapingdog, которые помогут вам получить миллионы страниц с eBay, не вызывая блокировки. Scrapingdog использует новый IP для каждого запроса, что делает скрапинг полностью анонимным.

Вы можете начать с 1000 бесплатных кредитов, которые вы получаете после регистрации.

После регистрации вы будете перенаправлены на свою панель управления. Панель управления будет выглядеть примерно так.

Вам нужно использовать свой API ключ.

Теперь вы можете вставить ссылку на целевую страницу eBay слева, а затем выбрать JS Rendering как No. После этого нажмите на Copy Code справа. Теперь используйте этот API в своем скрипте для парсинга eBay.

import requests
from bs4 import BeautifulSoup

l=[]
o={}
image_list=[]
target_url="https://api.scrapingdog.com/scrape?api_key=xxxxxxxxxxxxxx&url=https://www.ebay.com/itm/182905307044&dynamic=false"

resp = requests.get(target_url)

soup=BeautifulSoup(resp.text,'html.parser')


o["title"]=soup.find("h1",{"class":"x-item-title__mainTitle"}).text
o["rating"]=soup.find("span",{"class":"ebay-review-start-rating"}).text.strip()
o["actual_price"]=soup.find("span",{"itemprop":"price"}).text
box=soup.find("div",{"class":"x-additional-info"})
images=soup.find_all("div",{"class":"ux-image-carousel-item"})
for image in images:
    image_url=image.find("img").get('data-src')
    image_list.append(image_url)
o["list_price"]=box.find("span",{"class":"ux-textspans--STRIKETHROUGH"}).text
o["discount"]=box.find("span",{"class":"ux-textspans--EMPHASIS"}).text
o["shipping_price"]=soup.find("div",{"id":"SRPSection"}).find("span",{"class":"ux-textspans--BOLD"}).text
l.append(o)
l.append(image_list)
print(l)

Вы заметите, что код останется примерно таким же, как и выше. Нам нужно изменить только одну вещь - целевой URL.

Вам не нужно беспокоиться о повторной попытке после неудачного запроса или передаче какого-либо заголовка. Все это будет обработано самим Scrapingdog.

Итак, попробуйте Scrapingdog. Вы можете зарегистрироваться здесь (НЕ ТРЕБУЕТСЯ КРЕДИТНАЯ КАРТА)

Заключение

В этом руководстве мы собрали различные элементы данных с eBay. Сначала мы использовали библиотеку requests для загрузки исходного HTML-кода, а затем, используя BS4, мы разобрали нужные нам данные. Поиск местоположения каждого элемента был очень простым в этом руководстве. Я должен сказать, что парсинг eBay намного проще, чем парсинг Amazon и Walmart для начинающих.

Комбинация requests и Scrapingdog может помочь вам масштабировать ваш парсер. Вы получите более 99% успешных результатов при парсинге eBay с помощью Scrapingdog.

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


Дополнительные ресурсы

Вот несколько дополнительных ресурсов, которые могут оказаться полезными во время вашего путешествия по парсингу веб-страниц: