Heim BlogWeb-Scraping So kratzen Sie Home Depot-Produktdaten (Schritt-für-Schritt-Anleitung)

So kratzen Sie Home Depot-Produktdaten (Schritt-für-Schritt-Anleitung)

von Kadek

In diesem Artikel zeigen wir Ihnen, wie Sie einen nicht erkennbaren Web-Scraper erstellen, um Daten von Home Depot abzurufen und das Ergebnis mithilfe von Node.js und ScraperAPI in einer CSV-Datei zu speichern.

TL;DR: Vollständiger Home Depot-Schaber

Für diejenigen, die es eilig haben, ist hier das vollständige Skript, das wir in diesem Tutorial erstellen werden:

	const axios = require('axios');
	const cheerio = require('cheerio');
	const { exportDataInCsvFile } = require("./csv-exporter");
	
	const EXPORT_FILENAME = 'products.csv';
	const HOMEDEPOT_PAGE_URL = 'https://www.homedepot.com/b/Appliances-Refrigerators/N-5yc1vZc3pi?catStyle=ShowProducts&NCNI-5&searchRedirect=refrigerators&semanticToken=i10r10r00f22000000000_202311261341369949425674627_us-east4-5qn1%20i10r10r00f22000000000%20%3E%20rid%3A%7B945c050322f005b6254c2457daf503cb%7D%3Arid%20st%3A%7Brefrigerators%7D%3Ast%20ml%3A%7B24%7D%3Aml%20ct%3A%7Brefrigerator%7D%3Act%20nr%3A%7Brefrigerator%7D%3Anr%20nf%3A%7Bn%2Fa%7D%3Anf%20qu%3A%7Brefrigerator%7D%3Aqu%20ie%3A%7B0%7D%3Aie%20qr%3A%7Brefrigerator%7D%3Aqr&Nao=24';
	const API_URL = 'https://api.scraperapi.com';
	const API_KEY = '' // <--- Enter your API key here
	
	const webScraper = async () => {
	   console.log('Fetching data with ScraperAPI...');
	
	   const queryParams = new URLSearchParams({
		   api_key: API_KEY,
		   url: HOMEDEPOT_PAGE_URL,
		   render: true,
		   country_code: 'us'
	   });
	
	   try {
		   const response = await axios.get(`${API_URL}?${queryParams.toString()}`);
		   const html = response.data;
		  
		   const $ = cheerio.load(html);
		   const productList = ();
	
		   console.log('Extract information from the HTML...');
	
		   $(".browse-search__pod").each((_, el) => {
			   const price = $(el).find('.price-format__main-price').text();
			   const model = $(el).find('.product-identifier--bd1f5').text();
			   const link = $(el).find("div(data-testid='product-header') a").attr('href');
			   const description = $(el).find("div(data-testid='product-header') .product-header__title-product--4y7oa").text();
			   const brand = $(el).find("div(data-testid='product-header') .product-header__title__brand--bold--4y7oa").text();
	
			   const characteristics = ();
			   const values = $(el).find('.kpf__specs .kpf__value');
			   values.each((index, value) => {
				   characteristics.push(($(value).text()));
			   });
	
			   productList.push({
				   description: description.trim(),
				   price,
				   model: model.replace('Model# ', ''),
				   brand: brand.trim(),
				   link: `https://homedepot.com${link}`,
				   characteristics: characteristics.join(' - '),
			   });
		   });
	
		   console.log('JSON result:', productList);
	
		   await exportDataInCsvFile(EXPORT_FILENAME, productList);
	   } catch (error) {
		   console.log(error)
	   }
	};
	
	void webScraper();

Notiz: Ersetzen <API_KEY> mit dem API-Schlüssel Ihrer ScraperAPI, bevor Sie den Code ausführen. Wenn Sie noch kein Konto haben, erstellen Sie ein kostenloses ScraperAPI-Konto, um 5.000 API-Credits zum Testen des Tools zu erhalten.

Möchten Sie jede Codezeile dieses Web Scrapers verstehen? Lass es uns von Grund auf neu aufbauen!

Scraping von Home Depot-Produktdaten

