Wie man E-Commerce-Websites mit Python scrapen kann

Bemerkungen: 0

Für Wettbewerbsanalysen, Preisüberwachung und Marktforschung ist es wichtig, Produktdaten von E-Commerce-Websites abzurufen. Sie können Python verwenden, um Daten von Produktseiten effizient abzurufen. In diesem Leitfaden wird gezeigt, wie man mit einer Kombination aus Anfragen und lxml Produktdaten aus Online-Shops auslesen kann.

Beim E-Commerce Scraping geht es darum, Produktdetails wie Namen, Preise und IDs aus Online-Shops zu extrahieren. Python mit seinen vielseitigen Bibliotheken macht diese Aufgabe effizient und einfach. In diesem Leitfaden werden wir Produktinformationen von der Costco-Website abrufen.

Schreiben eines Skripts zum Extrahieren von Produktdaten

Bevor Sie mit dem Scraping beginnen, sollten Sie sicherstellen, dass Sie die notwendigen Python-Bibliotheken installiert haben:

pip install requests
pip install lxml

Wir konzentrieren uns auf die Extraktion von Produktnamen, Produktmerkmalen und Produktmarken aus bestimmten Produktseiten auf der Website.

Schritt 1. Verstehen der HTML-Struktur der Website

Um Daten von einer beliebigen Website zu extrahieren, müssen Sie die Struktur der Webseite verstehen. Öffnen Sie eine Webseite und sehen Sie sich die Elemente an, die Sie auslesen möchten (z. B. Produktname, Merkmale, Marke usw.).

Schritt 2. Senden von HTTP-Anfragen

Zunächst verwenden wir die requests-Bibliothek, um HTTP-GET-Anfragen an die Produktseiten zu senden. Außerdem werden wir die Header der Anfragen so einrichten, dass sie eine echte Browseranfrage imitieren.


import requests

# Liste der Produkt-URLs zum Scrapen
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',
}

# Schleife durch jede URL und Senden einer GET-Anfrage
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # Die weitere Verarbeitung erfolgt in den nachfolgenden Schritten
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Schritt 3. Extrahieren von Daten mit XPath und lxml

Mit lxml extrahieren wir die benötigten Datenpunkte aus dem geparsten HTML.

from lxml import html

# Liste zum Speichern der ausgewerteten Daten
scraped_data = []

# Schleife durch jede URL und Senden einer GET-Anfrage
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Parsen von HTML-Inhalt mit lxml
        tree = html.fromstring(html_content)
        
        # Daten mit XPath extrahieren

        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()
        
        # Extrahierte Daten an die Liste anhängen
        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}")

# Drucken der ausgewerteten Daten
for item in scraped_data:
    print(item)

Schritt 4. Mögliche Probleme angehen

Websites setzen häufig Anti-Bot-Maßnahmen ein. Die Verwendung von Proxys und rotierenden Benutzer-Agenten kann helfen, eine Entdeckung zu vermeiden.

Verwendung von Proxys mit IP-Autorisierung:


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

Rotierende Benutzer-Agenten:


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',
    # Bei Bedarf weitere User Agents hinzufügen
]

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

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

Schritt 5. Speichern der Daten in einer CSV-Datei

Abschließend speichern wir die gescrapten Daten in einer CSV-Datei zur weiteren Analyse.

import csv

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

# Daten in eine CSV-Datei schreiben
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}")

Kompletter Code


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()

# Liste der Produkt-URLs zum Scrapen
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

# Kopfzeilen
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',
}

# Liste der Benutzeragenten für rotierende Anfragen
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',
   # Add more user agents as needed
]


# Liste der Bevollmächtigten für Rotationsanfragen
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'},
    # Add more proxies as needed
]

# Liste zum Speichern der ausgewerteten Daten
scraped_data = []

# Schleife durch jede URL und Senden einer GET-Anfrage
for url in urls:
   # Wählen Sie einen zufälligen Benutzer-Agenten für die Kopfzeilen der Anfrage
   headers['user-agent'] = random.choice(user_agents)
   # Wählen Sie einen zufälligen Proxy für die Anfrage
   proxy = random.choice(proxies)

   # HTTP-GET-Anfrage an die URL mit Header und Proxy senden
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Speichern Sie den HTML-Inhalt der Antwort
       html_content = response.content
       # Parsen von HTML-Inhalt mit lxml
       tree = html.fromstring(html_content)

       # Daten mit XPath extrahieren
       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()

       # Extrahierte Daten an die Liste anhängen
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # Print error message if request fails
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# CSV-Datei einrichten
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Daten in eine CSV-Datei schreiben
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:
   # Fehlermeldung ausgeben, wenn das Schreiben in eine Datei fehlschlägt
   print(f"Error occurred while writing data to {csv_file}")

Die Verwendung von Python zum Scrapen von E-Commerce-Seiten wie Costco ist eine effektive Methode zum Sammeln von Produktinformationen, um diese zu analysieren und strategische Entscheidungen zu treffen. Die richtige Verwendung von Bibliotheken wie Requests und Lxml führt zu automatisierten Extraktionsprozessen, die HTML-Inhalte verarbeiten können, ohne dabei die Implementierung einer effektiven Anti-Bot-API zu vergessen. Es ist zu beachten, dass ethische Scraping-Protokolle immer befolgt werden müssen.

Bemerkungen:

0 Bemerkungen