Jak skrobać dane z serwisu eBay przy użyciu Pythona

Komentarze: 0

eBay to dobrze znana platforma internetowa, która oferuje zarejestrowanym użytkownikom możliwości handlu szeroką gamą produktów. W tym przewodniku wyjaśnimy, jak skrobać dane z aukcji eBay za pomocą Pythona. W związku z tym będziemy zainteresowani szczegółami, które są dostępne z samej oferty, a także z przejścia do każdego z produktów po kolei, aby uzyskać bardziej szczegółowe informacje.

Wymagania

Aby rozpocząć, upewnij się, że masz zainstalowane następujące biblioteki Python:

  • Requests: Do wykonywania żądań HTTP.
  • lxml: Do analizowania zawartości HTML.
  • Pandas: Do zapisywania danych do pliku CSV.

Zainstaluj te biblioteki używając:


pip install requests lxml pandas

Zrozumienie struktury adresów URL eBay dla paginacji

Podczas wyszukiwania produktów w serwisie eBay każdy adres URL strony można zmodyfikować, aby nawigować po paginowanych wynikach. Na przykład:

  • Strona 1:https://www.ebay.com/sch/i.html?_nkw=laptop
  • Strona 2: https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn=2

Parametr _pgn służy do poruszania się po wielu stronach ofert, umożliwiając pobieranie obszernych danych. Rozpocznijmy proces skrobania.

Krok 1: Wysyłanie zapytań do eBay

Na początek skonfigurujemy nagłówki tak, aby naśladowały prawdziwe żądanie przeglądarki, co pomoże uniknąć wykrycia i potencjalnego zablokowania przez środki antybotowe eBay. Następnie wyślemy żądanie do strony aukcji, aby zebrać linki do każdego produktu.


import requests
from lxml.html import fromstring

# Definiowanie nagłówków w celu symulacji prawdziwej przeglądarki
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',
}

# Parametry żądania dla zapytania wyszukiwania
params = {
    '_nkw': 'laptop',
}

# Wyślij prośbę na stronę aukcji eBay
listing_page_response = requests.get('https link', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)

Krok 2: Analiza strony z ofertą

Na stronie oferty wyodrębnimy adresy URL poszczególnych produktów. Umożliwi nam to odwiedzenie strony każdego produktu w celu zebrania szczegółowych informacji, takich jak tytuł produktu, cena i inne.


# Parsowanie strony oferty w celu wyodrębnienia linków do produktów
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Wypisz próbkę znalezionych linków
print("Product Links:", links[:5])  # Display the first five product links

Krok 3: Skrobanie danych produktów

Mając w ręku adresy URL produktów, odwiedzimy każdą stronę produktu i wyodrębnimy następujące szczegóły:

  • Tytuł produktu;
  • Cena;
  • Koszt wysyłki;
  • Stan produktu;
  • Dostępna ilość;
  • Sprzedana ilość;
  • Opcje płatności;
  • Polityka zwrotów.

Następnie przejdziemy przez każdy link i użyjemy wyrażeń XPath, aby zlokalizować wymagane informacje na stronie produktu.


product_data = []

for url in links:
    # Wyślij żądanie na stronę produktu
    product_page_response = requests.get(url, headers=headers)
    product_parser = fromstring(product_page_response.text)
    
    # Wyodrębnianie danych przy użyciu 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]
        
        # Przechowywanie danych w słowniku
        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}")

Krok 4: Zapisywanie danych do pliku CSV

Po zebraniu danych możemy zapisać je do pliku CSV za pomocą Pandas.


import pandas as pd

# Konwersja danych do DataFrame
df = pd.DataFrame(product_data)

# Zapisz do CSV
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Obsługa ograniczania stawek i omijania wykrywania w serwisie eBay

eBay stosuje ograniczanie stawek, aby zapobiec nadmiernym żądaniom. Oto kilka metod pozwalających uniknąć wykrycia:

  • Używaj serwerów proxy: Korzystaj z różnych adresów IP.
  • Dostosuj odstępy między żądaniami: Wdrażaj opóźnienia między żądaniami.
  • Randomizuj agentów użytkownika: Zmieniaj ciąg agenta użytkownika, aby uniknąć wykrycia.

Postępując zgodnie z tymi najlepszymi praktykami, można zminimalizować ryzyko zablokowania i kontynuować skuteczne skrobanie danych.

Kompletny kod

Oto pełny kod do skrobania danych eBay i zapisywania ich do pliku 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']

# Definiowanie nagłówków dla żądania
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),
}

# Parametry zapytania wyszukiwania
params = {'_nkw': 'laptop'}
proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Pobierz stronę oferty
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')

# Wyodrębnianie danych produktu
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

# Zapisz do CSV
df = pd.DataFrame(product_data)
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Scraping eBay za pomocą Pythona pozwala na efektywne gromadzenie danych na temat produktów, cen i trendów. W tym przewodniku omówiliśmy skrobanie ofert, obsługę paginacji, ustawianie nagłówków i korzystanie z serwerów proxy w celu uniknięcia wykrycia. Pamiętaj, aby przestrzegać warunków korzystania z usługi eBay, stosując odpowiedzialne interwały żądań i rotację serwerów proxy. Dzięki tym narzędziom możesz teraz łatwo gromadzić i analizować dane eBay w celu uzyskania wglądu w rynek. Udanego skrobania!

Komentarze:

0 komentarze