Unterschied zwischen Web-Scraping und Web-Crawling
Webbrowser dienen dazu, Metadaten auf Webseiten im Internet anzuzeigen, das eine enorme Datenmenge beherbergt. Nutzer können mithilfe browserbasierter Seiten ganz einfach zwischen Websites wechseln und Daten interpretieren.
Die Begriffe „Web Crawling“ und „Web Scraping“ werden verwendet, um den Prozess der Extraktion von Quellcode zu beschreiben. Web Scraping bezeichnet den Vorgang, bei dem eine Webseite analysiert und Informationen daraus gewonnen werden. Das iterative Durchsuchen nach Weblinks und das Abrufen ihrer Inhalte wird als Web Crawling bezeichnet.
Beide Vorgänge werden von einer Anwendung ausgeführt, da das Auffinden neuer Verbindungen das Auslesen von Webseiten erfordert. Beide Begriffe, die gelegentlich synonym verwendet werden, beziehen sich auf den Vorgang der Informationsgewinnung. Sie dienen jedoch vielen verschiedenen Zwecken.
Wie und wo kann dieses Wissen genutzt werden?
Im Internet gibt es mehr Antworten als es Websites gibt. Diese Erkenntnis kann bei der Entwicklung von Apps von großem Nutzen sein, und das Wissen darüber, wie man entsprechenden Code schreibt, lässt sich auf automatisierte Webtests anwenden.
In diesem Blogbeitrag werden wir zwei Methoden zum Crawlen und Scrapen von Daten im Internet unter Verwendung von Browsern und einfachen HTTP-Anfragen vorstellen und dabei auch auf die jeweiligen Vor- und Nachteile eingehen.
Webinhalte mithilfe von HTTP-Anfragen und Webbrowsern herunterladen
Da heutzutage fast alles online ist, findet man zweifellos in jeder Programmiersprache ein Modul zum Senden von HTTP-Anfragen. Einfache HTTP-Anfragen sind schnell erledigt. Es dauert länger, Webbrowser wie Firefox und Google Chrome als Alternative zu verwenden.
Sie verhalten sich anders und werden anders dargestellt, wodurch sich die Art und Weise ändert, wie die einzelnen Aktivitäten dargestellt werden, sodass sie leicht lesbar sind und zur Berücksichtigung von Darstellungsstilen und zur Ausführung von Skripten auf Webseiten genutzt werden. Webbrowser verschwenden gelegentlich Ressourcen. So kann beispielsweise eine einfache HTTP-Anfrage ausreichen, wenn Sie versuchen, Text von einer Webseite abzurufen und als einfachen Text herunterzuladen.
Da JavaScript jedoch so weit verbreitet ist, können einige Inhalte auf vielen Websites nicht angezeigt werden, wenn es nicht ausgeführt wird. In diesem Fall wird das Herunterladen von Webinhalten durch die Verwendung eines Browsers vereinfacht.
CSS- und XPath-Analyse
XPath und CSS sind zwei häufig verwendete Methoden zur Textanalyse. XPath, eine Abfragesprache, dient dazu, bestimmte Elemente in XML- und HTML-Dateien zu identifizieren.
Jedes verfügt über eine bestimmte Struktur, und dieses Muster lässt sich beim Verfassen einer Abfrage anwenden. CSS-Selektoren dienen dazu, Elemente anhand eines Zeichenfolgenmusters auszuwählen, und sind in gewisser Weise mit XPath vergleichbar, da CSS-Stile auf die HTML-Struktur angewendet werden.
Vorbereitung der Demo
Diese Demos nutzen die C#- und .NET Core 3.1-Umgebungen. Diese APIs sollten auch unter .NET 4x funktionieren, da sie in letzter Zeit kaum verändert wurden. Das Repository enthält außerdem eine Beispielwebsite (eine ASP.NET Core MVC-Anwendung) mit drei Seiten:
- Seiten mit einer übersichtlichen Tabelle
- Seiten mit einem „versteckten Link“ und
- Eine Schaltfläche, die erst nach Ablauf einer bestimmten Zeit angezeigt wird
Erstellen einer ASP.NET Core Web-API mit Visual Studio 2022
Mit .NET 6.0 lässt sich mit Visual Studio 2022 eine ASP.NET Core-Web-App-API entwickeln. In Visual Studio müssen Sie dem Projekt einen aussagekräftigen Namen geben und die Vorlage „ASP.NET Core-Web-App-API“ auswählen.

Als Option steht Ihnen das Net Core Web API 6.0-Framework zur Verfügung. Darüber hinaus können Sie die Standardunterstützung für Open API auswählen. Für das Projekt führt dies zur Erstellung von Sass-Metadaten.
Die hier aufgeführten APIs sollten mithilfe des NuGet-Paketmanagers installiert werden.
- HtmlAgilityPack
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
Für statische Seiten
Einrichtung
Wenn Sie C# verwenden, ist die Wahrscheinlichkeit groß, dass Sie bereits mit Visual Studio arbeiten. In diesem Beitrag wird ein konkretes MVC-basiertes .NET Core-Webanwendungsprojekt verwendet (Model-View-Controller).
Nutzen Sie den NuGet-Paketmanager, um nach dem Erstellen eines neuen Projekts die in dieser Anleitung benötigten Bibliotheken einzubinden.

