Skrobanie sieci przy użyciu języka C#

Web Scraping to technika używana do wydobywania danych ze stron internetowych. Pomaga zautomatyzować proces wydobywania danych ze stron internetowych i plików HTML. Jako programista C# możemy łatwo sprawdzać, przechwytywać i wyodrębniać dane, takie jak obrazy, wideo, audio itp., ze stron internetowych. W tym artykule dowiemy się, jak wykonać skrobanie stron internetowych za pomocą analizowania HTML przy użyciu języka C#.

W tym artykule zostaną omówione następujące tematy:

Interfejs API do skrobania sieci w języku C#

Do skrobania stron internetowych z plików HTML lub adresów URL będziemy używać interfejsu API Aspose.HTML for .NET. Jest to zaawansowany interfejs API do przetwarzania HTML, który pozwala generować, modyfikować, wyodrębniać dane, konwertować i renderować dokumenty HTML bez zewnętrznego oprogramowania. Proszę pobierz bibliotekę DLL interfejsu API lub zainstaluj ją przy użyciu NuGet.

PM> Install-Package Aspose.Html

Czytaj i wyodrębniaj HTML za pomocą C#

Możemy czytać i wyodrębniać kod HTML z dowolnego dokumentu HTML, wykonując czynności podane poniżej:

  1. Załaduj dokument HTML przy użyciu klasy HTMLDocument.
  2. Wyświetl wewnętrzny kod HTML pliku w konsoli.

Poniższy przykładowy kod pokazuje, jak czytać i wyodrębniać zawartość HTML przy użyciu języka C#.

// Ten przykład kodu demonstruje, jak wyświetlić zawartość dokumentu HTML
// Załaduj dokument HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");

// Pokaż wewnętrzny kod HTML dokumentu
Console.WriteLine(document.Body.InnerHTML);
Czytaj i wyodrębniaj kod HTML przy użyciu języka C#.

Czytaj i wyodrębniaj kod HTML przy użyciu języka C#.

Podobnie możemy czytać i wyodrębniać kod HTML z działających witryn internetowych, jak pokazano poniżej:

// Ten przykład kodu demonstruje, jak wyświetlić zawartość aktywnego adresu URL witryny.
// Zainicjuj adres URL
Url url = new Url("https://en.wikipedia.org/wiki/HTML");

// Załaduj plik HTML przy użyciu instancji Url
HTMLDocument document = new HTMLDocument(url);

// Pokaż wewnętrzny kod HTML pliku w konsoli
Console.WriteLine(document.Body.InnerHTML);

Sprawdź elementy dokumentu za pomocą języka C#

Możemy sprawdzić dokument i jego elementy, wykonując poniższe czynności:

  1. Załaduj dokument HTML przy użyciu klasy HTMLDocument.
  2. Pobierz element HTML dokumentu.
  3. Pobierz pierwsze/ostatnie elementy elementu HTML.
  4. Wyświetl szczegóły elementu, takie jak TagName, TextContent.

Poniższy przykładowy kod pokazuje, jak sprawdzić elementy dokumentu przy użyciu języka C#.

// Ten przykład kodu demonstruje, jak sprawdzać elementy HTML.
// Załaduj dokument z pliku
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);

// Pobierz element HTML dokumentu
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML

// Pobierz ostatni element elementu HTML
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY

// Zdobądź pierwszy element elementu body
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1

Znajdź konkretny element za pomocą filtrów w C#

Możemy użyć niestandardowych filtrów, aby znaleźć konkretny element, np. pobrać wszystkie obrazy, linki itp. W tym celu API udostępnia interfejs TreeWalker. Umożliwia nawigację po drzewie lub poddrzewie dokumentu przy użyciu widoku dokumentu zdefiniowanego przez jego flagi whatToShow i filtr (jeśli istnieje). Konkretne elementy możemy znaleźć za pomocą filtrów, wykonując poniższe czynności:

  1. Zdefiniuj filtry przy użyciu klasy NodeFilter i zastąp metodę AcceptNode().
  2. Załaduj dokument HTML przy użyciu klasy HTMLDocument.
  3. Wywołaj metodę CreateTreeWalker(). Jako argumenty pobiera węzeł główny, co pokazać i NodeFilter.

Poniższy przykładowy kod pokazuje, jak znaleźć określone elementy przy użyciu języka C#.

