Wie man Daten von Websites in C# # extrahiert

Chaknith Bin
Chaknith Bin
28. Oktober 2018
Aktualisiert 22. Dezember 2024
Teilen Sie:
This article was translated from English: Does it need improvement?
Translated
View the article in English

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.

Erster Schritt:
green arrow pointer


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).

Webscraping war noch nie eine einfache Aufgabe, da es keine dominanten Frameworks für den Einsatz in C#- oder .NET-Programmierumgebungen gibt. Iron Web Scraper wurde geschaffen, um dies zu ändern

Erforderliche Fähigkeiten

  1. Grundlegende Programmierkenntnisse mit Kenntnissen in einer der Microsoft-Programmiersprachen wie C# oder VB.NET

  2. Grundlegendes Verständnis von Webtechnologien (HTML, JavaScript, JQuery, CSS usw.) und deren Funktionsweise

  3. Grundkenntnisse von DOM, XPath, HTML und CSS-Selektoren

Werkzeuge

  1. Microsoft Visual Studio 2010 oder höher

  2. 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:

  1. Website-Daten extrahieren

  2. Vergleichen Sie Inhalte, Preise, Funktionen usw. von mehreren Websites

  3. 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

  1. Mit der Maus -> Rechtsklick auf den Projektnamen -> NuGet-Paket verwalten auswählen

    AddIronWebscraperUsingGUI related to NuGet-Paketmanager verwenden

  2. Auf der Registerkarte Durchsuchen -> IronWebscraper suchen -> Installieren

    AddIronWebscraperUsingGUI2 related to NuGet-Paketmanager verwenden

  3. Ok klicken

    AddIronWebscraperUsingGUI3 related to NuGet-Paketmanager verwenden

  4. Und wir sind fertig

    AddIronWebscraperUsingGUI4 related to NuGet-Paketmanager verwenden

NuGet-Paketkonsole verwenden

  1. Über Werkzeuge -> NuGet Package Manager -> Package Manager Console

    AddIronWebscraperUsingConsole related to NuGet-Paketkonsole verwenden

  2. Wählen Sie Klassenbibliotheksprojekt als Standardprojekt

  3. Befehl ausführen -> Install-Package IronWebscraper

    AddIronWebscraperUsingConsole1 related to NuGet-Paketkonsole verwenden

Manuell installieren

  1. Gehe zu ironsoftware.com

  2. Klicken Sie auf IronWebScraper oder besuchen Sie die Seite direkt über die URL https://ironsoftware.com/csharp/webscraper/

  3. Klicken Sie auf DLL herunterladen.

  4. Heruntergeladene komprimierte Datei entpacken

  5. Klicken Sie in Visual Studio mit der rechten Maustaste auf Projekt -> Hinzufügen -> Referenz -> Durchsuchen

    AddIronWebscraperUsingDll related to Manuell installieren

  6. Gehen Sie zum extrahierten Ordner -> netstandard2.0 -> und wählen Sie alle .dll-Dateien aus

    AddIronWebscraperUsingDll2 related to Manuell installieren

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

  1. Erstellen Sie einen Ordner und nennen Sie ihn "HelloScraperSample"

  2. Dann eine neue Klasse und nennen Sie sie "HelloScraper"

    HelloScraperAddClass related to HelloScraper - Unser erstes IronWebScraper-Beispiel

  3. 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
$vbLabelText   $csharpLabel
  1. 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
$vbLabelText   $csharpLabel
  1. Das Ergebnis wird in einer Datei mit dem Format WebSraper.WorkingDirecty/classname.Json gespeichert

    HelloScraperFrmFileResult related to HelloScraper - Unser erstes IronWebScraper-Beispiel

Code-Übersicht

Scrape.Start() => startet die Scrape-Logik wie folgt:

  1. Rufe zuerst die Init()-Methode auf, um die Variablen, Scrape-Eigenschaften und Verhaltensattribute zu initiieren.

  2. 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.

  3. Webscraper verwaltet parallel: http und Threads... damit Ihr Code einfach zu debuggen und synchron ist.

  4. Die Parse-Methode startet nach Init(), um die Seite zu parsen.
    1. Sie können Elemente mit Hilfe von (Css-Selektoren, Js DOM, XPath) finden

    2. 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.)

    3. 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
