Anleitung zum Scrapen von Walmart-Daten mit Python

Bemerkungen: 0

Web Scraping ist eine leistungsfähige Methode, um Daten aus Websites für verschiedene Zwecke zu extrahieren, z. B. für Analyse, Forschung und Aufklärung in Unternehmen. Dieses Tutorial hilft Ihnen beim Scrapen von Walmart-Produktinformationen in Python, wobei der Schwerpunkt auf den wichtigsten Strategien und Techniken liegt. Walmart Scraping stellt ein Beispiel vor, in dem wir Details von Produkten wie Name, Preis oder Bewertungen auf verschiedenen Seiten der Walmart-Websites auslesen können.

In dieser Anleitung wird die requests-Bibliothek für HTTP-Anfragen und die lxml-Bibliothek für das Parsen von HTML-Inhalten verwendet.

Einrichten der Umgebung

Bevor wir beginnen, stellen Sie sicher, dass Sie Python auf Ihrem Rechner installiert haben. Sie können die benötigten Bibliotheken mit pip installieren:

pip install requests
pip install  lxml
pip install urllib3

Als nächstes importieren wir die notwendigen Bibliotheken:

  • requests: für HTTP-Anfragen zum Abrufen von Webseiten;
  • lxml: für das Parsen von HTML-Inhalten;
  • csv: für das Schreiben der extrahierten Daten in eine CSV-Datei;
  • random: für die Auswahl zufälliger Proxys und User-Agent-Strings.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Produkt-URLs definieren

Liste von Walmart-Produkt-URLs zum Scrapen.

product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

Benutzer-Agent-Strings und Proxys

Um eine Website zu scrapen, ist es sehr wichtig, die richtigen Header zu verwenden, insbesondere den User-Agent-Header, um eine Anfrage von einem echten Browser zu imitieren. Darüber hinaus kann man vermeiden, dass man durch Anti-Bot-Maßnahmen der Website-Besitzer eingeschränkt wird, indem man drehbare Proxy-Server einsetzt. Nachfolgend finden Sie Beispiele für User-Agent-Strings sowie eine Beschreibung, wie Sie Proxy-Server integrieren können, die eine Autorisierung auf der Grundlage der IP-Adresse erfordern.

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 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

Kopfzeilen für Anfragen

Setzen Sie Kopfzeilen, um Browseranfragen zu imitieren und eine Erkennung zu vermeiden.

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',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    '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',
}

Initialisierung der Datenspeicherung

Erstellen Sie eine leere Liste, um Produktdaten zu speichern.

product_details = []

Der Aufzählungsprozess für URL-Seiten läuft folgendermaßen ab: Für jede URL-Seite wird eine GET-Anfrage mit einem zufällig ausgewählten User-Agent und Proxy gesendet. Nach Erhalt der HTML-Antwort wird diese geparst, um Details wie den Produktnamen, den Preis und die Bewertungen zu extrahieren. Die extrahierten Daten werden in einem Wörterbuch gespeichert, das anschließend an eine zuvor erstellte Liste angehängt wird.

for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Senden Sie eine HTTP-GET-Anfrage an die URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Parsen des HTML-Inhalts mit lxml
   parser = html.fromstring(response.text)
   # Produkttitel extrahieren
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Produktpreis extrahieren
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Extract review details
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Extrahierte Details in einem Wörterbuch speichern
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Anhängen von Produktdetails an die Liste
   product_details.append(product_detail)

Titel:

1.png

Preis:

2.png

Überprüfung Detail:

3.png

Daten im CSV-Format speichern

  1. Eine neue CSV-Datei zum Schreiben öffnen.
  2. Bestimmen Sie die Feldnamen (Spalten) für die CSV-Datei.
  3. Erstellen Sie ein csv.DictWriter-Objekt, um Dictionaries in die CSV-Datei zu schreiben.
  4. Schreiben Sie die Kopfzeile in die CSV-Datei.
  5. Durchlaufen Sie die Liste "product_details" und schreiben Sie jedes Produktwörterbuch als eine Zeile in die CSV-Datei.
with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

Kompletter Code:

Hier ist der vollständige Code mit Kommentaren, damit Sie ihn besser verstehen:

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

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


# Liste der Produkt-URLs zum Scrapen
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Zufallsgenerierte User-Agent-Zeichenfolgen für Anonymität
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 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# Proxy-Liste für IP-Rotation
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Kopfzeilen zur Nachahmung von Browseranfragen
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',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   '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',
}

# Initialisierung einer leeren Liste zum Speichern von Produktdaten
product_details = []

# Schleife durch jede Produkt-URL
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Senden Sie eine HTTP-GET-Anfrage an die URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Parsen des HTML-Inhalts mit lxml
   parser = html.fromstring(response.text)
   # Produkttitel extrahieren
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Produktpreis extrahieren
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Auszug aus der Überprüfung
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Extrahierte Details in einem Wörterbuch speichern
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Anhängen von Produktdetails an die Liste
   product_details.append(product_detail)

# Schreiben der extrahierten Daten in eine CSV-Datei
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

Unser Tutorial zeigt, wie man mit Hilfe von Python-Bibliotheken Produktdaten von Walmart ausliest und im CSV-Format für eine spätere Analyse speichert. Das bereitgestellte Skript ist grundlegend und bietet eine Basis, die verbessert werden kann, um die Effizienz des Scraping-Prozesses zu erhöhen. Zu den Verbesserungen gehören die Einführung zufälliger Verzögerungen zwischen den Anfragen, um das menschliche Surfverhalten zu imitieren, die Implementierung von User-Agent- und Proxy-Rotation, um eine Entdeckung zu vermeiden, und die Entwicklung eines robusten Fehlerbehandlungssystems, um mögliche Unterbrechungen oder Ausfälle beim Scraping zu verwalten.

Bemerkungen:

0 Bemerkungen