темный логотип proxyscrape

Как скрести eBay в 2024 году: Руководство для начинающих

Python, How to's, Ноябрь-21-20245 минут чтения

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

  • Сравнение цен
  • Анализ рынка
  • Отслеживание тенденций развития продукции

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

Пропустили объяснение? Вот полный код

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

import re
import csv
import time

import requests
from bs4 import BeautifulSoup

proxies = {
    "http": "http://username:[email protected]:6060",
    "https": "http://username:[email protected]:6060",
}

def get_product_information(product_url) -> dict:
    r = requests.get(product_url, proxies=proxies)
    soup = BeautifulSoup(r.text, features="html.parser")

    product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
    product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
    currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

    # locate the element that holds quanity number of product
    quantity_available = soup.find("div", {"class":"x-quantity__availability"})
    if quantity_available is not None:
        # Using regex check if we can locate the strings that holds this number
        regex_pattern = r"\d+\savailable"
        if re.search(regex_pattern, quantity_available.text) is not None:
            quantity_available = re.search(regex_pattern, quantity_available.text).group()
            # After string is located we extract the number by splitting it by space and selecting the first element.
            quantity_available = quantity_available.split(" ")[0]
        else:
            quantity_available = "NA"

    total_reviews = soup.find("span", {"class":"ux-summary__count"})
    if total_reviews is not None:
        total_reviews = total_reviews.text.split(" ")[0]
    else:
        total_reviews = "NA"

    rating = soup.find("span", {"class":"ux-summary__start--rating"})
    if rating is not None:
        rating = rating.text
    else:
        rating = "NA"

    product_info = {
        "product_url": product_url,
        "title": product_title,
        "product_price": product_price,
        "currency": currency,
        "availability": quantity_available,
        "nr_reviews": total_reviews,
        "rating": rating
    }

    return product_info

def save_to_csv(products, csv_file_name="products.csv"):

    # Write the list of dictionaries to a CSV file
    with open(csv_file_name, mode='w', newline='') as csv_file:
        # Create a csv.DictWriter object
        writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

        # Write the header (keys of the dictionary)
        writer.writeheader()

        # Write the rows (values of the dictionaries)
        writer.writerows(products)

    print(f"Data successfully written to {csv_file_name}")

def main(keyword_to_search: str):
    products = []

    r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

    soup = BeautifulSoup(r.text, features="html.parser")
    for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
        item_url = item.find("a").get("href")

        product_info: dict = get_product_information(item_url)
        print(product_info)
        # Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
        time.sleep(2)

        products.append(product_info)
    # save data to csv
    save_to_csv(products)


if __name__ == '__main__':
    keywords = "laptop bag"
    main(keywords)

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

Как мы будем скрести eBay

Наш метод упрощает процесс, концентрируясь на четырех ключевых функциях:

  • Поиск по ключевому слову: Найдите продукты, введя поисковый запрос (например, "сумки для ноутбуков"), чтобы получить соответствующие товары.
  • Извлечение URL-адресов продуктов: Соберите URL-адреса продуктов, перечисленных на первой странице результатов поиска, чтобы упростить сбор данных.
  • Извлечение информации о продукте: Для каждого URL-адреса продукта мы перейдем на его страницу, чтобы получить важную информацию.
  • Сохранение данных: Сохраните извлеченные данные в CSV-файл для эффективного доступа и анализа.

Пререквизиты

Очень важно начать работу с правильными инструментами. Вам понадобятся:

Установите Python:

Настройте среду разработки:

  • Выберите директорию, в которую вы хотите поместить этот проект. Создайте виртуальное окружение, чтобы поддерживать чистые, изолированные зависимости.
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
source env/bin/activate # В Windows используйте: venv\Scripts\activate
pip install requests bs4

Настройка прокси-серверов:

В этом примере мы будем использовать вращающиеся Proxyscrape Residential Proxies, чтобы сохранить анонимность и защитить частный ip от попадания в черный список.

Объяснение сценария

Шаг 1: Импорт библиотек и прокси-серверов

Мы начнем с импорта необходимых библиотек для этого проекта веб-скреппинга, которые включают в себя:

  • CSV: этот модуль предоставляет классы для чтения и записи табличных данных в формате CSV. Он позволяет программистам легко записывать данные в предпочтительном формате Excel или читать данные из файлов, сгенерированных Excel, не зная точных деталей формата CSV.
  • Запросы: этот модуль позволяет отправлять HTTP-запросы с помощью Python.
  • BeautifulSoup4 - это мощный парсер html, предназначенный для извлечения нужной информации из html-структуры.