Als Anwendungsfall für das Scraping von Home Depot-Produkten schreiben wir einen Web-Scraper in Node.js, der Kopfhörer findet und die folgenden Informationen für jedes Produkt extrahiert:

  • Modell
  • Beschreibung
  • Preis
  • Marke
  • Eigenschaften
  • Link zum Produkt

Wenn das Scraping abgeschlossen und die Daten extrahiert sind, exportiert der Web Scraper sie zur weiteren Verwendung in eine CSV-Datei.

Kühlschränke-Suchseite von Home DepotKühlschränke-Suchseite von Home Depot

Voraussetzungen

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

Schritt 1: Richten Sie das Projekt ein

	mkdir homedepot-scraper

	cd homedepot-scraper
	
	npm init -y

Der letzte Befehl oben erstellt eine package.json Datei im Ordner. Erstellen Sie eine Datei index.js in dem wir unseren Schaber schreiben werden; Lassen Sie es vorerst leer.

Schritt 2: Installieren Sie die Abhängigkeiten

Um den Home Depot Web 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 aus der mit Axios gesendeten 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.homedepot.com; Typ „Kühlschränke“ 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.

Extrahieren von DOM-Auswahlzielinformationen von der Home Depot-ProduktseiteExtrahieren von DOM-Auswahlzielinformationen von der Home Depot-Produktseite

Im Bild oben können wir die folgenden DOM-Selektoren definieren, um die Informationen zu extrahieren:

Information DOM-Selektor
Modell .browse-search__pod .product-identifier–bd1f5
Beschreibung .browse-search__pod div(data-testid='product-header') .product-header__title-product–4y7oa
Preis .browse-search__pod .price-format__main-price
Marke .browse-search__pod div(data-testid='product-header') .product-header__title__brand–bold–4y7oa
Eigenschaften .browse-search__pod .kpf__specs .kpf__value
Link zum Home Depot .browse-search__pod div(data-testid='product-header') a

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

Schritt 4: Durchsuchen Sie die Home Depot-Produktseite

Lassen Sie uns Axios verwenden, um die HTTP-Anfrage zu erstellen, die an die ScraperAPI-Standard-API gesendet werden soll. Wir benötigen die folgenden Parameter:

  • Die URL zum Scrapen: Dies ist die URL der Home Depot-Produktsuchseite. Um die URL zum Scrapen abzurufen, kopieren Sie die URL in die Adressleiste Ihrer Browserzeile. Dies ist die URL für die Suche nach „Kühlschränke“.
  • Der API-Schlüssel: um sich gegenüber der Standard-API zu authentifizieren und das Scraping durchzuführen; Wenn Sie noch über genügend Guthaben verfügen, finden Sie es auf der Dashboard-Seite Ihres ScraperAPI-Kontos.
  • Aktivieren Sie Javascript: Die Website von Home Depot 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.
  • Geotargeting aktivieren: Die Home Depot-Website ist nur in einigen Ländern verfügbar; Um sicherzustellen, dass unsere Anfrage nicht blockiert wird, müssen wir ein gültiges Land angeben, aus dem die Anfrage kommt, beispielsweise die Vereinigten Staaten.

Öffne das index.js Datei und fügen Sie den folgenden Code hinzu, der die HTTP-Anfrage erstellt, sendet, die Antwort empfängt und sie im Terminal ausgibt.

	const axios = require('axios');

	const HOMEDEPOT_PAGE_URL = 'https://www.homedepot.com/b/Appliances-Refrigerators/N-5yc1vZc3pi?catStyle=ShowProducts&NCNI-5&searchRedirect=refrigerators&semanticToken=i10r10r00f22000000000_202311261341369949425674627_us-east4-5qn1%20i10r10r00f22000000000%20%3E%20rid%3A%7B945c050322f005b6254c2457daf503cb%7D%3Arid%20st%3A%7Brefrigerators%7D%3Ast%20ml%3A%7B24%7D%3Aml%20ct%3A%7Brefrigerator%7D%3Act%20nr%3A%7Brefrigerator%7D%3Anr%20nf%3A%7Bn%2Fa%7D%3Anf%20qu%3A%7Brefrigerator%7D%3Aqu%20ie%3A%7B0%7D%3Aie%20qr%3A%7Brefrigerator%7D%3Aqr&Nao=24';
	const API_URL = 'https://api.scraperapi.com';
	const API_KEY = '' // <--- Enter your API key here
	
	const webScraper = async () => {
		console.log('Fetching data with ScraperAPI...');
	
		const queryParams = new URLSearchParams({
				api_key: API_KEY,
				url: HOMEDEPOT_PAGE_URL,
				render: true,
				country_code: 'us'
		});
	
		try {
				const response = await axios.get(`${API_URL}?${queryParams.toString()}`);
				const html = response.data;
	
				console.log("HTML content", html);
		} catch (error) {
				console.log(error)
		}
	};
	
	void webScraper();

