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. Независимо от того, нужны ли вам прокси-серверы для жилых помещений, центров обработки данных или мобильных устройств, мы всегда готовы помочь. Ознакомьтесь с нашими предложениями, чтобы поднять ваши проекты по скрапбукингу на новый уровень!
Счастливого скрапбукинга!