$vbLabelText   $csharpLabel
Properties \ functionsTypeDescription
Init ()Methodused to setup the scraper
Parse (Response response)MethodUsed 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
  • BannedUrls
  • AllowedUrls
  • BannedDomains
CollectionsUsed to ban/Allow/ URLs And/Or Domains
Ex: BannedUrls.Add ("*.zip", "*.exe", "*.gz", "*.pdf");
Note:
  • You can use ( * and/or ? ) wildcards
  • You can use strings and regular expressions
  • BannedUrls, AllowedUrls, BannedDomains, AllowedDomains
  • BannedUrls.Add ("*.zip", "*.exe", "*.gz", "*.pdf");
  • *? glob sale wildcards
  • strings and regular expressions
  • you can override this behavior by overriding the method: public virtual bool AcceptUrl (string url)
ObeyRobotsDotTxtBooleanUsed to enable or disable read and follow robots.txt its directive or not
public override bool ObeyRobotsDotTxtForHost (string Host)MethodUsed to enable or disable read and follow robots.txt its directive or not for certain domain
ScrapeMethod
ScrapeUniqueMethod
ThrottleModeEnumeration
EnableWebCache ()Method
EnableWebCache (TimeSpan cacheDuration)Method
MaxHttpConnectionLimitInt
RateLimitPerHostTimeSpan
OpenConnectionLimitPerHostInt
ObeyRobotsDotTxtBoolean
ThrottleModeEnumEnum Options:
  • ByIpAddress
  • ByDomainHostName
SetSiteSpecificCrawlRateLimit (string hostName, TimeSpan crawlRate)Method
IdentitiesCollectionsA 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.
WorkingDirectorystringSetting 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":

MovieScrapaerAddClass related to Scraping einer Online-Film-Website

Werfen wir nun einen Blick auf die Website, die wir scrapen werden:

123movies related to Scraping einer Online-Film-Website

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>
HTML

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Was gibt’s Neues?

  1. Wir implementieren Movie Class, um unsere gescrapten Daten zu speichern

  2. Wir übergeben Filmobjekte an die Scrape-Methode und sie versteht unser Format und speichert in einem definierten Format, wie wir hier sehen können:

    MovieResultMovieClass related to Scraping einer Online-Film-Website

    Beginnen wir mit dem Scannen einer detaillierteren Seite.

Die Filmseite sieht wie folgt aus:

MovieDetailsSample related to Scraping einer Online-Film-Website

```html

Guardians of the Galaxy Vol. 2

Set to the backdrop of Awesome Mixtape #2, Marvel's Guardians of the Galaxy Vol. 2 continues the team's adventures as they travel throughout the cosmos to help Peter Quill learn more about his true parentage.

Duration: 136 min

Quality: CAM

Release: 2017

IMDb: 8.3

``` Wir können unsere Filmklasse um neue Eigenschaften erweitern (Beschreibung, Genre, Schauspieler, Regisseur, Land, Dauer, IMDB-Bewertung), aber wir werden (Beschreibung, Genre, Schauspieler) nur für unser Beispiel verwenden. ```cs public class Movie { public int Id { get; set; } public string Title { get; set; } public string URL { get; set; } public string Description { get; set; } public ListGenre { get; set; } public ListActor { get; set; } } ``` Jetzt navigieren wir zu der Seite Detailliert, um sie zu scrapen. IronWebscraper ermöglicht es Ihnen, die Scrape-Funktion zu erweitern, um verschiedene Arten von Seitenformaten zu scrapen Wie wir hier sehen können: ```cs 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://domain/", 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"]; this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });// to scrap Detailed Page } } } public void ParseDetails(Response response) { var movie = response.MetaData.Get("movie"); var Div = response.Css("div.mvic-desc")[0]; movie.Description = Div.Css("div.desc")[0].TextContentClean; foreach(var Genre in Div.Css("div > p > a")) { movie.Genre.Add(Genre.TextContentClean); } foreach (var Actor in Div.Css("div > p:nth-child(2) > a")) { movie.Actor.Add(Actor.TextContentClean); } Scrape(movie, "Movie.Jsonl"); } } ``` *Was gibt’s Neues?* 1. Wir können Scrape-Funktionen (ParseDetails) hinzufügen, um Detailseiten zu scrapen. 2. Wir haben die Scrape-Funktion, die unsere Datei erzeugt, in die neue Funktion 3. Wir haben die IronWebScraper-Funktion (MetaData) verwendet, um unser Filmobjekt an die neue Scrape-Funktion zu übergeben. 4. Wir haben die Seite ausgewertet und unsere Filmobjektdaten in einer Datei gespeichert

