Heim BlogWeb-Scraping So scrapen Sie Walmart-Produktdaten mit Node.js

So scrapen Sie Walmart-Produktdaten mit Node.js

von Kadek

In diesem Tutorial erstellen wir einen Walmart Web Scraper von Grund auf und zeigen Ihnen, wie Sie seine Anti-Bot-Erkennung einfach umgehen können, ohne seinen Server zu beschädigen.

TL;DR: Vollständiger Walmart Node.js Scraper

Für diejenigen, die es eilig haben, finden Sie hier den vollständigen Code in Node.js.

<pre class="wp-block-syntaxhighlighter-code">
	const axios = require('axios');
	const cheerio = require('cheerio');
	
	const WALMART_PAGE_URL = 'https://walmart.com/search?q=computer+screen';
	const API_URL = 'https://api.scraperapi.com';
	const API_KEY = '<API_KEY>' // <--- Enter your API key here
	
	const parseProductReview = (inputString) => {
	   const ratingRegex = /(\d+\.\d+)/;
	   const reviewCountRegex = /(\d+) reviews/;
	
	   const ratingMatch = inputString.match(ratingRegex);
	   const reviewCountMatch = inputString.match(reviewCountRegex);
	
	   const rating = ratingMatch?.length > 0 ? parseFloat(ratingMatch(0)) : null;
	   const reviewCount = reviewCountMatch?.length > 1 ? parseInt(reviewCountMatch(1)) : null;
	
	   return { rating, reviewCount };
	};
	
	const webScraper = async () => {
	   const queryParams = new URLSearchParams({
		   api_key: API_KEY,
		   url: WALMART_PAGE_URL,
		   render: true,
	   });
	
	   try {
		   const response = await axios.get(`${API_URL}?${queryParams.toString()}`);
	
		   const html = response.data;
	
		   const $ = cheerio.load(html);
		   const productList = ();
	
		   $("div(data-testid='list-view')").each((_, el) => {
			   co
	nst link = $(el).prev('a').attr('href');
			   const price = $(el).find('.f2').text();
			   const priceCents = $(el).find('.f2 + span.f6').text();
			   const description = $(el).find("span(data-automation-id='product-title')").text();
			   const reviews = $(el).find('.w_iUH7').last().text();
			   const delivery = $(el).find("div(data-automation-id='fulfillment-badge')").find('span.b').last().text();
	
			   const { rating, reviewCount } = parseProductReview(reviews);
	
			   productList.push({
				   description,
				   price: `$${price}.${priceCents}`,
				   averageRating: rating,
				   totalReviews: reviewCount,
				   delivery,
				   link: `https://www.walmart.com${link}`
			   });
		   });
	
		   console.log(productList);
	   } catch (error) {
		   console.log(error.response.data)
	   }
	};
	
	void webScraper();
</pre>

Bevor Sie diesen Code ausführen, installieren Sie die Abhängigkeiten und legen Sie Ihren API-Schlüssel fest, den Sie im ScraperAPI-Dashboard finden – dies ist wichtig, da ScraperAPI es uns ermöglicht, Walmarts Anti-Bot-Mechanismen zu umgehen und seinen dynamischen Inhalt darzustellen.

Notiz: Die kostenlose Testversion beinhaltet 5.000 API-Credits und Zugriff auf alle ScraperAPI-Tools.

Möchten Sie die Details erfahren? Lasst uns mit dem Tutorial beginnen!

Scraping von Walmart-Produktdaten in Node.js

Um zu demonstrieren, wie man Walmart durchsucht, schreiben wir ein Skript, das Computerbildschirme bei Walmart findet.

Für jeden Computerbildschirm extrahieren wir Folgendes:

  • Beschreibung
  • Preis
  • Durchschnittliche Bewertung
  • Gesamtbewertungen
  • Liefervoranschlag
  • Produktlink

Das Skript exportiert die extrahierten Daten im JSON-Format, um die Verwendung für andere Zwecke zu erleichtern.

Suchergebnis von Walmart für die Suchanfrage ComputerbildschirmSuchergebnis von Walmart für die Suchanfrage Computerbildschirm

