Web-Scraping verstehen
Was versteht man unter Web-Scraping? Viele Websites stellen ihre Daten nicht über öffentliche APIs zur Verfügung, daher extrahieren Web-Scraper die Daten direkt aus dem Browser. Das ähnelt dem manuellen Kopieren von Text durch eine Person, geschieht jedoch im Handumdrehen.
Wenn man bedenkt, dass bessere Business Intelligence zu besseren Entscheidungen führt, ist dieser Prozess wertvoller, als es auf den ersten Blick scheint. Websites produzieren immer mehr Inhalte, sodass es nicht mehr ratsam ist, diesen Vorgang vollständig von Hand durchzuführen.
Vielleicht fragen Sie sich: „Was soll ich mit diesen Daten anfangen?“ Nun, schauen wir uns ein paar Anwendungsfälle an, in denen Web-Scraping wirklich nützlich sein kann:
- Lead-Generierung: Ein laufendes Geschäft benötigt Lead-Generierung, um Kunden zu finden.
- Preisinformationen: Die Entscheidung eines Unternehmens über die Preisgestaltung und Vermarktung seiner Produkte wird von den Preisen der Wettbewerber beeinflusst.
- Maschinelles Lernen: Damit KI-gestützte Lösungen korrekt funktionieren, müssen Entwickler Trainingsdaten bereitstellen.
Ausführliche Beschreibungen und weitere Anwendungsfälle finden Sie in diesem gut geschriebenen Artikel, der sich mit dem Nutzen von Web Scraping befasst.
Auch wenn man versteht, wie Web Scraping funktioniert und wie es die Effektivität Ihres Unternehmens steigern kann, ist die Erstellung eines Scrapers nicht so einfach. Websites verfügen über viele Möglichkeiten, Bots zu identifizieren und daran zu hindern, auf ihre Daten zuzugreifen.
Hier sind einige Beispiele:
- Completely Automated Public Turing Tests (CAPTCHAs): Diese logischen Aufgaben sind für Menschen relativ einfach zu lösen, stellen für Scraper jedoch eine erhebliche Hürde dar.
- IP-Blockierung: Wenn eine Website feststellt, dass mehrere Anfragen von derselben IP-Adresse kommen, kann sie den Zugriff auf diese Website blockieren oder Sie erheblich verlangsamen.
- Honeypots: Unsichtbare Links, die für Bots sichtbar, für Menschen jedoch unsichtbar sind; sobald die Bots in die Falle tappen, blockiert die Website ihre IP-Adresse.
- Geo-Blocking: Die Website kann bestimmte Inhalte geografisch sperren. So erhalten Sie beispielsweise regionalspezifische Informationen, wenn Sie nach Daten aus einem anderen Gebiet fragen (z. B. Flugticketpreise).
All diese Hürden zu überwinden, ist keine Kleinigkeit. Tatsächlich ist es zwar nicht allzu schwer, einen passablen Bot zu entwickeln, aber es ist verdammt schwierig, einen hervorragenden Web-Scraper zu erstellen. Daher wurden APIs für das Web-Scraping zu einem der heißesten Themen des letzten Jahrzehnts.
WebScrapingAPI sammelt den HTML-Inhalt von jeder beliebigen Website und kümmert sich automatisch um die zuvor genannten Probleme. Darüber hinaus nutzen wir Amazon Web Services, was Geschwindigkeit und Skalierbarkeit gewährleistet. Klingt das nach etwas, das dir gefallen könnte? Starte deine kostenlose WebScrapingAPI-Testversion und du kannst in den ersten 14 Tagen 5000 API-Aufrufe tätigen.
Das Web verstehen
Um das Web zu verstehen, müssen Sie das Hypertext Transfer Protocol (HTTP) verstehen, das erklärt, wie ein Server mit einem Client kommuniziert. Eine Nachricht enthält mehrere Informationen, die den Client beschreiben und wie er mit Daten umgeht: Methode, HTTP-Version und Header.
Web-Scraper verwenden die GET-Methode für HTTP-Anfragen, was bedeutet, dass sie Daten vom Server abrufen. Einige erweiterte Optionen umfassen auch die POST- und die PUT-Methode. Für weitere Details finden Sie hier eine detaillierte Liste der HTTP-Methoden.
Weitere Details zu Anfragen und Antworten finden sich in den HTTP-Headern. Sie können die vollständige Liste einsehen, doch für das Web-Scraping sind folgende relevant:
- User-Agent: gibt die Anwendung, das Betriebssystem, die Software und die Version an; Web-Scraper nutzen diesen Header, um ihre Anfragen realistischer erscheinen zu lassen.
- Host: der Domainname des Servers, auf den Sie zugegriffen haben.
- Referrer: enthält die Quelle, die der Nutzer besucht hat; dementsprechend kann der angezeigte Inhalt variieren, sodass dieser Umstand ebenfalls berücksichtigt werden muss.
- Cookie: Speichert vertrauliche Informationen über eine Anfrage und den Server (z. B. Authentifizierungstoken).
- Accept: stellt sicher, dass die Antwort des Servers in einem bestimmten Format vorliegt (z. B. text/plain, application/json usw.).
Java verstehen
Java ist eine objektorientierte Open-Source-Sprache und damit eine der beliebtesten Programmiersprachen. Fast zwei Jahrzehnte sind vergangen, seit wir Java zum ersten Mal kennengelernt haben, und die Programmiersprache ist immer zugänglicher geworden.
Viele Änderungen an Java zielten darauf ab, die Abhängigkeiten bei der Code-Implementierung zu verringern. Aus diesem Grund bevorzugen viele Entwickler die Sprache, aber sie hat auch noch weitere Vorteile:
- Sie ist Open-Source;
- sie bietet eine Vielzahl von APIs;
- Sie ist plattformübergreifend und bietet somit mehr Vielseitigkeit;
- Sie verfügt über eine ausführliche Dokumentation und zuverlässigen Community-Support.
Erstellen eines eigenen Web-Scrapers
Nun können wir uns mit dem Extrahieren von Daten befassen. Zunächst benötigen wir eine Website, die wertvolle Informationen bereitstellt. Für dieses Tutorial haben wir uns entschieden, diese Webseite mit italienischen Rezepten zu scrapen.
Schritt 1: Einrichten der Umgebung
Um unseren Java-Web-Scraper zu erstellen, müssen wir zunächst sicherstellen, dass alle Voraussetzungen erfüllt sind:
- Java 8: Auch wenn Java 11 die aktuellste Version mit Langzeitunterstützung (LTS) ist, bleibt Java 8 der bevorzugte Produktionsstandard unter Entwicklern.
- Gradle: ist ein flexibles Open-Source-Tool zur Build-Automatisierung mit einer Vielzahl von Funktionen, einschließlich Abhängigkeitsmanagement (erfordert Java 8 oder höher);
- Eine Java-IDE: In dieser Anleitung verwenden wir IntelliJ IDEA, da die Integration mit Gradle damit recht unkompliziert ist.
- HtmlUnit: kann beim Scraping Browser-Ereignisse wie Klicks und das Absenden von Formularen simulieren und bietet JavaScript-Unterstützung.
Nach der Installation sollten wir überprüfen, ob wir die offiziellen Anleitungen korrekt befolgt haben. Öffnen Sie ein Terminal und führen Sie die folgenden Befehle aus:
> java -version
> gradle -v
Diese sollten Ihnen die auf Ihrem Rechner installierten Versionen von Java und Gradle anzeigen:
Wenn keine Fehlermeldung erscheint, können wir loslegen.
Erstellen wir nun ein Projekt, damit wir mit dem Schreiben des Codes beginnen können. Zum Glück bietet JetBrains ein gut geschriebenes Tutorial für den Einstieg in IntelliJ und Gradle an, sodass wir uns bei den Konfigurationen nicht verlieren.
Stellen Sie sicher, dass Sie nach dem Erstellen des Projekts die IDE den ersten Build abschließen lassen, da Sie dann eine automatisch generierte Dateistruktur erhalten.
Sobald dies abgeschlossen ist, öffne deine „build.gradle“-Datei und füge die folgende Zeile im „dependencies“-Block hinzu:
implementation('net.sourceforge.htmlunit:htmlunit:2.51.0')
Dadurch wird HtmlUnit in unserem Projekt installiert. Vergiss nicht, auf die Schaltfläche „Reload“ in der Gradle-Toolbox auf der rechten Seite zu klicken, damit alle „Not found“-Warnungen verschwinden.

