Web scraping (automatyczne pobieranie danych ze stron internetowych) to technika programistyczna pozwalająca wyciągać informacje z witryn WWW za pomocą kodu. Wyobraź sobie, że potrzebujesz listy cen z witryny sklepu internetowego albo chcesz zautomatyzować zbieranie danych z wielu stron – zamiast kopiować wszystko ręcznie, możesz napisać program, który zrobi to za Ciebie. W tym artykule pokażę Ci, na czym polega web scraping w języku C# i jak zacząć go używać w praktyce. Dowiesz się, jak pobrać zawartość HTML strony, wyciągnąć z niej potrzebne informacje oraz poznasz podstawowe narzędzia przydatne przy scrapingu.
Jak zacząć web scraping w C#?
Zacznijmy od ogólnego procesu. Web scraping w C# (i w innych językach) zazwyczaj obejmuje dwa główne kroki:
1. Pobranie strony HTML – nasz program musi połączyć się z wybraną stroną i pobrać jej kod HTML (tak jak robi to przeglądarka).
2. Parsowanie i ekstrakcja danych – z pobranego HTML-a musimy wyłuskać interesujące nas fragmenty (np. teksty, linki, ceny, tabelki itp.).
Do wykonania pierwszego kroku C# oferuje wbudowane narzędzia HTTP. Najpopularniejszym jest klasa HttpClient z biblioteki .NET, która pozwala wykonywać zapytania sieciowe. Drugi krok – parsowanie HTML – ułatwia zewnętrzna biblioteka HtmlAgilityPack (dostępna przez NuGet), która umożliwia wygodne przeszukiwanie i nawigację po strukturze HTML jak po drzewie DOM.
Poniżej znajduje się prosty przykład ilustrujący oba kroki. Kod pobiera treść strony i wypisuje zawartość pierwszego nagłówka <h1> znalezionego w HTML:
using System.Net.Http;
using HtmlAgilityPack;
var url = "http://example.com";
var client = new HttpClient();
string html = await client.GetStringAsync(url);
/* Wczytaj pobrany HTML do obiektu dokumentu */
var doc = new HtmlDocument();
doc.LoadHtml(html);
/* Znajdź pierwszy element <h1> i pobierz jego tekst */
var h1Node = doc.DocumentNode.SelectSingleNode("//h1");
Console.WriteLine("Nagłówek strony: " + h1Node.InnerText);Co robi powyższy kod?
• Nawiązuje połączenie ze stroną o podanym URL i pobiera całą zawartość HTML jako tekst.
• Wczytuje pobrany HTML do obiektu HtmlDocument (z biblioteki HtmlAgilityPack), co pozwala manipulować nim jak strukturą DOM.
• Wyszukuje w dokumencie pierwsze wystąpienie znacznika <h1> (używamy do tego zapytania XPath //h1, które oznacza "dowolny element <h1> w dokumencie").
• Wypisuje tekst wewnątrz znalezionego elementu na konsolę. W naszym przykładzie będzie to tytuł strony głównej (nagłówek <h1> ze strony example.com).
Oczywiście zamiast h1 możemy szukać dowolnych elementów – np. wszystkich linków <a>, tabel <table> czy elementów o konkretnej klasie CSS. HtmlAgilityPack udostępnia zarówno XPath, jak i selektory CSS (po doinstalowaniu odpowiedniego rozszerzenia) do wygodnego wybierania elementów. Przykładowo, aby znaleźć wszystkie linki na stronie i wypisać ich adresy URL, moglibyśmy użyć doc.DocumentNode.SelectNodes("//a") i przeiterować po wynikach.
Przydatne narzędzia i wskazówki
Na koniec warto wspomnieć o kilku dodatkowych kwestiach i narzędziach związanych z web scrapingiem w C#:
• Dynamiczne strony i JavaScript: Powyższe podejście działa najlepiej dla stron statycznych, gdzie potrzebne dane są od razu w HTML. Jeśli strona generuje zawartość poprzez JavaScript (np. wymaga scrollowania lub klikania, aby załadować dane), wtedy sam HttpClient nie wystarczy – otrzymasz tylko kod HTML początkowej strony, bez wygenerowanych elementów. W takich przypadkach można sięgnąć po narzędzia automatyzujące prawdziwą przeglądarkę, jak Selenium (WebDriver dla C#) lub biblioteki headless jak Puppeteer Sharp czy Playwright. Pozwalają one uruchomić niewidocznie przeglądarkę, załadować stronę wraz z JavaScript i dopiero wtedy zebrać dane z DOM. Jest to jednak podejście bardziej zaawansowane i wolniejsze, więc stosujemy je tylko gdy jest konieczne.
• Dobre praktyki: Zawsze upewnij się, że scrapowanie danej strony jest dozwolone i etyczne. Warto sprawdzić plik robots.txt witryny lub jej regulamin – niektóre serwisy mogą zabraniać automatycznego pobierania danych. Ponadto, nie przeciążaj serwera – wysyłaj żądania z rozsądną częstotliwością (możesz dodać opóźnienia między żądaniami), tak aby nie spamować strony setkami zapytań na sekundę. Tzw. "polite scraping" zakłada, że robot (Twój skrypt) zachowuje się uprzejmie niczym normalny użytkownik: pobiera dane w umiarkowanym tempie i respektuje ewentualne ograniczenia.
• Inne biblioteki: HtmlAgilityPack jest najpopularniejszy w .NET do parsowania HTML, ale istnieją też alternatywy. Przykładowo AngleSharp to nowoczesna biblioteka do parsowania HTML ze wsparciem selektorów CSS, a wspomniany ScrapySharp rozszerza HtmlAgilityPack o wygodne funkcje. Wybór narzędzia zależy od preferencji i specyfiki projektu, jednak dla początkujących HAP będzie dobrą opcją na start.
Podsumowanie
Web scraping to świetny sposób na automatyzację zbierania informacji z internetu – od prostego wyciągania danych po budowanie własnych baz danych z publicznych źródeł. W C# możemy zrealizować scraping wykorzystując HttpClient do pobierania stron oraz biblioteki takie jak HtmlAgilityPack do analizy HTML i ekstrakcji interesujących nas fragmentów. Poznaliśmy podstawy tych kroków na prostym przykładzie. Oczywiście temat można rozwijać dalej – dodawać obsługę wielu stron (crawling), radzić sobie z logowaniem na strony czy zabezpieczeniami anty-botowymi, ale na początek taka wiedza w zupełności wystarczy, by zacząć eksperymentować.
Na koniec dodam, że jeśli interesuje Cię programowanie w C#/.NET od absolutnych podstaw i chcesz w krótkim czasie wejść na ścieżkę kariery programisty, to zachęcam do sprawdzenia mojego szkolenia online "Zostań Programistą .NET" (droga od zera do pracy jako młodszy programista C#/.NET w 3 miesiące). W ramach szkolenia uczymy się krok po kroku praktycznych umiejętności – takich jak opisywany wyżej web scraping i wiele innych – które przygotują Cię do pierwszej pracy w IT.