Um die Pakete in NuGet herunterzuladen, wählen Sie die Option „Durchsuchen“ und geben Sie dann „HTML Agility Pack“ ein.

Nach der Installation des Pakets können Sie nun fortfahren. Die abgerufene HTML-Tabelle lässt sich mit diesem Paket leicht analysieren, um die Tags und Daten zu finden, die Sie speichern möchten.

Die folgenden APIs müssen in den Code eingebunden werden, bevor Sie mit der Programmierung des Scrapers in Visual Studio beginnen:
Mit C# eine HTTP-Anfrage an eine Webseite senden
Stellen Sie sich ein Beispielprojekt vor, bei dem Sie Wikipedia nach Informationen über bekannte Programmierer durchforsten müssen. Gäbe es dazu keinen Artikel, wäre Wikipedia nicht mehr Wikipedia, oder?
https://en.wikipedia.org/wiki/list-of-programmers
In diesem Artikel finden Sie eine Liste von Entwicklern mit Hyperlinks zu den jeweiligen Wikipedia-Seiten. Für die spätere Verwendung können Sie die Liste auslesen und die Daten im CSV-Format speichern (das beispielsweise von Excel problemlos verarbeitet werden kann).
Der Grundgedanke hinter dem Online-Web-Scraping besteht darin, eine Website zu finden, die die benötigten Daten enthält, die Informationen mit C# zu extrahieren und sie für die spätere Verwendung zu speichern. Dies ist nur ein einfaches Beispiel dafür, was man mit Web-Scraping erreichen kann.
Die Hyperlinks auf einer Seite der obersten Kategorieebene können genutzt werden, um Webseiten in komplexeren Projekten zu crawlen. Für die folgenden Beispiele wollen wir uns jedoch auf diese bestimmte Wikipedia-Seite konzentrieren.
HTML mit .HttpClient und .NET Core Web-APIs abrufen
Ein integrierter HTTP-Client für .NET heißt HttpClient und ist standardmäßig verfügbar. Es sind keine eigenständigen Bibliotheken oder Plugins von Drittanbietern erforderlich, da die Net.HTTP-Domäne alle erforderlichen Funktionen abdeckt. Darüber hinaus bietet sie native Unterstützung für verzögerte Aufrufe.
Das folgende Beispiel zeigt, wie einfach es ist, den Inhalt einer beliebigen URL auf asynchrone, nicht blockierende Weise mithilfe von `GetStringAsync()` abzurufen
private static async Task<string> CallUrl(string full URL)
{
HttpClient client = new HttpClient();
var response = await client.GetStringAsync(vollständige URL);
Antwort zurückgeben;
}
Sie erstellen einfach ein brandneues HttpClient-Objekt, rufen GetStringAsync() auf, „warten“, bis der Vorgang abgeschlossen ist, und übergeben dann das Ergebnis an den Aufrufer. Da diese Funktionalität nun in die Controller-Klasse integriert wurde, können Sie CallUrl() direkt aus der Index()-Methode aufrufen, ohne weitere Schritte unternehmen zu müssen. Lassen Sie uns das nun umsetzen.
public IActionResult Index(){
string url = "https://en.wikipedia.org/wiki/List_of_programmers";
var response = CallUrl(url).Result;
return View();}
Hier geben wir die URL für Wikipedia in der URL an, rufen sie mit `callUrl()` auf und speichern den Rückgabewert in den abhängigen Variablen.
Okay, der Code zum Senden der HTTP-Anfrage ist nun fertig. Auch wenn wir ihn noch nicht verarbeitet haben, ist es eine gute Idee, den Code sofort auszuführen, um sicherzustellen, dass der Wikipedia-HTML-Code empfangen wird und keine Fehler auftreten.
Dazu setzen wir zunächst einen Haltepunkt bei der Rückgabe von `View()` in der Methode `Index()`. Dadurch wird sichergestellt, dass Sie die Ergebnisse über die Benutzeroberfläche des Visual Studio-Debuggers anzeigen können.
Wenn Sie in der Symbolleiste von Visual Studio die Option „Ausführen“ auswählen, können Sie den oben genannten Code testen: An der Haltepunktstelle hält Visual Studio an, sodass Sie den aktuellen Zustand der Anwendung einsehen können.
Wenn man mit der Maus über die Variable fährt, wird angezeigt, dass der Server eine gültige HTML-Seite zurückgesendet hat, was bedeutet, dass wir startklar sind. Wenn Sie im Kontextmenü „HTML-Visualizer“ auswählen, wird eine Vorschau der HTML-Seite angezeigt.
HTML-Analyse
Nun ist es an der Zeit, die abgerufene HTML-Tabelle zu analysieren. Eine beliebte Parser-Suite namens HTML Agility Pack lässt sich beispielsweise problemlos in LINQ integrieren.
Bevor Sie die HTML-Tabelle analysieren, müssen Sie die Struktur der Seite verstehen, damit Sie genau erkennen können, welche Elemente abgerufen werden müssen. Auch in dieser Situation erweisen sich die Entwicklertools Ihres Browsers als nützlich, da Sie damit den DOM-Baum gründlich untersuchen können.
Wie wir auf unserer Wikipedia-Seite sehen können, gibt es im Inhaltsverzeichnis zahlreiche Links, sodass wir diese nicht benötigen. Es gibt noch weitere Links, von denen wir einige für unsere Datenerhebung nicht unbedingt benötigen (wie beispielsweise die Bearbeitungslinks).
Bei genauerer Betrachtung stellen wir fest, dass jeder Link, der uns interessiert, in einem übergeordneten `li>`-Element enthalten ist. Wir wissen nun, dass `li>`-Elemente sowohl für die Inhaltstabelle auf der Seite als auch für unsere eigentlichen Link-Komponenten verwendet werden, wie aus dem DOM-Baum hervorgeht.
Da wir die Inhaltstabelle eigentlich gar nicht benötigen, musst du sicherstellen, dass diese `li>`-Elemente herausgefiltert werden. Glücklicherweise haben sie eigene HTML-Klassen, sodass wir alle `li>`-Elemente mit den entsprechenden Klassenbezeichnungen im Code ganz einfach weglassen können.
Jetzt geht es ans Programmieren! Zunächst fügen wir die Methode `ParseHtml` in unsere Controller-Klasse ein.
Hier erstellen wir zunächst eine HtmlDocument-Instanz und laden dann die zuvor heruntergeladene HTML-Seite über CallUrl() hoch. Da wir nun über eine gültige DOM-Darstellung unserer Seite verfügen, können wir mit dem Scraping beginnen.
- Wir erhalten alle li>-Nachkommen von Descendants ()
- Um Elemente herauszufiltern, die die oben genannten HTML-Klassen verwenden, nutzen wir LINQ (Where()).
- In unseren WikiLink-Listen durchlaufen wir (für jeden) unsere Links und speichern ihre (relativen) URLs als relative URLs.
Wir geben die Zeichenfolgenliste an den Aufrufer zurück.
XPath
Wir hätten die Elemente nicht einzeln auswählen müssen, und das ist wichtig zu beachten. Wir haben es nur getan, um mit gutem Beispiel voranzugehen.
Die Verwendung einer XPath-Abfrage ist in der Praxis wesentlich praktischer. Dadurch könnte unser gesamter Auswahlprozess in einem einzigen Satz untergebracht werden.
Ähnlich wie bei unserem herkömmlichen Verfahren werden hier alle (//) li>-Elemente ausgewählt, die nicht die angegebene Klasse enthalten (not(contains())).
Erstellen einer Datei für den Export von gesammelten Daten
Der Text der HTML-Tabelle wurde von Wikipedia heruntergeladen, in einen DOM-Baum geparst bzw. verarbeitet, und alle erforderlichen Links wurden erfolgreich extrahiert. Damit verfügen wir nun über eine allgemeine Liste der Hyperlinks auf dieser Seite.
Die Links sollten nun in das CSV-Dateiformat exportiert werden. Um Informationen aus der allgemeinen Liste in eine Datei zu schreiben, erstellen wir eine neue Methode namens WriteToCsv(). Der vollständige Ablauf ist im folgenden Code dargestellt.
Es erstellt auf der lokalen Festplatte eine Datei namens „links.csv“ und speichert die extrahierten Hyperlinks darin. Schreiben Sie also Daten mithilfe der nativen .NET -Framework -APIs in eine Datei auf einer lokalen Festplatte.
Schlussfolgerung
Mit Tools wie WebScrapingAPI ist es ganz einfach, ein Crawler-Projekt zu erstellen und die benötigten Informationen schnell zu sammeln. C# und .NET bieten im Allgemeinen alle erforderlichen Ressourcen und Bibliotheken, damit Sie Ihren eigenen Data Scraper implementieren können.

Die verschiedenen Methoden, um zu verhindern, dass man vom Server blockiert oder in der Übertragungsrate gedrosselt wird, haben wir bisher nur kurz angesprochen. Meistens sind es jedoch nicht technische Einschränkungen, die dem Web-Scraping im Wege stehen.
Wenn Sie sich lieber auf Ihre Daten konzentrieren möchten, anstatt sich mit User-Agents, Ratenbeschränkungen, Proxys und JavaScript-Problemen herumzuschlagen, werfen Sie doch einmal einen Blick auf die hochmodernen Funktionen der WebScrapingAPI.