Führen Sie den Befehl aus node index.js um den Web Scraper auszuführen.

Schritt 5: Informationen aus dem HTML extrahieren

Nachdem wir nun den HTML-Inhalt der Seite haben, müssen wir ihn mit Cheerio analysieren, um die DOM-Struktur aufzubauen, damit alle gewünschten Informationen extrahiert werden 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 Produkte auf der Seite enthält.

	const cheerio = require('cheerio');

	const $ = cheerio.load(html);
	const productList = ();
	
	console.log('Extract information from the HTML...');
	
	$(".browse-search__pod").each((_, el) => {
		const price = $(el).find('.price-format__main-price').text();
		const model = $(el).find('.product-identifier--bd1f5').text();
		const link = $(el).find("div(data-testid='product-header') a").attr('href');
		const description = $(el).find("div(data-testid='product-header') .product-header__title-product--4y7oa").text();
		const brand = $(el).find("div(data-testid='product-header') .product-header__title__brand--bold--4y7oa").text();
	
		const characteristics = ();
		const values = $(el).find('.kpf__specs .kpf__value');
		values.each((index, value) => {
				characteristics.push(($(value).text()));
		});
	
		productList.push({
				description: description.trim(),
				price,
				model: model.replace('Model# ', ''),
				brand: brand.trim(),
				link: `https://homedepot.com${link}`,
				characteristics: characteristics.join(' - '),
		});
	});
	
	console.log('JSON result:', productList);

Schritt 6: Exportieren Sie die Daten in eine CSV-Datei

Um die extrahierten Daten in einer CSV-Datei zu speichern, verwenden wir ein Node.js-Paket namens csv-writer, das die mühsame Aufgabe des Erstellens der CSV-Struktur und des Einfügens von Elementen darin übernimmt.

Lassen Sie es uns installieren, indem Sie den folgenden Befehl ausführen:

Erstellen Sie eine neue Datei csv-exporter.jsund fügen Sie den folgenden Code hinzu:

	const path = require('path');
	const csvWriter = require('csv-writer');
	
	const COLUMN_HEADER = (
	   { id: 'model', title: 'Model' },
	   { id: 'description', title: 'Description' },
	   { id: 'price', title: 'Price (USD)' },
	   { id: 'brand', title: 'Brand' },
	   { id: 'link', title: 'Link' },
	   { id: 'characteristics', title: 'Characteristics' },
	);
	
	const exportDataInCsvFile = async (filename, data) => {
	   // TODO perform fields validation in data
	
	   const writer = csvWriter.createObjectCsvWriter({
		   path: path.resolve(__dirname, filename),
		   header: COLUMN_HEADER,
	   });
	
	   await writer.writeRecords(data);
	};
	
	module.exports = {
	   exportDataInCsvFile,
	}

Der aufregende Teil des obigen Codes ist der COLUMN_HEADER Variable, die ein Array von Objekten enthält, die den CSV-Spaltenheader der Eigenschaft eines Produkts zuordnen.

Wir werden die Datei in importieren index.js Datei und rufen Sie die Funktion auf exportDataInCsvFile() um die extrahierten Daten zu speichern.

Schritt 7: Testen Sie die Implementierung