Voraussetzungen

Um diesem Tutorial folgen zu können, müssen diese Tools auf Ihrem Computer installiert sein.

Schritt 1: Richten Sie das Projekt ein

Erstellen wir einen Ordner mit dem Quellcode des Walmart-Scraper.

Geben Sie den Ordner ein und initialisieren Sie ein neues Node.js-Projekt


	cd walmart-scraper

	npm init -y

Der zweite Befehl oben erstellt eine package.json Datei im Ordner.

Als nächstes erstellen Sie eine Datei index.js und fügen Sie darin eine einfache JavaScript-Anweisung hinzu.


	touch index.js

	echo "console.log('Hello world!');" > index.js	

Führen Sie die Datei aus index.js mit der Node.js-Laufzeitumgebung.

Bei dieser Ausführung wird a gedruckt Hello world! Nachricht an das Terminal.

Schritt 2: Installieren Sie die Abhängigkeiten

Um diesen Scraper zu erstellen, benötigen wir diese beiden Node.js-Pakete:

  • Axios – um die HTTP-Anfrage zu erstellen (Header, Text, Parameter der Abfragezeichenfolge usw.), sie an die ScraperAPI-Standard-API zu senden und den HTML-Inhalt herunterzuladen
  • Cheerio – um die Informationen aus dem HTML zu extrahieren, das von der Axios-Anfrage heruntergeladen wurde

Führen Sie den folgenden Befehl aus, um diese Pakete zu installieren:


	npm install axios cheerio

Schritt 3: Identifizieren Sie die DOM-Selektoren, auf die Sie abzielen möchten

Navigieren Sie zu https://www.walmart.com; Typ „Computer-Bildschirm“ in der Suchleiste ein und drücken Sie die Eingabetaste.

Wenn das Suchergebnis angezeigt wird, überprüfen Sie die Seite, um die HTML-Struktur anzuzeigen und den DOM-Selektor zu identifizieren, der mit dem HTML-Tag verknüpft ist, der die Informationen umschließt, die wir extrahieren möchten.

Screenshot, der die CSS-Selektoren für die Elemente hervorhebt, die wir durchsuchen möchtenScreenshot, der die CSS-Selektoren für die Elemente hervorhebt, die wir durchsuchen möchten

Im obigen Bild sind hier alle DOM-Selektoren aufgeführt, auf die der Web Scraper abzielt, um die Informationen zu extrahieren.

Information DOM-Selektor
Produktbeschreibung span(data-automation-id=’product-title‘)
Preis div(data-testid=’list-view‘) .f2
Preis Cent div(data-testid=’list-view‘) .f2 + span.f6
Durchschnittliche Bewertung div(data-testid=’list-view‘) span.w_V_DM + div.flex span.w_iUH7
Gesamtbewertungen div(data-testid=’list-view‘) span.w_V_DM + div.flex span.f7
Liefervoranschlag div(data-testid=’list-view‘) div(data-automation-id=’fulfillment-badge‘) div.f7:last-child span.b:last-child
Walmarts Link div + a

Seien Sie beim Schreiben des Selektors vorsichtig, da ein Rechtschreibfehler verhindert, dass das Skript den richtigen Wert abruft.

Notiz: Eine gute Methode, Fehler beim Erstellen Ihrer Selektoren zu vermeiden, besteht darin, sie zuerst mit jQuery auszuprobieren. Geben Sie in der Browserkonsole Ihren Selektor ein $(“span(data-automation-id=’product-title’)”) Wenn das richtige DOM-Element zurückgegeben wird, können Sie loslegen.

Schritt 4: Senden Sie die erste Anfrage an Walmart

Wie bereits erwähnt, verwenden wir die Standard-API von ScraperAPI, um die Anti-Bot-Erkennung von Walmart zu umgehen.

