Jak skrobać strony e-commerce za pomocą Pythona

Komentarze: 0

Skrobanie danych e-commerce w celu uzyskania szczegółowych informacji o produktach jest przydatne do przeprowadzania analizy konkurencji, monitorowania cen i przeprowadzania badań rynkowych. Skrobanie danych ze stron produktów można wygodnie wykonać za pomocą Pythona. Ten samouczek dotyczący skrobania danych e-commerce pokaże ci, jak zbierać informacje za pomocą kombinacji żądań i lxml ze sklepów internetowych.

Skrobanie stron internetowych dla e-commerce polega na pobieraniu informacji o produkcie, takich jak tytuł, cena lub numer identyfikacyjny ze sklepów internetowych. Liczne biblioteki dostępne w Pythonie sprawiają, że jest to nie tylko łatwe, ale i dość wydajne. W tym artykule skupimy się na skrobaniu stron internetowych e-commerce za pomocą Pythona. Naszym obiektem będzie strona internetowa Costco.

Pisanie skryptu do skrobania danych e-commerce

Na początek upewnijmy się, że mamy wszystkie dostępne narzędzia do skrobania e-commerce w Pythonie lub biblioteki, których będziemy potrzebować do tego skryptu:


pip install requests
pip install lxml

Skoncentrujemy się na wyodrębnianiu nazw produktów, funkcji i marek z określonych stron w witrynie.

Krok 1. Zrozumienie struktury HTML strony internetowej

Aby rozpocząć tworzenie skrobaka produktów e-commerce, należy najpierw zrozumieć strukturę danej strony internetowej. Przejdź do witryny i otwórz stronę, z której chcesz zbierać informacje, i sprawdź wymagane elementy (np. nazwę produktu, cechy, markę itp.).

Krok 2. Wysyłanie żądań HTTP

Najpierw zaimportujemy bibliotekę żądań, aby wysłać GET specjalnie dla stron produktów. Ponadto skonfigurujemy nagłówki żądań, aby przypominały żądanie przeglądarki.


import requests

# Lista adresów URL produktów do zeskrobania
urls = [
    "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
    "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Przeprowadź pętlę przez każdy adres URL i wyślij żądanie GET
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # Dalsze przetwarzanie zostanie dodane w kolejnych krokach
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Krok 3. Wyodrębnianie danych przy użyciu XPath i lxml

Dzięki lxml wyodrębnimy pożądane informacje z html. Ma to kluczowe znaczenie w przypadku skrobania danych e-commerce.


from lxml import html

# Lista do przechowywania zeskrobanych danych
scraped_data = []

# Przeprowadź pętlę przez każdy adres URL i wyślij żądanie GET
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Parsowanie zawartości HTML za pomocą lxml
        tree = html.fromstring(html_content)
        
       # Wyodrębnianie danych przy użyciu XPath
        product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
        product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
        product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
        
        # Dołącz wyodrębnione dane do listy
        scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Drukowanie zeskrobanych danych
for item in scraped_data:
    print(item)

Krok 4. Rozwiązywanie potencjalnych problemów

Kiedy próbujemy zeskrobać witrynę e-commerce za pomocą Pythona, musimy zrozumieć, że większość witryn ma jakąś formę oprogramowania antybotowego. Korzystanie z serwerów proxy i rotacyjnych agentów użytkownika może pomóc złagodzić ich podejrzenia.

Korzystanie z serwerów proxy z autoryzacją IP:


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)

Obracający się agenci użytkownika:


import random

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # W razie potrzeby dodaj więcej agentów użytkownika
]

headers['user-agent'] = random.choice(user_agents)

response = requests.get(url, headers=headers)

Krok 5. Zapisywanie danych do pliku CSV

Ostatecznie wyodrębnione dane zostaną zapisane w formacie CSV, dzięki czemu będę mógł je później przeanalizować pod kątem bardziej zaawansowanego procesu skrobania danych e-commerce.


import csv

csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Zapisywanie danych do pliku CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for item in scraped_data:
            writer.writerow(item)
    print(f"Data saved to {csv_file}")
except IOError:
    print(f"Error occurred while writing data to {csv_file}")

Kompletny kod

Oto ostateczna wersja skryptu do skutecznego skrobania danych e-commerce. Można go skopiować i wkleić w celu łatwego użycia.


import requests
import urllib3
from lxml import html
import csv
import random
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()

# Lista adresów URL produktów do zeskrobania
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

# headers
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-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Lista agentów użytkownika dla żądań rotacyjnych
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   # W razie potrzeby dodaj więcej agentów użytkownika
]


# Lista pełnomocników dla żądań rotacyjnych
proxies = [
    {'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
    # W razie potrzeby dodaj więcej serwerów proxy
]

# Lista do przechowywania zeskrobanych danych
scraped_data = []

# Przeprowadź pętlę przez każdy adres URL i wyślij żądanie GET
for url in urls:
   # Wybierz losowego agenta użytkownika dla nagłówków żądań
   headers['user-agent'] = random.choice(user_agents)
   # Wybierz losowy serwer proxy dla żądania
   proxy = random.choice(proxies)

   # Wyślij żądanie HTTP GET do adresu URL z nagłówkami i proxy
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Przechowuje zawartość HTML z odpowiedzi
       html_content = response.content
       # Parsowanie zawartości HTML za pomocą lxml
       tree = html.fromstring(html_content)

       # Wyodrębnianie danych przy użyciu XPath
       product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
       product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
       product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()

       # Dołącz wyodrębnione dane do listy
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # Wydruk komunikatu o błędzie w przypadku niepowodzenia żądania
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Konfiguracja pliku CSV
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Zapisywanie danych do pliku CSV
try:
   with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
       writer = csv.DictWriter(file, fieldnames=fieldnames)
       writer.writeheader()
       for item in scraped_data:
           writer.writerow(item)
   print(f"Data saved to {csv_file}")
except IOError:
   # Wyświetla komunikat o błędzie, jeśli zapis do pliku nie powiedzie się
   print(f"Error occurred while writing data to {csv_file}")

Python ecommerce scraper jest teraz kompletny.

Ecommerce Data Scraping: Przemyślenia końcowe

Wykorzystanie skrobaka internetowego dla sklepu internetowego Costco pokazuje, jak skuteczny może być Python w pozyskiwaniu danych produktowych do analizy i podejmowania optymalnych decyzji biznesowych. Dzięki odpowiednim skryptom i bibliotekom Requests oraz Lxml zapewniającym zautomatyzowane ekstraktory, możliwe jest skrobanie witryny bez żadnych przerw w przepływie pracy spowodowanych przez interfejs API zapobiegający botom. Wreszcie, ważne jest, aby zawsze przestrzegać przepisów etycznych podczas skrobania stron internetowych e-commerce.

Komentarze:

0 komentarze