Nach dem Importieren und Verwenden der Funktion zum Speichern der Daten in einer CSV-Datei finden Sie hier den endgültigen Code unseres Web Scrapers.

	const axios = require('axios');
	const cheerio = require('cheerio');
	const { exportDataInCsvFile } = require("./csv-exporter");
	
	const EXPORT_FILENAME = 'products.csv';
	const HOMEDEPOT_PAGE_URL = 'https://www.homedepot.com/b/Appliances-Refrigerators/N-5yc1vZc3pi?catStyle=ShowProducts&NCNI-5&searchRedirect=refrigerators&semanticToken=i10r10r00f22000000000_202311261341369949425674627_us-east4-5qn1%20i10r10r00f22000000000%20%3E%20rid%3A%7B945c050322f005b6254c2457daf503cb%7D%3Arid%20st%3A%7Brefrigerators%7D%3Ast%20ml%3A%7B24%7D%3Aml%20ct%3A%7Brefrigerator%7D%3Act%20nr%3A%7Brefrigerator%7D%3Anr%20nf%3A%7Bn%2Fa%7D%3Anf%20qu%3A%7Brefrigerator%7D%3Aqu%20ie%3A%7B0%7D%3Aie%20qr%3A%7Brefrigerator%7D%3Aqr&Nao=24';
	const API_URL = 'https://api.scraperapi.com';
	const API_KEY = '' // <--- Enter your API key here
	
	const webScraper = async () => {
	   console.log('Fetching data with ScraperAPI...');
	
	   const queryParams = new URLSearchParams({
		   api_key: API_KEY,
		   url: HOMEDEPOT_PAGE_URL,
		   render: true,
		   country_code: 'us'
	   });
	
	   try {
		   const response = await axios.get(`${API_URL}?${queryParams.toString()}`);
		   const html = response.data;
		  
		   const $ = cheerio.load(html);
		   const productList = ();
	
		   console.log('Extract information from the HTML...');
	
		   $(".browse-search__pod").each((_, el) => {
			   const price = $(el).find('.price-format__main-price').text();
			   const model = $(el).find('.product-identifier--bd1f5').text();
			   const link = $(el).find("div(data-testid='product-header') a").attr('href');
			   const description = $(el).find("div(data-testid='product-header') .product-header__title-product--4y7oa").text();
			   const brand = $(el).find("div(data-testid='product-header') .product-header__title__brand--bold--4y7oa").text();
	
			   const characteristics = ();
			   const values = $(el).find('.kpf__specs .kpf__value');
			   values.each((index, value) => {
				   characteristics.push(($(value).text()));
			   });
	
			   productList.push({
				   description: description.trim(),
				   price,
				   model: model.replace('Model# ', ''),
				   brand: brand.trim(),
				   link: `https://homedepot.com${link}`,
				   characteristics: characteristics.join(' - '),
			   });
		   });
	
		   console.log('JSON result:', productList);
	
		   await exportDataInCsvFile(EXPORT_FILENAME, productList);
	   } catch (error) {
		   console.log(error)
	   }
	};
	
	void webScraper();

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

Ergebnisse der Ausführung des Codes mit dem Befehl „node index.js“.Ergebnisse der Ausführung des Codes mit dem Befehl „node index.js“.

Zusammenfassung

Um einen Web Scraper für die Home Depot-Website zu erstellen, können wir den Prozess in den folgenden Schritten zusammenfassen:

  • Senden Sie mit Axios eine HTTP-Anfrage an die ScraperAPI-Standard-API mit der Startseite an Scrape und laden Sie den gerenderten HTML-Inhalt herunter. Stellen Sie sicher, dass Geotargeting aktiviert ist, indem Sie das Land auf die Vereinigten Staaten einstellen
  • 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
  • Exportieren Sie die extrahierten Daten in eine CSV-Datei

Die CSV-Datei kann mit den vielen Produkten gefüllt werden, die zu einem Datensatz werden, den Sie analysieren können, um einen Wettbewerbsvorteil auf Ihrem Markt zu erzielen.

Hier sind ein paar Ideen, um mit diesem Web-Scraper von Home Depot weiterzumachen:

  • Weitere Daten zu einem Produkt abrufen, z. B. technische Eigenschaften, Bewertungen usw.
  • Machen Sie den Web Scraper dynamisch, indem Sie die direkte Eingabe des Suchbegriffs ermöglichen
  • Aktualisieren Sie den CSV-Exporter, um Daten in die vorhandene CSV-Datei anzuhängen
  • Verwenden Sie den Async Scraper-Dienst, um bis zu 10.000 URLs asynchron zu scrappen

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.

Bis zum nächsten Mal, viel Spaß beim Schaben!

Related Posts

Hinterlasse einen Kommentar