MovieResultMovieClass1 related to Scraping einer Online-Film-Website

### Scrapen von Inhalten einer Shopping-Website Wir wählen eine Einkaufsseite aus, um den Inhalt von ihr zu scrapen

ShoppingSite related to Scraping einer Online-Film-Website

Wie Sie auf dem Bild sehen können, haben wir eine linke Leiste, die Links zu den Produktkategorien der Website enthält Unser erster Schritt besteht also darin, den HTML-Code der Website zu untersuchen und zu planen, wie wir sie scrapen wollen.

ShoppingSiteLeftBar related to Scraping einer Online-Film-Website

Die Kategorien der Mode-Website haben Unterkategorien (Männer, Frauen, Kinder) ```html``` Richten wir ein Projekt ein 1. Erstellen Sie eine neue Konsolenanwendung oder fügen Sie einen neuen Ordner für unser neues Beispiel mit dem Namen "ShoppingSiteSample" hinzu 2. Neue Klasse mit dem Namen "ShoppingScraper" hinzufügen 3. Der erste Schritt besteht darin, die Website-Kategorien und ihre Unterkategorien zu durchsuchen Lassen Sie uns ein Kategorienmodell erstellen: ```cs public class Category { ////// Gets or sets the name. ///////// The name. ///public string Name { get; set; } ////// Gets or sets the URL. ///////// The URL. ///public string URL { get; set; } ////// Gets or sets the sub categories. ///////// The sub categories. ///public ListSubCategories { get; set; } } ``` 4. Bauen wir nun unsere Scrape-Logik auf ```cs public class ShoppingScraper : WebScraper { ////// 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. ///public override void Init() { License.LicenseKey = "LicenseKey"; this.LoggingLevel = WebScraper.LogLevel.All; this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\"; this.Request("www.webSite.com", Parse); } ////// 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. //////The http Response object to parsepublic override void Parse(Response response) { var categoryList = new List(); foreach (var Links in response.Css("#menuFixed > ul > li > a ")) { var cat = new Category(); cat.URL = Links.Attributes ["href"]; cat.Name = Links.InnerText; categoryList.Add(cat); } Scrape(categoryList, "Shopping.Jsonl"); } } ``` Scraping von Links aus dem Menü

ShoppingSiteScrapeMenu related to Scraping einer Online-Film-Website

Aktualisieren wir unseren Code, um die Hauptkategorien und alle ihre Unterlinks zu scrapen ```cs public override void Parse(Response response) { // List of Categories Links (Root) var categoryList = new List(); foreach (var li in response.Css("#menuFixed > ul > li")) { // List Of Main Links foreach (var Links in li.Css("a")) { var cat = new Category(); cat.URL = Links.Attributes ["href"]; cat.Name = Links.InnerText; cat.SubCategories = new List(); // List of Sub Catgories Links foreach (var subCategory in li.Css("a [class=subcategory]")) { var subcat = new Category(); subcat.URL = Links.Attributes ["href"]; subcat.Name = Links.InnerText; // Check If Link Exist Before if (cat.SubCategories.Find(c=>c.Name== subcat.Name && c.URL == subcat.URL) == null) { // Add Sublinks cat.SubCategories.Add(subcat); } } // Add Categories categoryList.Add(cat); } } Scrape(categoryList, "Shopping.Jsonl"); } ``` Da wir nun Links zu allen Website-Kategorien haben, können wir damit beginnen, die Produkte innerhalb jeder Kategorie zu durchsuchen Navigieren wir zu einer beliebigen Kategorie und prüfen wir den Inhalt.

ProductSubCategoryList related to Scraping einer Online-Film-Website