Schritt 2: Untersuche die Seite, die du scrapen möchtest
Super, machen wir weiter! Navigiere zu der Seite, die du scrapen möchtest, klicke mit der rechten Maustaste auf eine beliebige Stelle und wähle „Element untersuchen“. Die Entwicklerkonsole wird angezeigt, in der du den HTML-Code der Website sehen solltest.

Schritt 3: Sende eine HTTP-Anfrage und scrape den HTML-Code
Um diesen HTML-Code auf unseren lokalen Rechner zu holen, müssen wir nun eine HTTP-Anfrage mit HtmlUnit senden, die das Dokument zurückgibt. Kehren wir zur IDE zurück und setzen wir diese Idee in Code um.
Schreiben Sie zunächst die Importe, die wir für die Verwendung von HtmlUnit benötigen:
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.IOException;
import java.util.List;
Dann initialisieren wir einen WebClient und senden eine HTTP-Anfrage an die Website, die eine HtmlPage zurückgibt. Es ist wichtig, daran zu denken, die Verbindung nach Erhalt der Antwort zu schließen, da der Prozess weiterläuft.
WebClient webClient = new WebClient(BrowserVersion.CHROME);
try {
HtmlPage page = webClient.getPage("https://foodnetwork.co.uk/italian-family-dinners/");
webClient.getCurrentWindow().getJobManager().removeAllJobs();
webClient.close();
recipesFile.close();
} catch (IOException e) {
System.out.println("An error occurred: " + e);
}
Es ist erwähnenswert, dass HtmlUnit eine Menge Fehlermeldungen in der Konsole ausgibt, die den Eindruck erwecken, als würde Ihr PC explodieren. Keine Sorge, denn 98 % davon können Sie getrost ignorieren.
Sie werden hauptsächlich dadurch verursacht, dass HtmlUnit versucht, den JavaScript-Code vom Server der Website auszuführen. Einige davon können jedoch tatsächliche Fehler sein, die auf ein Problem in Ihrem Code hinweisen, daher ist es besser, bei der Ausführung Ihres Programms darauf zu achten.
Sie können die Anzeige eines Teils dieser nutzlosen Fehler umgehen, indem Sie einige Optionen in Ihrem WebClient konfigurieren:
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);Schritt 4: Extrahieren bestimmter Abschnitte
Wir haben also ein HTML-Dokument, wollen aber Daten, was bedeutet, dass wir die vorherige Antwort in für Menschen lesbare Informationen zerlegen sollten.
Fangen wir mit kleinen Schritten an und extrahieren wir den Titel der Website. Dies können wir mit Hilfe der integrierten Methode getTitleText tun:
String title = page.getTitleText();
System.out.println("Page Title: " + title);
Als Nächstes extrahieren wir alle Links von der Website. Hierfür stehen uns die integrierten Methoden getAnchors und getHrefAttribute zur Verfügung, die alle -Tags aus dem HTML extrahieren und anschließend den Wert des href-Attributs abrufen:
List<HtmlAnchor> links = page.getAnchors();
for (HtmlAnchor link : links) {
String href = link.getHrefAttribute();
System.out.println("Link: " + href);
}
Wie Sie sehen, bietet HtmlUnit viele integrierte und selbsterklärende Methoden, die Ihnen stundenlanges Lesen von Dokumentationen ersparen.
Nehmen wir ein realistischeres Beispiel. Wir müssen alle Rezepte von der Website extrahieren, genauer gesagt deren Titel und deren Adresse.
Wenn Sie sich eine der Rezeptkarten ansehen, werden Sie feststellen, dass alle benötigten Informationen in den Attributen des Links enthalten sind. Das bedeutet, dass wir lediglich nach den Links suchen müssen, die die Klasse „card-link“ haben, und deren Attribute abrufen.
List<?> anchors = page.getByXPath("//a[@class='card-link']");
for (int i = 0; i < anchors.size(); i++) {
HtmlAnchor link = (HtmlAnchor) anchors.get(i);
String recipeTitle = link.getAttribute("title").replace(',', ';');
String recipeLink = link.getHrefAttribute();
}
Diesmal verwenden wir einen XPath-Ausdruck, um in beliebiger Tiefe im HTML-Dokument nach Links zu suchen. Anschließend durchlaufen wir die Ergebnisliste und extrahieren den Titel sowie das href-Attribut jedes einzelnen Links.
Schritt 5: Exportieren der Daten in CSV
Diese Art der Extraktion kann von Vorteil sein, wenn die Daten an eine andere Anwendung weitergeleitet werden sollen, in unserem Fall an einen Rezept-Aggregator. Dazu müssen wir die geparsten Daten in eine externe Datei exportieren.
Wir erstellen eine CSV-Datei, da diese von einer anderen Anwendung leicht gelesen und zur weiteren Verarbeitung mit Excel geöffnet werden kann. Zunächst noch ein weiterer Import:
import java.io.FileWriter;
Dann initialisieren wir unseren FileWriter, der die CSV-Datei im „Append“-Modus erstellt:
FileWriter recipesFile = new FileWriter("recipes.csv", true);
recipesFile.write("id,name,link\n");
Nach der Erstellung schreiben wir auch die erste Zeile der CSV-Datei, die als Kopfzeile der Tabelle dient. Nun kehren wir zur vorherigen Schleife zurück, in der wir alle Rezeptkarten geparst haben, und schließen mit der folgenden Zeile ab:
recipesFile.write(i + "," + recipeTitle + "," + recipeLink + "\n");
Wir sind mit dem Schreiben in die Datei fertig, also ist es nun an der Zeit, sie zu schließen:
recipesFile.close();
Cool, das war’s! Jetzt können wir alle geparsten Daten übersichtlich, überschaubar und leicht weiterverwendbar anzeigen.