Требуется импорт:

импорт csv
импорт времени
импортировать запросы
из bs4 import BeautifulSoup

Настройка прокси:

Для того чтобы сохранить свой ip в тайне и тем самым свести к минимуму вероятность попадания вашего ip в черный список определенных сайтов, рекомендуется выполнять действия по веб-скрептингу под защитой прокси-серверов. Как уже упоминалось выше, в этом руководстве мы будем использовать вращающиеся Proxyscrape Residential Proxies, но вы можете использовать другие прокси-серверы или вообще не использовать их.

proxies = {
   "http": "http://username:[email protected]:6060",
   "https": "http://username:[email protected]:6060",
}

Шаг 2: Получение результатов поиска

Для начала объясним процесс поиска, который мы будем использовать в этом уроке. Мы запросим URL-адрес eBay с ключевым словом "сумка для ноутбука", как показано на этом рисунке:

Мы будем использовать запрошенный URL для отправки запроса с request.get(). Получив ответ, мы разберем содержимое HTML с помощью BeautifulSoup (bs4), чтобы извлечь URL-адрес каждого товара. На изображении ниже показано, где в HTML находится URL-адрес каждого товара.

Ссылка на продукт находится внутри <div> элемент с класс s-item__info clearfix. Чтобы извлечь эти ссылки, мы используем BeautifulSoup (bs4) для поиска всех <div> элементов с этим конкретным классом. После того как мы нашли эти элементы, мы перебираем каждый из них, чтобы найти <a> элементы и извлечь href атрибут, содержащий URL-адрес продукта.

def main(keyword_to_search: str):
   products = []

   r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

   soup = BeautifulSoup(r.text, features="html.parser")
   for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
       item_url = item.find("a").get("href")

       product_info: dict = get_product_information(item_url)
		# Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
       time.sleep(1)

       products.append(product_info)
   # save data to csv
   save_to_csv(products)

Шаг 3: Извлечение информации о продукте

Представляем получить_информацию_о_продукте функция. Эта функция принимает на вход URL-адрес продукта, отправляет запрос на этот URL-адрес, а затем использует BeautifulSoup (bs4) для разбора информации о продукте, используя специальные правила и регекс-шаблоны.

def get_product_information(product_url) -> dict:
   r = requests.get(product_url, proxies=proxies)
   soup = BeautifulSoup(r.text, features="html.parser")

   product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
   product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
   currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

   # locate the element that holds quanity number of product
   quantity_available = soup.find("div", {"class":"x-quantity__availability"})
   if quantity_available is not None:
       # Using regex check if we can locate the strings that holds this number
       regex_pattern = r"\d+\savailable"
       if re.search(regex_pattern, quantity_available.text) is not None:
           quantity_available = re.search(regex_pattern, quantity_available.text).group()
           # After string is located we extract the number by splitting it by space and selecting the first element.
           quantity_available = quantity_available.split(" ")[0]
       else:
           quantity_available = "NA"

   total_reviews = soup.find("span", {"class":"ux-summary__count"})
   if total_reviews is not None:
       total_reviews = total_reviews.text.split(" ")[0]
   else:
       total_reviews = "NA"

   rating = soup.find("span", {"class":"ux-summary__start--rating"})
   if rating is not None:
       rating = rating.text
   else:
       rating = "NA"

   product_info = {
       "product_url": product_url,
       "title": product_title,
       "product_price": product_price,
       "currency": currency,
       "availability": quantity_available,
       "nr_reviews": total_reviews,
       "rating": rating
   }

   return product_info

Наконец, мы организуем разобранные сущности продуктов в словарь, который затем возвращается функцией.

Шаг 4: Сохранение результатов

Пришло время сохранить эти результаты в CSV-файле с помощью встроенной в Python функции csv библиотека. Сайт save_to_csv(products) функция принимает продукция в качестве входных данных, которые представляют собой список словарей, содержащих сведения о продукте, как было описано ранее. Затем эти данные сохраняются в CSV-файл с именем имя_файла_csv аргумент, который по умолчанию принимает значение "products.csv".

def save_to_csv(products, csv_file_name="products.csv"):

   # Write the list of dictionaries to a CSV file
   with open(csv_file_name, mode='w', newline='') as csv_file:
       # Create a csv.DictWriter object
       writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

       # Write the header (keys of the dictionary)
       writer.writeheader()

       # Write the rows (values of the dictionaries)
       writer.writerows(products)

   print(f"Data successfully written to {csv_file_name}")

Заключение

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

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

Счастливого скрапбукинга!