Unterschied zwischen Web-Scraping und Web-Crawling
Webbrowser dienen dazu, Metadaten auf Webseiten im Internet anzuzeigen, das eine beträchtliche Datenmenge beherbergt. Benutzer können einfach zwischen Websites wechseln und Daten mithilfe browserbasierter Anzeigeseiten interpretieren.
Web-Crawling und Web-Scraping sind Begriffe, die den Prozess der Extraktion von Quellcode beschreiben. Web-Scraping ist der Prozess der Analyse einer Webseite und der Gewinnung von Informationen daraus. Die Suche nach Weblinks und das iterative Abrufen ihrer Inhalte wird als Web-Crawling bezeichnet.
Beide Vorgänge werden von einer Anwendung ausgeführt, da das Aufspüren neuer Verbindungen das Scraping von Webseiten erfordert. Beide Begriffe, die gelegentlich synonym verwendet werden, beziehen sich auf den Vorgang der Informationsgewinnung. Sie dienen jedoch vielen Zwecken.
Wie und wo kann dieses Wissen genutzt werden?
Antworten sind online in größerer Zahl zu finden als die Anzahl der Websites. Diese Erkenntnis kann ein wertvolles Werkzeug für die Entwicklung von Apps sein, und das Verständnis dafür, wie man solchen Code schreibt, könnte auf automatisierte Webtests angewendet werden.
In diesem Blog werden wir zwei Methoden zum Crawlen und Scrapen von Daten im Web unter Verwendung von Browsern und einfachen HTTP-Anfragen sowie die jeweiligen Vor- und Nachteile dieser Methoden besprechen.
Nutzung von HTTP-Anfragen und Webbrowsern zum Herunterladen von Webinhalten
Da heutzutage fast alles online ist, findet man zweifellos in jeder Programmiersprache ein Modul zum Senden von HTTP-Anfragen. Einfache HTTP-Anfragen werden schnell ausgeführt. Die Verwendung von Webbrowsern wie Firefox und Google Chrome als Alternative dauert länger.
Sie verhalten sich anders und werden anders dargestellt, was die Art und Weise jeder Aktivität verändert und dazu führt, dass sie leicht lesbar sind und dazu dienen, Darstellungsstile und ausgeführte Skripte auf Webseiten zu berücksichtigen. Webbrowser verschwenden gelegentlich Ressourcen. Zum Beispiel kann 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 erleichtert.
CSS und XPath-Parsing
XPath und CSS sind zwei häufig verwendete Methoden zum Parsen von Text. XPath, eine Abfragesprache, wird verwendet, um bestimmte Elemente in XML- und HTML-Dateien zu identifizieren.
Jede hat eine bestimmte Struktur, und diesem Muster kann beim Schreiben einer Abfrage gefolgt werden. 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 unter .NET 4x funktionieren, da sie in letzter Zeit kaum verändert wurden. Eine Beispielwebsite (eine ASP.NET Core MVC-Anwendung) mit drei Seiten ist ebenfalls im Repository enthalten:
- Seiten mit einer einfachen Tabelle
- Seiten mit einem „versteckten Link“ und
- Eine Schaltfläche, die erst nach Ablauf einer Zeitüberschreitung angezeigt wird
Erstellenrer"> einer rer">ASP.NET Core Web-API mit Visual Studio 2022
Mit .NET 6.0 kann Visual Studio 2022 zur Entwicklung einer ASP.NET Core Web-App-API verwendet werden. 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. Zusätzlich können Sie die OpenAPI-Standardunterstützung auswählen. Dies führt für das Projekt zu 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 spezifisches MVC-basiertes .NET Core-Webanwendungsprojekt verwendet (Model View Controller).
Nutzen Sie den NuGet-Paketmanager, um die erforderlichen Bibliotheken, die in dieser Anleitung verwendet werden, nach dem Erstellen eines neuen Projekts 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 parsen, 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:
Senden einer HTTP-Anfrage an eine Webseite mit C#
Stellen Sie sich ein Beispielprojekt vor, in dem Sie Wikipedia nach Informationen über bekannte Programmierer durchsuchen müssen. Gäbe es keinen Artikel darüber, wäre Wikipedia nicht 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 scrapen und die Daten im CSV-Format speichern (das beispielsweise Excel problemlos verarbeiten kann).
Die Grundidee 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 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 übergeordneten Kategorieseite können genutzt werden, um Webseiten in komplexeren Projekten zu crawlen. Konzentrieren wir uns für die folgenden Beispiele jedoch auf diese spezifische Wikipedia-Seite.
HTML abrufen mit .HttpClient NET Core Web-APIs
Ein integrierter HTTP-Client für .NET heißt HttpClient und ist standardmäßig verfügbar. Es sind keine unabhängigen Bibliotheken oder Plugins von Drittanbietern erforderlich, da die Net.HTTP-Domäne alles 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 asynchron und nicht blockierend mit GetStringAsync() abzurufen
private static async Task<string> CallUrl(string full URL)
{
HttpClient client = new HttpClient();
var response = await client.GetStringAsync(full URL);
return response;
}
Sie erstellen lediglich ein brandneues HttpClient-Objekt, rufen GetStringAsync() auf, „warten“, bis der Vorgang abgeschlossen ist, und übergeben dann das Ergebnis an den Aufrufer. Da diese Technologie nun zur Controller-Klasse hinzugefügt wurde, können Sie CallUrl() aus der Index()-Methode heraus aufrufen, ohne weitere Maßnahmen zu ergreifen. Lassen Sie uns das 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 an, rufen sie mit `CallUrl()` auf und speichern das Ergebnis in den abhängigen Variablen.
Okay, der Code zum Senden der HTTP-Anfrage ist 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 return View() in der Index()-Methode. Dadurch wird sichergestellt, dass Sie die Ergebnisse über die Benutzeroberfläche des Visual Studio-Debuggers sehen können.
Durch Auswahl der Option „Ausführen“ in der Visual Studio-Symbolleiste können Sie den oben genannten Code testen: Am Haltepunkt hält Visual Studio an, sodass Sie den aktuellen Zustand der Anwendung sehen können.
Wenn Sie mit der Maus über die Variable fahren, 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, sehen Sie eine Vorschau der HTML-Seite.
HTML-Parsing
Nun ist es an der Zeit, die abgerufene HTML-Tabelle zu parsen. Eine beliebte Parser-Suite namens HTML Agility Pack lässt sich beispielsweise problemlos in LINQ integrieren.
Bevor Sie die HTML-Tabelle parsen, müssen Sie die Struktur der Seite verstehen, damit Sie genau erkennen können, welche Elemente abgerufen werden sollen. Die Entwicklertools Ihres Browsers sind auch in dieser Situation wieder sehr nützlich, da Sie damit den DOM-Baum gründlich untersuchen können.
Auf unserer Wikipedia-Seite sehen wir, dass die Links in unserem Inhaltsverzeichnis zahlreich sind, sodass wir diese nicht benötigen. Es gibt noch weitere zusätzliche Links, von denen wir einige für unsere Datenerfassung nicht unbedingt benötigen (wie die Bearbeitungslinks).
Bei genauerer Betrachtung stellen wir fest, dass jeder Link, der uns interessiert, in einem übergeordneten li>-Element enthalten ist. Anhand des DOM-Baums wissen wir nun, dass li>-Elemente sowohl für die Inhaltstabelle auf der Seite als auch für unsere eigentlichen Link-Komponenten verwendet werden.
Da wir die Inhaltstabelle eigentlich nicht benötigen, müssen wir sicherstellen, dass diese li>-Elemente herausgefiltert werden. Glücklicherweise haben sie separate HTML-Klassen, sodass wir alle li>-Elemente mit bestimmten Klassenbezeichnungen im Code einfach weglassen können.
Jetzt geht es ans Programmieren! Wir beginnen damit, die Methode ParseHtml in unsere Controller-Klasse () aufzunehmen.
Hier erstellen wir zunächst eine HtmlDocument-Instanz und laden dann die HTML-Seite, die wir zuvor über CallUrl () heruntergeladen haben. 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 über Descendants ()
- Um Elemente herauszufiltern, die die oben genannten HTML-Klassen verwenden, nutzen wir LINQ (Where()).
- In unseren wikiLink-Zeichenfolgenlisten durchlaufen wir (for each) unsere Links und speichern ihre (relativen) URLs als relative URLs.
Wir geben die String-Liste an unseren 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 ein gutes Beispiel zu geben.
Die Anwendung einer XPath-Abfrage ist in realen Programmen wesentlich praktischer. Dadurch würde unser gesamter Auswahlprozess in einen einzigen Satz passen.
Ähnlich wie bei unserem herkömmlichen Verfahren wählt dies alle (//) li> aus, die nicht die angegebene Klasse haben (not(contains())).
Erstellen einer Datei für den Export der gescrapten Daten
Der Text der HTML-Tabelle wurde von Wikipedia heruntergeladen, in einen DOM-Baum geparst/verarbeitet und alle benötigten Links wurden erfolgreich extrahiert. Damit verfügen wir nun über eine allgemeine Liste von Hyperlinks von der 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.
Sie erstellt eine Datei namens „links.csv“ auf der lokalen Festplatte und speichert die extrahierten Hyperlinks darin. Schreiben Sie also Daten unter Verwendung der nativen .NET-Framework-APIs in eine Datei auf einer lokalen Festplatte.
Fazit
Mit Tools wie WebScrapingAPI ist es sehr einfach, ein Crawler-Projekt zu erstellen und die benötigten Informationen schnell zu sammeln. C# und .NET enthalten im Allgemeinen alle erforderlichen Ressourcen und Bibliotheken, um Ihren eigenen Data Scraper zu implementieren.
Die verschiedenen Methoden, um zu verhindern, dass Sie vom Server blockiert oder in Ihrer Rate gedrosselt werden, haben wir hier nur kurz angesprochen. In der Regel sind es weniger technische Einschränkungen als vielmehr andere Faktoren, 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 einen Blick auf die hochmodernen Funktionen von WebScrapingAPI.