Fazit und Alternativen
Damit ist unser Tutorial abgeschlossen. Ich hoffe, dieser Artikel war informativ und hat Ihnen ein besseres Verständnis von Web Scraping vermittelt.
Wie Sie sich vorstellen können, kann diese Technologie viel mehr als nur Rezept-Aggregatoren zu versorgen. Es liegt an Ihnen, die richtigen Daten zu finden und sie zu analysieren, um neue Möglichkeiten zu schaffen.
Aber wie ich bereits zu Beginn des Artikels sagte, gibt es viele Herausforderungen, denen sich Web-Scraper stellen müssen. Entwickler finden es vielleicht spannend, diese Probleme mit ihrem eigenen Web-Scraper zu lösen, da es eine großartige Lernerfahrung ist und viel Spaß macht. Wenn Sie jedoch ein Projekt fertigstellen müssen, möchten Sie vielleicht die damit verbundenen Kosten (Zeit, Geld, Personal) vermeiden.
Es wird immer einfacher sein, diese Probleme mit einer speziellen API zu lösen. Trotz aller möglichen Hindernisse wie Javascript-Rendering, Proxys, CAPTCHAs usw. überwindet WebScrapingAPI sie alle und bietet eine anpassbare Lösung. Es gibt auch eine kostenlose Testversion. Wenn Sie sich also noch nicht ganz sicher sind, probieren Sie es doch einfach mal aus!