// Ten przykład kodu demonstruje, jak wykonywać zapytania dotyczące danych przy użyciu filtrów.
// Załaduj dokument HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Aby rozpocząć nawigację HTML, musimy utworzyć instancję TreeWalker.
// Podane parametry oznaczają, że zaczyna chodzić od katalogu głównego dokumentu,
// iterując wszystkie węzły i korzystając z naszej niestandardowej implementacji filtra
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
    while (iterator.NextNode() != null)
    {
        // Ponieważ używamy własnego filtra, bieżący węzeł będzie zawsze instancją elementu HTMLImageElement.
        // Zatem nie potrzebujemy tutaj dodatkowych walidacji.
        var image = (HTMLImageElement)iterator.CurrentNode;

        System.Console.WriteLine(image.Src);
        // dane wyjściowe: image1.png
        // dane wyjściowe: image2.png
    }
}
// Ten przykład kodu demonstruje, jak zdefiniować filtr węzła.
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // Bieżący filtr pomija wszystkie elementy z wyjątkiem elementów IMG.
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

Zapytanie o dane z HTML przy użyciu C#

Możemy również użyć zapytania XPath do wysyłania zapytań o dane z dokumentu HTML, wykonując poniższe czynności:

  1. Załaduj dokument HTML przy użyciu klasy HTMLDocument.
  2. Wywołaj metodę Evaluate(). Jako argumenty przyjmuje ciąg wyrażenia XPath, dokument i typ.
  3. Na koniec przejrzyj powstałe węzły i wyświetl tekst

Poniższy przykładowy kod pokazuje, jak wykonywać zapytania dotyczące danych za pomocą zapytań XPath przy użyciu języka C#.

// Ten przykład kodu demonstruje, jak wykonywać zapytania dotyczące danych przy użyciu zapytania XPath.
// Przygotuj kod HTML
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// Zainicjuj dokument na podstawie przygotowanego kodu
HTMLDocument document = new HTMLDocument(code, ".");

// Tutaj oceniamy wyrażenie XPath, w którym wybieramy wszystkie podrzędne elementy SPAN 
// z elementów, których atrybut „class" jest równy „happy":
var result = document.Evaluate("//*[@class='happy']//span",
    document,
    null,
    Aspose.Html.Dom.XPath.XPathResultType.Any,
    null);

// Wykonaj iterację po powstałych węzłach
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
    System.Console.WriteLine(node.TextContent);
    // wyjście: Witam
    // wyjście: Świat!
}

Wyodrębnij za pomocą selektora CSS w C#

Możemy wyodrębnić treść HTML również za pomocą selektorów CSS. W tym celu API udostępnia metodę QuerySelectorAll(), która umożliwia nawigację po dokumencie HTML i wyszukiwanie potrzebnych elementów. Przyjmuje selektor zapytania jako parametr i zwraca pasującą listę węzłów wszystkich elementów. Możemy wysyłać zapytania za pomocą selektorów CSS, wykonując poniższe kroki:

  1. Załaduj dokument HTML przy użyciu klasy HTMLDocument.
  2. Wywołaj metodę QuerySelectorAll(). Jako argument przyjmuje selektor zapytania.
  3. Na koniec przejrzyj wynikową listę elementów.

Poniższy przykładowy kod pokazuje, jak wyodrębnić zawartość HTML przy użyciu selektorów CSS w języku C#.

// Zainicjuj dokument na podstawie przygotowanego kodu
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Tutaj tworzymy selektor CSS, który wyodrębnia wszystkie elementy div
var elements = document.QuerySelectorAll("div");

// Wykonaj iterację po wynikowej liście elementów
foreach (Aspose.Html.HTMLElement element in elements)
{
    System.Console.WriteLine(element.InnerHTML);
}

Zdobądź bezpłatną licencję

Wypróbuj interfejs API bez ograniczeń ewaluacyjnych, prosząc o bezpłatną licencję tymczasową.

Wniosek

W tym artykule dowiedzieliśmy się, jak:

  • czytać i wyodrębniać zawartość dokumentu HTML przy użyciu C#;
  • sprawdź elementy dokumentu i znajdź konkretny element z HTML;
  • dane specyficzne dla zapytania i wyodrębnij dane za pomocą selektora CSS.

Poza tym możesz dowiedzieć się więcej o Aspose.HTML for .NET API, korzystając z dokumentacji. W przypadku jakichkolwiek niejasności prosimy o kontakt na forum.

Zobacz też