Zurück zum Blog
Anleitungen
Sorin-Gabriel MaricaLast updated on Mar 31, 20269 min read

Apiasp.Net Core Web Scraping: Ihr Leitfaden für 2023

Apiasp.Net Core Web Scraping: Ihr Leitfaden für 2023

Apiasp.net – Web-Scraping im Kern

Web-Scraping ist eine vorprogrammierte Technik zum Extrahieren großer Datenmengen aus Websites. Der Großteil dieser Daten ist unorganisiert und liegt im HTML-Format vor. Dennoch wird er anschließend in strukturierte Informationen in einer Datenbank oder Tabelle umgewandelt, um in anderen Programmen genutzt zu werden. 

Um Daten von Websites zu extrahieren, gibt es verschiedene Methoden für das Web Scraping. Dazu gehören die Nutzung von Online-Diensten, bestimmte APIs oder sogar das Schreiben eines eigenen Codes für das Web Scraping. Auf einigen Websites können Sie auf Daten in strukturierter Form zugreifen.

Obwohl dies häufig die beste Option ist, sind einige Websites entweder nicht in der Lage, Nutzern große Datenmengen in geordneter Form bereitzustellen, oder sie sind in Bezug auf die Technologie nicht sehr fortschrittlich. In diesem Fall ist es besser, Web-Scraping einzusetzen, um Daten von der Website zu sammeln.

Python ist mittlerweile die am weitesten verbreitete Programmiersprache für Web-Scraping. Für das Web-Scraping stellt Python mehrere Bibliotheken zur Verfügung. .NET kann ebenfalls für das Web-Crawling verwendet werden. Wir können Daten von vielen Websites mithilfe von Web-APIs von Drittanbietern scrapen.

Eine beliebte API für Web Scraping in .NET heißt WebScrapingAPI. Kürzlich wurde auch die .NET Core-Edition für Web Scraping hinzugefügt.

Unterschied zwischen Web-Scraping und Web-Crawl ing

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

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

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

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

Erstellen einer ASP.NET Core Web-API mit Visual Studio 2022

Erstellen einer 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.

Für statische Seiten

Für statische Seiten

Einrichtung

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#

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

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

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

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

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

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. 

Über den Autor
Sorin-Gabriel Marica, Full-Stack-Entwickler @ WebScrapingAPI
Sorin-Gabriel MaricaFull-Stack-Entwickler

Sorin Marica ist Full-Stack- und DevOps-Entwickler bei WebScrapingAPI, wo er Produktfunktionen entwickelt und die Infrastruktur wartet, die für einen reibungslosen Betrieb der Plattform sorgt.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.