Wie man Daten von Websites in C# # extrahiert
IronWebscraper ist eine .NET Bibliothek für Web Scraping, Web Daten Extraktion und Web Content Parsing. Es handelt sich um eine einfach zu verwendende Bibliothek, die zu Microsoft Visual Studio-Projekten hinzugefügt werden kann, um sie in der Entwicklung und Produktion einzusetzen.
IronWebscraper verfügt über viele einzigartige Funktionen und Möglichkeiten, wie z.B. die Kontrolle von erlaubten und verbotenen Seiten, Objekten, Medien, etc. Es ermöglicht auch die Verwaltung mehrerer Identitäten, Web-Cache und viele andere Funktionen, die wir in diesem Tutorial behandeln werden.
Erste Schritte mit IronWebscraper
Beginnen Sie noch heute mit der Verwendung von IronWebScraper in Ihrem Projekt mit einer kostenlosen Testversion.
Zielpublikum
Dieses Tutorial richtet sich an Softwareentwickler mit grundlegenden oder fortgeschrittenen Programmierkenntnissen, die Lösungen für fortgeschrittene Scraping-Funktionen entwickeln und implementieren möchten (Websites-Scraping, Erfassung und Extraktion von Websitedaten, Analyse von Website-Inhalten, Web-Harvesting).

