
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)Пожалуйста, не забудьте обновить переменную прокси-сервера, введя новое имя пользователя и пароль, прежде чем использовать его.
Наш метод упрощает процесс, концентрируясь на четырех ключевых функциях:
Очень важно начать работу с правильными инструментами. Вам понадобятся:
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 от попадания в черный список.
Мы начнем с импорта необходимых библиотек для этого проекта веб-скреппинга, которые включают в себя:
импорт csv
импорт времени
импортировать запросы
из bs4 import BeautifulSoupДля того чтобы сохранить свой ip в тайне и тем самым свести к минимуму вероятность попадания вашего ip в черный список определенных сайтов, рекомендуется выполнять действия по веб-скрептингу под защитой прокси-серверов. Как уже упоминалось выше, в этом руководстве мы будем использовать вращающиеся Proxyscrape Residential Proxies, но вы можете использовать другие прокси-серверы или вообще не использовать их.
proxies = {
   "http": "http://username:[email protected]:6060",
   "https": "http://username:[email protected]:6060",
}Для начала объясним процесс поиска, который мы будем использовать в этом уроке. Мы запросим 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) Представляем получить_информацию_о_продукте функция. Эта функция принимает на вход 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Наконец, мы организуем разобранные сущности продуктов в словарь, который затем возвращается функцией.
 Пришло время сохранить эти результаты в 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. Независимо от того, нужны ли вам прокси-серверы для жилых помещений, центров обработки данных или мобильных устройств, мы всегда готовы помочь. Ознакомьтесь с нашими предложениями, чтобы поднять ваши проекты по скрапбукингу на новый уровень!
Счастливого скрапбукинга!