Schauen wir uns den Code an ```html
``` Lassen Sie uns unser Produktmodell für diesen Inhalt erstellen. ```cs public class Product { ////// Gets or sets the name. ///////// The name. ///public string Name { get; set; } ////// Gets or sets the price. ///////// The price. ///public string Price { get; set; } ////// Gets or sets the image. ///////// The image. ///public string Image { get; set; } } ``` Um Kategorieseiten zu scrapen, fügen wir eine neue Scrape-Methode hinzu: ```cs public void ParseCatgory(Response response) { // List of Products Links (Root) var productList = new List(); foreach (var Links in response.Css("body > main > section.osh-content > section.products > div > a")) { var product = new Product(); product.Name = Links.InnerText; product.Image = Links.Css("div.image-wrapper.default-state > img")[0].Attributes ["src"]; productList.Add(product); } Scrape(productList, "Products.Jsonl"); } ``` ### Erweiterte Webscraping-Funktionen #### HttpIdentity-Merkmal: Bei einigen Website-Systemen muss der Nutzer angemeldet sein, um den Inhalt zu sehen; in diesem Fall können wir eine HttpIdentity verwenden: - ```cs HttpIdentity id = new HttpIdentity(); id.NetworkUsername = "username"; id.NetworkPassword = "pwd"; Identities.Add(id); ``` Eines der beeindruckendsten und leistungsstärksten Merkmale von IronWebScraper ist die Fähigkeit, Tausende von einzigartigen (Benutzerdaten und/oder Browser-Engines) zu verwenden, um Websites mithilfe von Multi-Login-Sitzungen zu täuschen oder auszulesen. ```cs public override void Init() { License.LicenseKey = " LicenseKey "; this.LoggingLevel = WebScraper.LogLevel.All; this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\"; var proxies = "IP-Proxy1: 8080,IP-Proxy2: 8081".Split(','); foreach (var UA in IronWebScraper.CommonUserAgents.ChromeDesktopUserAgents) { foreach (var proxy in proxies) { Identities.Add(new HttpIdentity() { UserAgent = UA, UseCookies = true, Proxy = proxy }); } } this.Request("http://www.Website.com", Parse); } ``` Sie haben mehrere Eigenschaften, die Ihnen verschiedene Verhaltensweisen ermöglichen und so verhindern, dass Websites Sie blockieren. Einige dieser Eigenschaften: - * **NetworkDomain**: Die Netzwerkdomäne, die für die Benutzerauthentifizierung verwendet werden soll. Unterstützt Windows, NTLM, Keroberos, Linux, BSD und Mac OS X Netzwerke. Muss mit (NetworkUsername und NetworkPassword) verwendet werden * **NetzwerkBenutzername**: Der Netzwerk/HTTP-Benutzername, der zur Benutzerauthentifizierung verwendet wird. Unterstützt Http, Windows-Netzwerke, NTLM, Kerberos, Linux-Netzwerke, BSD-Netzwerke und Mac OS. * **NetworkPassword** : Das Netzwerk/HTTP-Passwort, das zur Benutzerauthentifizierung verwendet werden soll. Unterstützt Http , Windows-Netzwerke, NTLM , Keroberos , Linux-Netzwerke, BSD-Netzwerke und Mac OS. * **Proxy**: Proxy-Einstellungen festlegen * **UserAgent** : zum Festlegen der Browser-Engine (Chrome Desktop, Chrome Mobile, Chrome Tablet, IE und Firefox, etc.) * **HttpRequestHeaders**: für benutzerdefinierte Header-Werte, die mit dieser Identität verwendet werden sollen, und es akzeptiert ein Wörterbuchobjekt \(Dictionary\) * **UseCookies** : die Verwendung von Cookies aktivieren/deaktivieren IronWebscraper führt den Scraper mit Zufallsidentitäten aus. Wenn wir die Verwendung einer bestimmten Identität zum Parsen einer Seite angeben müssen, können wir dies tun. ```cs public override void Init() { License.LicenseKey = " LicenseKey "; this.LoggingLevel = WebScraper.LogLevel.All; this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\"; HttpIdentity identity = new HttpIdentity(); identity.NetworkUsername = "username"; identity.NetworkPassword = "pwd"; Identities.Add(id); this.Request("http://www.Website.com", Parse, identity); } ``` #### Aktivieren Sie die Funktion Web-Cache: Diese Funktion dient dazu, angeforderte Seiten zwischenzuspeichern. Sie wird häufig in der Entwicklungs- und Testphase eingesetzt; die es Entwicklern ermöglicht, benötigte Seiten zwischenzuspeichern und nach einer Codeaktualisierung wiederzuverwenden. Dies ermöglicht es Ihnen, Ihren Code auf zwischengespeicherten Seiten auszuführen, nachdem Sie Ihren Web Scraper neu gestartet haben, ohne sich jedes Mal mit der Live-Website verbinden zu müssen (Action-Replay). *Sie können es in der Init()-Methode verwenden* EnableWebCache(); OR EnableWebCache(TimeSpan Ablauffrist); Es speichert Ihre zwischengespeicherten Daten im WebCache-Ordner unter dem Ordner des Arbeitsverzeichnisses ```cs public override void Init() { License.LicenseKey = " LicenseKey "; this.LoggingLevel = WebScraper.LogLevel.All; this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\"; EnableWebCache(new TimeSpan(1,30,30)); this.Request("http://www.WebSite.com", Parse); } ``` IronWebScraper verfügt außerdem über Funktionen, die es Ihrer Engine ermöglichen, nach dem Neustart des Codes das Scraping fortzusetzen, indem Sie den Prozessnamen des Startvorgangs der Engine mit Start(CrawlID) festlegen. ```cs static void Main(string [] args) { // Create Object From Scraper class EngineScraper scrape = new EngineScraper(); // Start Scraping scrape.Start("enginestate"); } ``` Die Ausführungsanforderung und die Antwort werden im Ordner "SavedState" im Arbeitsverzeichnis gespeichert. #### Drosselung Wir können die minimale und maximale Anzahl der Verbindungen und die Verbindungsgeschwindigkeit pro Domain steuern. ```cs public override void Init() { License.LicenseKey = "LicenseKey"; this.LoggingLevel = WebScraper.LogLevel.All; this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\"; // Gets or sets the total number of allowed open HTTP requests (threads) this.MaxHttpConnectionLimit = 80; // Gets or sets minimum polite delay (pause)between request to a given domain or IP address. this.RateLimitPerHost = TimeSpan.FromMilliseconds(50); // Gets or sets the allowed number of concurrent HTTP requests (threads) per hostname // or IP address. This helps protect hosts against too many requests. this.OpenConnectionLimitPerHost = 25; this.ObeyRobotsDotTxt = false; // Makes the WebSraper intelligently throttle requests not only by hostname, but // also by host servers' IP addresses. This is polite in-case multiple scraped domains // are hosted on the same machine. this.ThrottleMode = Throttle.ByDomainHostName; this.Request("https://www.Website.com", Parse); } ``` **Regelungseigenschaften** * **MaxHttpConnectionLimit**
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 öffnen