Erforderliche Fähigkeiten
Grundlegende Programmierkenntnisse mit Kenntnissen in einer der Microsoft-Programmiersprachen wie C# oder VB.NET
Grundlegendes Verständnis von Webtechnologien (HTML, JavaScript, JQuery, CSS usw.) und deren Funktionsweise
- Grundkenntnisse von DOM, XPath, HTML und CSS-Selektoren
Werkzeuge
Microsoft Visual Studio 2010 oder höher
- Webentwickler-Erweiterungen für Browser wie der Web-Inspektor für Chrome oder Firebug für Firefox
Warum kratzen?
(Gründe und Konzepte)
Wenn Sie ein Produkt oder eine Lösung entwickeln wollen, das/die dazu in der Lage ist:
Website-Daten extrahieren
Vergleichen Sie Inhalte, Preise, Funktionen usw. von mehreren Websites
Scannen und Zwischenspeichern von Website-Inhalten
Wenn Sie einen oder mehrere der oben genannten Gründe haben, dann ist IronWebscraper eine großartige Bibliothek, die Ihren Bedürfnissen entspricht
Wie wird IronWebScraper installiert?
Nachdem Sie ein neues Projekt erstellt haben (siehe Anhang A), können Sie die IronWebScraper-Bibliothek zu Ihrem Projekt hinzufügen, indem Sie die Bibliothek automatisch mit NuGet einfügen oder das DLL manuell installieren.
Installation mit NuGet
Um die IronWebScraper-Bibliothek zu unserem Projekt hinzuzufügen, können wir dies mithilfe der visuellen Schnittstelle (NuGet-Paket-Manager) oder per Befehl über die Paket-Manager-Konsole tun.
NuGet-Paketmanager verwenden
Mit der Maus -> Rechtsklick auf den Projektnamen -> NuGet-Paket verwalten auswählen
Auf der Registerkarte Durchsuchen -> IronWebscraper suchen -> Installieren
Ok klicken
- Und wir sind fertig
NuGet-Paketkonsole verwenden
Über Werkzeuge -> NuGet Package Manager -> Package Manager Console
Wählen Sie Klassenbibliotheksprojekt als Standardprojekt
- Befehl ausführen -> Install-Package IronWebscraper
Manuell installieren
Gehe zu ironsoftware.com
Klicken Sie auf IronWebScraper oder besuchen Sie die Seite direkt über die URL https://ironsoftware.com/csharp/webscraper/
Klicken Sie auf DLL herunterladen.
Heruntergeladene komprimierte Datei entpacken
Klicken Sie in Visual Studio mit der rechten Maustaste auf Projekt -> Hinzufügen -> Referenz -> Durchsuchen
Gehen Sie zum extrahierten Ordner ->
netstandard2.0
-> und wählen Sie alle.dll
-Dateien aus- Und es ist erledigt!
HelloScraper - Unser erstes IronWebScraper-Beispiel
Wie üblich beginnen wir mit der Implementierung der Hello Scraper App, um unseren ersten Schritt mit IronWebscraper zu machen.
Wir haben eine neue Konsolenanwendung mit dem Namen "IronWebScraperSample" erstellt
Schritte zur Erstellung von IronWebScraper-Beispiel
Erstellen Sie einen Ordner und nennen Sie ihn "HelloScraperSample"
Dann eine neue Klasse und nennen Sie sie "HelloScraper"
- Fügen Sie diesen Codeschnipsel zu HelloScraper hinzu
public class HelloScraper : WebScraper
{
/// <summary>
/// Override this method initialize your web-scraper.
/// Important tasks will be to Request at least one start url... and set allowed/banned domain or url patterns.
/// </summary>
public override void Init()
{
License.LicenseKey = "LicenseKey"; // Write License Key
this.LoggingLevel = WebScraper.LogLevel.All; // All Events Are Logged
this.Request("https://blog.scrapinghub.com", Parse);
}
/// <summary>
/// Override this method to create the default Response handler for your web scraper.
/// If you have multiple page types, you can add additional similar methods.
/// </summary>
/// <param name="response">The http Response object to parse</param>
public override void Parse(Response response)
{
// set working directory for the project
this.WorkingDirectory = AppSetting.GetAppRoot()+ @"\HelloScraperSample\Output\";
// Loop on all Links
foreach (var title_link in response.Css("h2.entry-title a"))
{
// Read Link Text
string strTitle = title_link.TextContentClean;
// Save Result to File
Scrape(new ScrapedData() { { "Title", strTitle } }, "HelloScraper.json");
}
// Loop On All Links
if (response.CssExists("div.prev-post > a [href]"))
{
// Get Link URL
var next_page = response.Css("div.prev-post > a [href]")[0].Attributes ["href"];
// Scrape Next URL
this.Request(next_page, Parse);
}
}
}
public class HelloScraper : WebScraper
{
/// <summary>
/// Override this method initialize your web-scraper.
/// Important tasks will be to Request at least one start url... and set allowed/banned domain or url patterns.
/// </summary>
public override void Init()
{
License.LicenseKey = "LicenseKey"; // Write License Key
this.LoggingLevel = WebScraper.LogLevel.All; // All Events Are Logged
this.Request("https://blog.scrapinghub.com", Parse);
}
/// <summary>
/// Override this method to create the default Response handler for your web scraper.
/// If you have multiple page types, you can add additional similar methods.
/// </summary>
/// <param name="response">The http Response object to parse</param>
public override void Parse(Response response)
{
// set working directory for the project
this.WorkingDirectory = AppSetting.GetAppRoot()+ @"\HelloScraperSample\Output\";
// Loop on all Links
foreach (var title_link in response.Css("h2.entry-title a"))
{
// Read Link Text
string strTitle = title_link.TextContentClean;
// Save Result to File
Scrape(new ScrapedData() { { "Title", strTitle } }, "HelloScraper.json");
}
// Loop On All Links
if (response.CssExists("div.prev-post > a [href]"))
{
// Get Link URL
var next_page = response.Css("div.prev-post > a [href]")[0].Attributes ["href"];
// Scrape Next URL
this.Request(next_page, Parse);
}
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
- Jetzt zu starten Scrape Fügen Sie diesen Code Snippet zu Main
static void Main(string [] args)
{
// Create Object From Hello Scrape class
HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
// Start Scraping
scrape.Start();
}
static void Main(string [] args)
{
// Create Object From Hello Scrape class
HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
// Start Scraping
scrape.Start();
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Code-Übersicht
Scrape.Start() => startet die Scrape-Logik wie folgt:
Rufe zuerst die Init()-Methode auf, um die Variablen, Scrape-Eigenschaften und Verhaltensattribute zu initiieren.
Wie wir sehen können, setzt es die Startseite auf Request("https://blog.scrapinghub.com", Parse), und Parse (Response response) ist als der Prozess definiert, der verwendet wird, um die Antwort zu parsen.
Webscraper verwaltet parallel: http und Threads... damit Ihr Code einfach zu debuggen und synchron ist.
- Die Parse-Methode startet nach Init(), um die Seite zu parsen.
Sie können Elemente mit Hilfe von (Css-Selektoren, Js DOM, XPath) finden
Ausgewählte Elemente werden in den Typ ScrapedData-Klasse umgewandelt, Sie können sie in jede beliebige benutzerdefinierte Klasse umwandeln (z. B. Produkt, Mitarbeiter, Nachrichten usw.)
Die Objekte werden in einer Datei im Json-Format im Verzeichnis ("bin/Scrape/") gespeichert. Oder Sie können den Pfad der Datei als Parameter angeben, wie wir später in anderen Beispielen sehen werden.
IronWebscraper Bibliothek Funktionen und Optionen
Sie finden die aktualisierte Dokumentation in der ZIP-Datei, die mit der manuellen Installationsmethode heruntergeladen wurde (IronWebScraper Documentation.chm Datei).
Oder Sie können die Online-Dokumentation für die Bibliothek mit dem letzten Update unter https://ironsoftware.com/csharp/webscraper/object-reference/ einsehen
Um IronWebscraper in Ihrem Projekt zu verwenden, müssen Sie von der Klasse (IronWebScraper.WebScraper) erben, die Ihre Klassenbibliothek erweitert und ihr Scraping-Funktionalität hinzufügt.
Sie müssen auch die Methoden {Init(), Parse(Response response)} implementieren.
namespace IronWebScraperEngine
{
public class NewsScraper : IronWebScraper.WebScraper
{
public override void Init()
{
throw new NotImplementedException();
}
public override void Parse(Response response)
{
throw new NotImplementedException();
}
}
}
namespace IronWebScraperEngine
{
public class NewsScraper : IronWebScraper.WebScraper
{
public override void Init()
{
throw new NotImplementedException();
}
public override void Parse(Response response)
{
throw new NotImplementedException();
}
}
}
Namespace IronWebScraperEngine
Public Class NewsScraper
Inherits IronWebScraper.WebScraper
Public Overrides Sub Init()
Throw New NotImplementedException()
End Sub
Public Overrides Sub Parse(ByVal response As Response)
Throw New NotImplementedException()
End Sub
End Class
End Namespace
Properties \ functions | Type | Description |
---|---|---|
Init () | Method | used to setup the scraper |
Parse (Response response) | Method | Used to implement the logic that the scraper will use and how it will process it. Coming table contain list of methods and properties that IronWebScraper Library are providing NOTE : Can implement multiple method for different pages behaviors or structures |
| Collections | Used to ban/Allow/ URLs And/Or Domains Ex: BannedUrls.Add ("*.zip", "*.exe", "*.gz", "*.pdf"); Note:
|
ObeyRobotsDotTxt | Boolean | Used to enable or disable read and follow robots.txt its directive or not |
public override bool ObeyRobotsDotTxtForHost (string Host) | Method | Used to enable or disable read and follow robots.txt its directive or not for certain domain |
Scrape | Method | |
ScrapeUnique | Method | |
ThrottleMode | Enumeration | |
EnableWebCache () | Method | |
EnableWebCache (TimeSpan cacheDuration) | Method | |
MaxHttpConnectionLimit | Int | |
RateLimitPerHost | TimeSpan | |
OpenConnectionLimitPerHost | Int | |
ObeyRobotsDotTxt | Boolean | |
ThrottleMode | Enum | Enum Options:
|
SetSiteSpecificCrawlRateLimit (string hostName, TimeSpan crawlRate) | Method | |
Identities | Collections | A list of HttpIdentity () to be used to fetch web resources. Each Identity may have a different proxy IP addresses, user Agent, http headers, Persistent cookies, username and password. Best practice is to create Identities in your WebScraper.Init Method and Add Them to this WebScraper.Identities List. |
WorkingDirectory | string | Setting working directory that will be used for all scrape related data will be stored to disk. |
## Praxisnahe Beispiele und Übung
Scraping einer Online-Film-Website
Beginnen wir mit einem weiteren Beispiel von einer echten Website. Wir werden eine Film-Website scrapen.
Fügen wir eine neue Klasse hinzu und nennen sie "MovieScraper":
Werfen wir nun einen Blick auf die Website, die wir scrapen werden:
Dies ist ein Teil der HTML-Homepage, die wir auf der Website sehen:
<div id="movie-featured" class="movies-list movies-list-full tab-pane in fade active">
<div data-movie-id="20746" class="ml-item">
<a href="https://website.com/film/king-arthur-legend-of-the-sword-20746/">
<span class="mli-quality">CAM</span>
<img data-original="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg"
class="lazy thumb mli-thumb" alt="King Arthur: Legend of the Sword"
src="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg"
style="display: inline-block;">
<span class="mli-info"><h2>King Arthur: Legend of the Sword</h2></span>
</a>
</div>
<div data-movie-id="20724" class="ml-item">
<a href="https://website.com/film/snatched-20724/" >
<span class="mli-quality">CAM</span>
<img data-original="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg"
class="lazy thumb mli-thumb" alt="Snatched"
src="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg"
style="display: inline-block;">
<span class="mli-info"><h2>Snatched</h2></span>
</a>
</div>
</div>
<div id="movie-featured" class="movies-list movies-list-full tab-pane in fade active">
<div data-movie-id="20746" class="ml-item">
<a href="https://website.com/film/king-arthur-legend-of-the-sword-20746/">
<span class="mli-quality">CAM</span>
<img data-original="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg"
class="lazy thumb mli-thumb" alt="King Arthur: Legend of the Sword"
src="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg"
style="display: inline-block;">
<span class="mli-info"><h2>King Arthur: Legend of the Sword</h2></span>
</a>
</div>
<div data-movie-id="20724" class="ml-item">
<a href="https://website.com/film/snatched-20724/" >
<span class="mli-quality">CAM</span>
<img data-original="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg"
class="lazy thumb mli-thumb" alt="Snatched"
src="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg"
style="display: inline-block;">
<span class="mli-info"><h2>Snatched</h2></span>
</a>
</div>
</div>
Wie wir sehen können, haben wir eine Film-ID, einen Titel und einen Link zur Detailseite.
Beginnen wir mit dem Scrapen dieses Datensatzes:
public class MovieScraper : WebScraper
{
public override void Init()
{
License.LicenseKey = "LicenseKey";
this.LoggingLevel = WebScraper.LogLevel.All;
this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
this.Request("www.website.com", Parse);
}
public override void Parse(Response response)
{
foreach (var Divs in response.Css("#movie-featured > div"))
{
if (Divs.Attributes ["class"] != "clearfix")
{
var MovieId = Divs.GetAttribute("data-movie-id");
var link = Divs.Css("a")[0];
var MovieTitle = link.TextContentClean;
Scrape(new ScrapedData() { { "MovieId", MovieId }, { "MovieTitle", MovieTitle } }, "Movie.Jsonl");
}
}
}
}
public class MovieScraper : WebScraper
{
public override void Init()
{
License.LicenseKey = "LicenseKey";
this.LoggingLevel = WebScraper.LogLevel.All;
this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
this.Request("www.website.com", Parse);
}
public override void Parse(Response response)
{
foreach (var Divs in response.Css("#movie-featured > div"))
{
if (Divs.Attributes ["class"] != "clearfix")
{
var MovieId = Divs.GetAttribute("data-movie-id");
var link = Divs.Css("a")[0];
var MovieTitle = link.TextContentClean;
Scrape(new ScrapedData() { { "MovieId", MovieId }, { "MovieTitle", MovieTitle } }, "Movie.Jsonl");
}
}
}
}
Public Class MovieScraper
Inherits WebScraper
Public Overrides Sub Init()
License.LicenseKey = "LicenseKey"
Me.LoggingLevel = WebScraper.LogLevel.All
Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
Me.Request("www.website.com", AddressOf Parse)
End Sub
Public Overrides Sub Parse(ByVal response As Response)
For Each Divs In response.Css("#movie-featured > div")
If Divs.Attributes ("class") <> "clearfix" Then
Dim MovieId = Divs.GetAttribute("data-movie-id")
Dim link = Divs.Css("a")(0)
Dim MovieTitle = link.TextContentClean
Scrape(New ScrapedData() From {
{ "MovieId", MovieId },
{ "MovieTitle", MovieTitle }
},
"Movie.Jsonl")
End If
Next Divs
End Sub
End Class
Was ist neu in diesem Code?
Die Eigenschaft Arbeitsverzeichnis wird verwendet, um das Hauptarbeitsverzeichnis für alle gescrapten Daten und die zugehörigen Dateien festzulegen.
Lassen Sie uns mehr tun.
Was, wenn wir typisierte Objekte erstellen müssen, die gescrapte Daten in formatierten Objekten enthalten?
Implementieren wir eine Filmklasse, die unsere formatierten Daten aufnehmen wird:
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
public string URL { get; set; }
}
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
public string URL { get; set; }
}
Public Class Movie
Public Property Id() As Integer
Public Property Title() As String
Public Property URL() As String
End Class
Jetzt werden wir unseren Code aktualisieren:
public class MovieScraper : WebScraper
{
public override void Init()
{
License.LicenseKey = "LicenseKey";
this.LoggingLevel = WebScraper.LogLevel.All;
this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
this.Request("https://website.com/", Parse);
}
public override void Parse(Response response)
{
foreach (var Divs in response.Css("#movie-featured > div"))
{
if (Divs.Attributes ["class"] != "clearfix")
{
var movie = new Movie();
movie.Id = Convert.ToInt32( Divs.GetAttribute("data-movie-id"));
var link = Divs.Css("a")[0];
movie.Title = link.TextContentClean;
movie.URL = link.Attributes ["href"];
Scrape(movie, "Movie.Jsonl");
}
}
}
}
public class MovieScraper : WebScraper
{
public override void Init()
{
License.LicenseKey = "LicenseKey";
this.LoggingLevel = WebScraper.LogLevel.All;
this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
this.Request("https://website.com/", Parse);
}
public override void Parse(Response response)
{
foreach (var Divs in response.Css("#movie-featured > div"))
{
if (Divs.Attributes ["class"] != "clearfix")
{
var movie = new Movie();
movie.Id = Convert.ToInt32( Divs.GetAttribute("data-movie-id"));
var link = Divs.Css("a")[0];
movie.Title = link.TextContentClean;
movie.URL = link.Attributes ["href"];
Scrape(movie, "Movie.Jsonl");
}
}
}
}
Public Class MovieScraper
Inherits WebScraper
Public Overrides Sub Init()
License.LicenseKey = "LicenseKey"
Me.LoggingLevel = WebScraper.LogLevel.All
Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
Me.Request("https://website.com/", AddressOf Parse)
End Sub
Public Overrides Sub Parse(ByVal response As Response)
For Each Divs In response.Css("#movie-featured > div")
If Divs.Attributes ("class") <> "clearfix" Then
Dim movie As New Movie()
movie.Id = Convert.ToInt32(Divs.GetAttribute("data-movie-id"))
Dim link = Divs.Css("a")(0)
movie.Title = link.TextContentClean
movie.URL = link.Attributes ("href")
Scrape(movie, "Movie.Jsonl")
End If
Next Divs
End Sub
End Class
Was gibt’s Neues?
Wir implementieren Movie Class, um unsere gescrapten Daten zu speichern
- Wir übergeben Filmobjekte an die Scrape-Methode und sie versteht unser Format und speichert in einem definierten Format, wie wir hier sehen können:
Beginnen wir mit dem Scannen einer detaillierteren Seite.
Die Filmseite sieht wie folgt aus:
```htmlGuardians of the Galaxy Vol. 2
Genre: Action, Adventure, Sci-Fi
Actor: Chris Pratt, Zoe Saldana, Dave Bautista
Director: James Gunn
Country: United States
Duration: 136 min
Quality: CAM
Release: 2017
IMDb: 8.3
gesamt zulässige Anzahl von offenen HTTP-Anfragen (Threads) * **RateLimitPerHost**
Mindestens höfliche Verzögerung oder Pause (in Millisekunden) zwischen Anfragen an eine bestimmte Domain oder IP-Adresse * **OpenConnectionLimitPerHost**
Erlaubte Anzahl gleichzeitiger HTTP-Anfragen (Threads) * **ThrottleMode**
Lässt den WebScraper Anfragen intelligent drosseln, nicht nur anhand des Hostnamens, sondern auch nach den IP-Adressen der Hostserver. Dies ist höflich für den Fall, dass mehrere gescrapte Domains auf demselben Rechner gehostet werden. ## Anhang ### Wie erstellt man eine Windows-Formularanwendung? Wir sollten dafür Visual Studio 2013 oder höher verwenden. Folgen Sie diesen Schritten, um ein neues Windows Forms-Projekt zu erstellen: 1. Visual Studio öffnen2. Datei -> Neu -> Projekt3. Aus Vorlage, wählen Sie die Programmiersprache (Visual C# oder VB) -> Windows -> Windows Forms-Anwendung**Name des Projekts**: IronScraperSample
**Speicherort**: Wählen Sie einen Ort auf Ihrer Festplatte### Wie erstellt man eine Webformular-Anwendung? Sie sollten dafür Visual Studio 2013 oder höher verwenden. Folgen Sie den Schritten zum Erstellen eines neuen Asp.NET-Webforms-Projekts 1. Visual Studio öffnen2. Datei -> Neu -> Projekt3. Aus Vorlage Wählen Sie Programmiersprache (Visual C# oder VB) -> Web -> ASP.NET-Webanwendung (.NET Framework).**Name des Projekts**: IronScraperSample
**Standort**: Wählen Sie einen Standort auf Ihrer Festplatte aus 4. Von Ihren ASP.NET-Vorlagen5. Ihr grundlegendes ASP.NET-Webformularprojekt ist nun erstellt[Klicken Sie hier](/downloads/assets/tutorials/webscraping-in-c-sharp/IronWebScraperSample.zip), um das vollständige Beispielprojekt mit dem Tutorial-Code herunterzuladen.