Jak skrobać strony e-commerce za pomocą Pythona

Komentarze: 0

Do analizy konkurencji, monitorowania cen i badania rynku ważne jest pobieranie danych o produktach z witryn e-commerce. Do efektywnego skrobania danych ze stron produktów można użyć Pythona. W tym przewodniku pokażemy, jak skrobać informacje o produktach ze sklepów internetowych przy użyciu kombinacji żądań i lxml.

E-commerce scraping obejmuje wyodrębnianie szczegółów produktów, takich jak nazwy, ceny i identyfikatory ze sklepów internetowych. Python, ze swoimi wszechstronnymi bibliotekami, czyni to zadanie wydajnym i prostym. W tym przewodniku zajmiemy się pobieraniem informacji o produktach ze strony internetowej Costco.

Pisanie skryptu do ekstrakcji danych produktu

Przed przystąpieniem do procesu scrapingu, upewnij się, że masz zainstalowane niezbędne biblioteki Python:

pip install requests
pip install lxml

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

Krok 1. Zrozumienie struktury HTML strony internetowej

Aby wyodrębnić dane z dowolnej witryny internetowej, musisz zrozumieć jej strukturę. Otwórz stronę internetową i sprawdź elementy, które chcesz wyodrębnić (np. nazwę produktu, cechy marki itp).

Krok 2. Wysyłanie żądań HTTP

Najpierw użyjemy biblioteki żądań do wysyłania żądań HTTP GET do stron produktów. Skonfigurujemy również nagłówki żądań, aby naśladować prawdziwe żą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

Używając lxml, wyodrębnimy wymagane punkty danych z przeanalizowanego HTML.

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
       # 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

Strony internetowe często wdrażają środki zapobiegające botom. Korzystanie z serwerów proxy i rotacyjnych agentów użytkownika może pomóc uniknąć wykrycia.

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

Na koniec zapiszemy zeskrobane dane do pliku CSV w celu dalszej analizy.

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


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"
]

# nagłówki
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}")

Wykorzystanie Pythona do scrapowania z witryn e-commerce, takich jak Costco, jest skuteczną metodą zbierania informacji o produktach w celu ich analizy, a także podejmowania strategicznych decyzji. Właściwe wykorzystanie bibliotek, takich jak Requests i Lxml, skutkuje zautomatyzowanymi procesami ekstrakcji, które mogą obsługiwać zawartość HTML, nie zapominając o skutecznej implementacji API anty-botów. Należy zauważyć, że zawsze należy przestrzegać etycznych protokołów scrapingu.

Komentarze:

0 komentarze