Um die Anfragen zu erstellen, verwenden wir Axios und übergeben die folgenden Parameter an die API:

  • Die URL zum Scrapen: Dies ist die URL der Walmart-Produktsuchseite. Sie können es in die Adresszeile Ihres Browsers kopieren (in unserem Fall https://walmart.com/search?q=computer+screen).
  • Der API-Schlüssel: um sich bei der Standard-API zu authentifizieren und das Scraping durchzuführen. Sie finden es auf Ihrem ScraperAPI-Dashboard.
  • Aktivieren Sie Javascript: Die Website von Walmart basiert auf einem modernen Frontend-Framework, das JavaScript für eine bessere Interaktivität hinzufügt. Um JavaScript beim Scraping zu aktivieren, verwenden wir eine Eigenschaft mit dem Namen `render` mit dem auf eingestellten Wert `true`.

Notiz: Durch die Aktivierung des JS-Renderings können wir den dynamischen Inhalt von Walmart extrahieren. Ohne sie würden wir eine leere Seite bekommen.

Bearbeiten Sie die index.js um den folgenden Code hinzuzufügen, der die HTTP-Anfrage erstellt, sendet, die Antwort empfängt und sie auf dem Terminal ausgibt.

<pre class="wp-block-syntaxhighlighter-code">
	const axios = require('axios');

	const WALMART_PAGE_URL = 'https://walmart.com/search?q=computer+screen';
	const API_URL = 'https://api.scraperapi.com';
	const API_KEY = '<API_KEY>' // <--- Enter your API key here
	
	const webScraper = async () => {
	   const queryParams = new URLSearchParams({
		   api_key: API_KEY,
		   url: WALMART_PAGE_URL,
		   render: true,
	   });
	
	   try {
		   const response = await axios.get(`${API_URL}?${queryParams.toString()}`);
	
		   const html = response.data;
	
		   console.log("HTML content", html);
	   } catch (error) {
		   console.log(error.response.data)
	   }
	};
	
	void webScraper();
</pre>

Schritt 5: Informationen aus dem HTML extrahieren

Da wir nun den HTML-Inhalt der Seite haben, müssen wir ihn mit Cheerio analysieren, um darin navigieren und alle gewünschten Informationen extrahieren zu können.

Cheerio bietet Funktionen zum Laden von HTML-Text und zum anschließenden Navigieren durch die Struktur, um mithilfe der DOM-Selektoren Informationen zu extrahieren.

Der folgende Code geht jedes Element durch, extrahiert die Informationen und gibt ein Array zurück, das alle Bildschirme des Computers enthält.


	const cheerio = require('cheerio');

	const $ = cheerio.load(html);
	const productList = ();
	
	const parseProductReview = (inputString) => {
	   const ratingRegex = /(\d+\.\d+)/;
	   const reviewCountRegex = /(\d+) reviews/;
	
	   const ratingMatch = inputString.match(ratingRegex);
	   const reviewCountMatch = inputString.match(reviewCountRegex);
	
	   const rating = ratingMatch?.length > 0 ? parseFloat(ratingMatch(0)) : null;
	   const reviewCount = reviewCountMatch?.length > 1 ? parseInt(reviewCountMatch(1)) : null;
	
	   return { rating, reviewCount };
	};
	
	
	$("div(data-testid='list-view')").each((_, el) => {
	   const link = $(el).prev('a').attr('href');
	   const price = $(el).find('.f2').text();
	   const priceCents = $(el).find('.f2 + span.f6').text();
	   const description = $(el).find("span(data-automation-id='product-title')").text();
	   const reviews = $(el).find('.w_iUH7').last().text();
	   const delivery = $(el).find("div(data-automation-id='fulfillment-badge')").find('span.b').last().text();
	
	   const { rating, reviewCount } = parseProductReview(reviews);
	
	   productList.push({
		   description,
		   price: `$${price}.${priceCents}`,
		   averageRating: rating,
		   totalReviews: reviewCount,
		   delivery,
		   link: `https://www.walmart.com${link}`
	   });
	});
	
	console.log(productList);

Die Funktion parseProductionReview() extrahiert die durchschnittliche Bewertung und die Gesamtbewertung der Kunden zum Produkt.

Hier ist der vollständige Code des index.js Datei:

<pre class="wp-block-syntaxhighlighter-code">
	const axios = require('axios');
	const cheerio = require('cheerio');
	
	const WALMART_PAGE_URL = 'https://walmart.com/search?q=computer+screen';
	const API_URL = 'https://api.scraperapi.com';
	const API_KEY = '<API_KEY>' // <--- Enter your API key here
	
	const parseProductReview = (inputString) => {
	   const ratingRegex = /(\d+\.\d+)/;
	   const reviewCountRegex = /(\d+) reviews/;
	
	   const ratingMatch = inputString.match(ratingRegex);
	   const reviewCountMatch = inputString.match(reviewCountRegex);
	
	   const rating = ratingMatch?.length > 0 ? parseFloat(ratingMatch(0)) : null;
	   const reviewCount = reviewCountMatch?.length > 1 ? parseInt(reviewCountMatch(1)) : null;
	
	   return { rating, reviewCount };
	};
	
	const webScraper = async () => {
	   const queryParams = new URLSearchParams({
		   api_key: API_KEY,
		   url: WALMART_PAGE_URL,
		   render: true,
	   });
	
	   try {
		   const response = await axios.get(`${API_URL}?${queryParams.toString()}`);
	
		   const html = response.data;
	
		   const $ = cheerio.load(html);
		   const productList = ();
	
		   $("div(data-testid='list-view')").each((_, el) => {
			   co
	nst link = $(el).prev('a').attr('href');
			   const price = $(el).find('.f2').text();
			   const priceCents = $(el).find('.f2 + span.f6').text();
			   const description = $(el).find("span(data-automation-id='product-title')").text();
			   const reviews = $(el).find('.w_iUH7').last().text();
			   const delivery = $(el).find("div(data-automation-id='fulfillment-badge')").find('span.b').last().text();
	
			   const { rating, reviewCount } = parseProductReview(reviews);
	
			   productList.push({
				   description,
				   price: `$${price}.${priceCents}`,
				   averageRating: rating,
				   totalReviews: reviewCount,
				   delivery,
				   link: `https://www.walmart.com${link}`
			   });
		   });
	
		   console.log(productList);
	   } catch (error) {
		   console.log(error.response.data)
	   }
	};
	
	void webScraper();
</pre>

Führen Sie den Code mit dem Befehl aus node index.jsund freuen Sie sich über das Ergebnis:

Vollständiger Walmart-SchaberlauftestVollständiger Walmart-Schaberlauftest

Zusammenfassung

Der Aufbau eines Web Scrapers für Walmart kann in den folgenden Schritten erfolgen:

  • Verwenden Sie Axios, um eine Anfrage an die ScraperAPI mit der Walmart-Seite zu senden, um den gerenderten HTML-Inhalt zu scrapen und herunterzuladen
  • Analysieren Sie den HTML-Code mit Cheerio, um die Daten basierend auf DOM-Selektoren zu extrahieren
  • Formatieren und transformieren Sie die abgerufenen Daten entsprechend Ihren Anforderungen.

Das Ergebnis ist eine Liste relevanter Informationen zu den auf der Walmart-Website angezeigten Produkten.

Hier sind ein paar Ideen, um mit diesem Walmart Web Scraper weiterzumachen:

  • Rufen Sie Daten zu einem Produkt ab, z. B. technische Eigenschaften, Bewertungen usw.
  • Machen Sie den Web Scraper dynamisch, indem Sie die direkte Eingabe des Suchbegriffs ermöglichen
  • Speichern Sie die Daten in einer Datenbank (RDBMS, JSON-Dateien, CSV-Dateien usw.), um historische Daten zu erstellen und Geschäftsentscheidungen zu treffen
  • Verwenden Sie den Async Scraper-Dienst, um Millionen von URLs asynchron zu scrapen

Weitere Informationen finden Sie in der ScraperAPI-Dokumentation für Node.js. Für einen einfachen Zugriff finden Sie hier das GitHub-Repository dieses Projekts.

Related Posts

Hinterlasse einen Kommentar