Enterprise2015 related to Scraping einer Online-Film-Website

2. Datei -> Neu -> Projekt

FileNewProject related to Scraping einer Online-Film-Website

3. Aus Vorlage, wählen Sie die Programmiersprache (Visual C# oder VB) -> Windows -> Windows Forms-Anwendung

CreateWindowsApp related to Scraping einer Online-Film-Website

**Name des Projekts**: IronScraperSample
**Speicherort**: Wählen Sie einen Ort auf Ihrer Festplatte

WindowsAppMainScreen related to Scraping einer Online-Film-Website

### 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 öffnen

Enterprise2015 related to Scraping einer Online-Film-Website

2. Datei -> Neu -> Projekt

FileNewProject related to Scraping einer Online-Film-Website

3. Aus Vorlage Wählen Sie Programmiersprache (Visual C# oder VB) -> Web -> ASP.NET-Webanwendung (.NET Framework).

ASPNETWebApplication related to Scraping einer Online-Film-Website

**Name des Projekts**: IronScraperSample
**Standort**: Wählen Sie einen Standort auf Ihrer Festplatte aus 4. Von Ihren ASP.NET-Vorlagen
  1. Leere Vorlage auswählen
  2. Webformulare prüfen
  3. ASPNETTemplates related to Scraping einer Online-Film-Website

5. Ihr grundlegendes ASP.NET-Webformularprojekt ist nun erstellt

ASPNETWebFormProject related to Scraping einer Online-Film-Website

[Klicken Sie hier](/downloads/assets/tutorials/webscraping-in-c-sharp/IronWebScraperSample.zip), um das vollständige Beispielprojekt mit dem Tutorial-Code herunterzuladen.
Chaknith Bin
Software-Ingenieur
Chaknith arbeitet an IronXL und IronBarcode. Er hat tiefgehende Expertise in C# und .NET und hilft, die Software zu verbessern und Kunden zu unterstützen. Seine Erkenntnisse aus Benutzerinteraktionen tragen zu besseren Produkten, Dokumentation und einem insgesamt besseren Erlebnis bei.