7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Существуют различные библиотеки веб-скрейпинга на C# для извлечения данных, в том числе для таких целей, как отслеживание цен, генерация потенциальных клиентов, мониторинг настроений, агрегация финансовых данных и так далее.

Существуют разные показатели, которые следует учитывать при выборе лучшей библиотеки для парсинга, и в этой статье мы обсудим 7 лучших библиотек для парсинга на C# для использования в 2023 году. Кроме того, мы увидим примеры, которые помогут вам понять, как эти фреймворки работают.

https://t.me/csharp_ci – C# телеграм канала для разработчиков.

Давайте начинать!

Какие лучшие библиотеки для парсинга на C#?

Мы протестировали различные библиотеки для парсинга веб-страниц, и вот лучшие из них для использования в 2023 году:

  1. ZenRows.
  2. Puppeteer Sharp.
  3. Selenium.
  4. HTML Agility Pack.
  5. Scrapy Sharp.
  6. Iron web scraper.
  7. HttpClient.

Библиотеки C# сравнивались на основе основных функций, которые упрощают парсинг, таких как конфигурации прокси, динамическое содержимое, документация, обход защиты от ботов, автоматический анализ и масштабируемость инфраструктуры.

Давайте поговорим об этих библиотеках, основываясь на функциях, которые они предоставляют, и о том, как их можно использовать для извлечения данных с веб-страницы. Мы будем использовать веб-сайт ScrapeMe в качестве эталона.

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

1. ZenRows API

ZenRows API — лучшая библиотека веб-парсинга данных на C# в этом списке. Это API, который обрабатывает обход ботов от вращающихся прокси и безголовых браузеров до CAPTCHA. Кроме того, ZenRows API поддерживает автоматический анализ (т. е. преобразование HTML в JSON) для многих популярных сайтов и может извлекать динамический контент.

Единственным недостатком является то, что у ZenRows нет проприетарного ПО C# Nuget для отправки HTTP-запросов к API. Поэтому вам нужно использовать дополнительные пакеты для отправки HTTP-запросов.

Парсинг веб-страницы на C# с помощью ZenRows

Создайте бесплатную учетную запись на ZenRows, чтобы получить ключ API. Вы попадете на следующий экран:

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

После того, как вы добавите URL-адрес, который хотите сканировать, отправьте на него HTTP-запрос GET. Это сгенерирует простой HTML, который можно извлечь с помощью любого парсера HTML.

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Если вы использовали https://scrapeme.live/shopURL адрес для очистки, URL-адрес ZenRows API должен выглядеть следующим образом:

https://api.zenrows.com/v1/?apikey=API_KEY&url=https%3A%2F%2Fscrapeme.live%2Fshop

Обратите внимание, что API-ключ — это личный идентификатор, назначенный вам ZenRows, и его нельзя никому передавать.

Поскольку ZenRows не предоставляет никакого явного пакета Nuget для использования с программой C#, вам придется отправить запрос HTTP GET на URL-адрес API. ZenRows очистит целевой URL-адрес от вашего имени и вернет в ответ простой HTML-код.

Для этого создайте консольное приложение C# в Visual Studio и добавьте в функцию main() следующий код:

var url = "https://api.zenrows.com/v1/?apikey=API_KEY&url=https%3A%2F%2Fscrapeme.live%2Fshop"; 
var req = WebRequest.Create(url); 
req.Method = "GET";

Этот код создаст новый объект WebRequest с URL-адресом ZenRows API в качестве цели. Затем вы можете отправить запрос и получить ответ в объекте HttpResponse:

using var resp = req.GetResponse(); 
using var webStream = resp.GetResponseStream();

Простой HTML-ответ извлекается из объекта resp, а затем преобразуется в поток байтов для удобства чтения данных. Теперь, когда у вас есть простой HTML-код целевой страницы в потоке, вы можете использовать любой анализатор HTML для анализа нужных элементов.

Давайте использовать HTML Agility Pack для извлечения названий продуктов и цен.

Установите Agility Pack и напишите функцию ParseHtml() в классе Program, которая анализирует и выводит цены и названия продуктов.

private static void ParseHtml(Stream html) 
{ 
	var doc = new HtmlDocument(); 
	doc.Load(html); 
 
	HtmlNodeCollection names = doc.DocumentNode.SelectNodes("//a/h2"); 
	HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
 
	for (int i = 0; i < names.Count; i++) 
	{ 
		Console.WriteLine("Name: {0}, Price: {1}", names[i].InnerText, prices[i].InnerText); 
	} 
}

Функция ParseHtml() создает HtmlDocument экземпляр doc и загружает в него переданный поток байтов. Затем она использует метод SelectNodes() для анализа всех элементов с названиями продуктов и ценами.

Метод SelectNodes() извлекает элементы XPath из HTML-документа. XPath "//a/h2"выбирает все <h2> элементы, заключенные в тег <a>, которые содержат названия продуктов.

Точно так же XPath "//div/main/ul/li/a/span" ссылается на все элементы <span>, содержащие цены на товары. Цикл for выводит проанализированные элементы InnerTexts. Вызовем метод ParseHTML() из функции main() с потоком байтов webStream в качестве аргумента:

ParseHtml(webStream);

Поздравляем! 👏

Вы только что спарсили веб-страницу с помощью библиотеки веб-скрейпинга ZenRows C#… и не были заблокированы каким-либо антиботом.

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Вот как выглядит полный код:

using HtmlAgilityPack; 
using System; 
using System.IO; 
using System.Net; 
 
namespace ZenRowsDemo 
{ 
	class Program 
	{ 
		static void Main(string[] args) 
		{ 
			var url = "https://api.zenrows.com/v1/?apikey=PUT_YOUR_ZENROWS_API_KEY_HERE&url=https%3A%2F%2Fscrapeme.live%2Fshop"; 
			var request = WebRequest.Create(url); 
			request.Method = "GET"; 
			using var webResponse = request.GetResponse(); 
			using var webStream = webResponse.GetResponseStream(); 
			ParseHtml(webStream); 
		} 
 
		private static void ParseHtml(Stream html) 
		{ 
			var doc = new HtmlDocument(); 
			doc.Load(html); 
 
			HtmlNodeCollection names = doc.DocumentNode.SelectNodes("//a/h2"); 
			HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
 
			for (int i = 0; i < names.Count; i++) 
			{ 
				Console.WriteLine("Name: {0}, Price: {1}", names[i].InnerText, prices[i].InnerText); 
			} 
		} 
	} 
}

2. Puppeteer Sharp

Puppeteer Sharp — это библиотека для парсинга на C#, которая сканирует веб-страницу с помощью браузера без заголовка. Есть некоторые преимущества использования Puppeteer Sharp, в том числе возможность очистки динамических веб-страниц, поддержка автономных браузеров, а также создание PDF-файлов и снимков экрана веб-страниц.

Есть некоторые недостатки: она требует ручной интеграции прокси, она не обеспечивает защиту от ботов, и вам нужно вручную отслеживать потребности в масштабируемости вашей инфраструктуры.

Давайте посмотрим, как легко спарсить веб-страницу с помощью этой библиотеки.

Парсинг веб-страницы на C# с помощью Puppeteer Sharp

Создайте консольное приложение C# в Visual Studio (или предпочитаемой вами среде IDE), а затем установите пакет PuppeteerSharp с помощью диспетчера пакетов NuGet, как показано ниже.

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Повторите ту же процедуру для установки библиотеки AngelSharp. Это будет удобно для анализа данных, просканированных с помощью пакета PuppeteerSharp.

Как только это будет сделано, давайте продолжим и выполним парсинг веб-страниц на C#.

Первым шагом является включение необходимых файлов библиотеки в ваш файл Program.cs.

using PuppeteerSharp; 
using AngleSharp; 
using AngleSharp.Dom;

Как только это будет сделано, запустите безголовый экземпляр Chrome с помощью Puppeteer и извлеките содержимое с той же страницы, которую мы только что использовали:

using var browserFetcher = new BrowserFetcher(); 
 
await browserFetcher.DownloadAsync(BrowserFetcher.DefaultChromiumRevision); 
 
var browser = await Puppeteer.LaunchAsync(new LaunchOptions 
	{ 
		Headless = true, 
		ExecutablePath= @"C:\Program Files\Google\Chrome\Application\chrome.exe" 
	}); 
 
var page = await browser.NewPageAsync(); 
await page.GoToAsync("https://scrapeme.live/shop/"); 
 
var content = await page.GetContentAsync();

Код запускает безголовый экземпляр браузера Chrome. Для функции LaunchAsync требуется путь к каталогу установки браузера Chrome, который у вас может отличаться, поэтому обязательно укажите правильный путь.

Функция GoToAsync() перемещает браузер по указанному URL-адресу. Метод GetContentAsync() используется для извлечения необработанного HTML-контента текущей страницы.

Давайте используем AngelSharp для анализа необработанного содержимого HTML, чтобы извлечь названия продуктов и цены. Библиотека AngelSharp использует запросы LINQ, чтобы выбрать путь к элементам, которые вы хотите извлечь из необработанного содержимого.

string jsSelectAllNames = @"Array.from(document.querySelectorAll('h2')).map(a => a.innerText);"; 
 
string jsSelectAllPrices = @"Array.from(document.querySelectorAll('span[class=""price""]')).map(a => a.innerText);"; 
 
var names = await page.EvaluateExpressionAsync<string[]>(jsSelectAllNames); 
 
var prices = await page.EvaluateExpressionAsync<string[]>(jsSelectAllPrices); 
 
for (int i=0; i < names.Length; i++) 
{ 
	Console.WriteLine("Name: {0}, Price: {1}", names[i], prices[i]); 
}

Функция querySelectorAll() используется для определения пути к нужным элементам, а функция map() представляет собой метод фильтра для повторения каждого экземпляра данного массива элементов, чтобы сохранить только интертексты.

Метод EvaluateExpressionAsync() оценивает выражения для извлечения названий продуктов и цен в соответствующих массивах строк. Он оценивает выражения, затем извлекает и возвращает соответствующие результаты.

Вот и всё, мы успешно спарсили веб-страницу библиотекой Puppeteer C#:

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Вот как выглядит полный код:

using PuppeteerSharp; 
using System; 
using System.Threading.Tasks; 
using AngleSharp; 
using AngleSharp.Dom; 
using System.Linq; 
using System.Collections.Generic; 
 
namespace PuppeteerDemo 
{ 
	class Program 
	{ 
		static async Task Main(string[] args) 
		{ 
			using var browserFetcher = new BrowserFetcher(); 
			await browserFetcher.DownloadAsync(BrowserFetcher.DefaultChromiumRevision); 
			var browser = await Puppeteer.LaunchAsync(new LaunchOptions 
			{ 
				Headless = true, 
				ExecutablePath= @"C:\Program Files\Google\Chrome\Application\chrome.exe" 
			}); 
			var page = await browser.NewPageAsync(); 
			await page.GoToAsync("https://scrapeme.live/shop/"); 
 
			var content = await page.GetContentAsync(); 
 
			List<Products> products = new List<Products>(); 
 
			var jsSelectAllNames = @"Array.from(document.querySelectorAll('h2')).map(a => a.innerText);"; 
 
			var jsSelectAllPrices = @"Array.from(document.querySelectorAll('span[class=""price""]')).map(a => a.innerText);"; 
 
			var names = await page.EvaluateExpressionAsync<string[]>(jsSelectAllNames); 
			var prices = await page.EvaluateExpressionAsync<string[]>(jsSelectAllPrices); 
			for (int i=0; i < names.Length && i < prices.Length; i++) 
			{ 
				Products p = new Products(); 
				p.Name = names[i]; 
				p.Price = prices[i]; 
				products.Add(p); 
			} 
			foreach(var p in products) 
			{ 
				Console.WriteLine("Name: {0}, Price: {1}", p.Name, p.Price); 
			} 
		} 
	} 
	class Products 
	{ 
		private string name; 
		private string price; 
 
		public string Name { get => name; set => name = value; } 
		public string Price { get => price; set => price = value; } 
	} 
}

3. Веб-драйвер Selenium

Selenium — один из наиболее часто используемых инструментов для парсинга больших объемов данных, таких как фотографии, ссылки и текст. Эта библиотека идеально подходит для парсинга динамических веб-страниц благодаря своей способности обрабатывать динамический контент, созданный с помощью JavaScript.

Недостатком библиотеки парсинга Selenium C# является то, что она требует ручной интеграции прокси и механизмов защиты от ботов.

Парсинг веб-страницы на C# с помощью Selenium

Для создания поискового робота с помощью Selenium требуются два внешних пакета: Selenium Web Driver и Selenium Webdriver.ChromeDriver. Вы можете установить эти пакеты с помощью диспетчера пакетов NuGet:

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

После их установки запустите драйвер Chrome, указав его несколько параметров (например, путь к браузеру, поддержку графического процессора и т. д.).

string fullUrl = "https://scrapeme.live/shop/"; 
var options = new ChromeOptions(){ 
	BinaryLocation = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" 
}; 
 
options.AddArguments(new List<string>() { "headless", "disable-gpu" }); 
 
var browser = new ChromeDriver(options); 
browser.Navigate().GoToUrl(fullUrl);

После того, как браузер перейдет к нужному URL-адресу, извлеките элементы с помощью функции FindElements.

var names = browser.FindElements(By.TagName("h2")); 
var prices = browser.FindElements(By.CssSelector("span.price")); 
 
for (int i = 0; i < names.Count && i < prices.Count; i++) 
{ 
	Console.WriteLine("Name: {0}, Price: {1}", names[i], prices[i]); 
}

Вот и все! Вот как будет выглядеть ваш вывод:

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Если вы заблудились в строках, вот полный используемый код:

using OpenQA.Selenium.Chrome; 
using System; 
using OpenQA.Selenium; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
 
namespace SeleniumDemo { 
	class Program { 
		static void Main(string[] args) { 
			string fullUrl = "https://scrapeme.live/shop/"; 
			List<string> programmerLinks = new List<string>(); 
 
			var options = new ChromeOptions() { 
				BinaryLocation = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" 
			}; 
 
			options.AddArguments(new List<string>() { 
				"headless", 
				"disable-gpu" 
			}); 
 
			var browser = new ChromeDriver(options); 
			List<Products> products = new List<Products>(); 
			browser.Navigate().GoToUrl(fullUrl); 
 
			var names = browser.FindElements(By.TagName("h2")); 
			var prices = browser.FindElements(By.CssSelector("span.price")); 
			for (int i = 0; i < names.Count && i < prices.Count; i++) { 
				Products p = new Products(); 
				p.Name = names[i].GetAttribute("innerText"); 
				p.Price = prices[i].GetAttribute("innerText"); 
				products.Add(p); 
			} 
			foreach(var p in products) { 
				Console.WriteLine("Name: {0}, Price: {1}", p.Name, p.Price); 
			} 
		} 
	} 
	class Products { 
		string name; 
		string price; 
 
		public string Name { 
			get => name; 
			set => name = value; 
		} 
		public string Price { 
			get => price; 
			set => price = value; 
		} 
	} 
}

4. HTML Agility Pack

Библиотека HTML Agility Pack является наиболее загружаемой библиотекой парсинга C# DOM благодаря своей способности парсить веб-страницы напрямую или через браузер. Пакет HTML Agility может обрабатывать повреждённый HTML и поддерживает XPath, а также может сканировать локальные файлы HTML.

Тем не менее, эта библиотека веб-парсинга C # не поддерживает безголовый парсинг и нуждается во внешних прокси-сервисах для обхода анти-ботов.

Парсинг веб-страницы на C# с помощью HTML Agility Pack

Создайте консольное приложение C# и откройте диспетчер пакетов NuGet в меню Tools. Введите HTML Agility Pack в строку поиска на вкладке обзора, выберите соответствующую версию HtmlAgilityPack и нажмите install.

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Как только мы установим инструменты, давайте извлечем некоторые данные. Первым шагом является включение необходимых файлов библиотеки в ваш файл Program.cs:

using HtmlAgilityPack;

Затем создайте вспомогательный метод GetDocument() для загрузки HTML-кода URL-адреса и возврата содержимого HTML:

static HtmlDocument GetDocument(string url) 
{ 
	HtmlWeb web = new HtmlWeb(); 
	HtmlDocument doc = web.Load(url); 
	return doc; 
}

Вы можете использовать GetDocument() для получения содержимого HTML любой целевой страницы. Последний шаг — написать код драйвера в main(), например:

var doc = GetDocument("https://scrapeme.live/shop/"); 
 
HtmlNodeCollection names = doc.DocumentNode.SelectNodes("//a/h2"); 
HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
 
for (int i = 0; i < names.Count(); i++){ 
	Console.WriteLine("Name: {0}, Price: {1}", names[i].InnerText, prices[i].InnerText); 
} 

Функция GetDocument() извлекает HTML-содержимое заданной цели. Функция SelectNodes() использует соответствующие селекторы XPath для анализа названий и цен продуктов на целевой веб-странице. Цикл for выводит все проанализированные элементы InnerText.

Вот и всё! ScrapeMe только что был просканирован с помощью библиотеки для парсинга HTML Agility Pack на C#.

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Вот как выглядит полный код:

using HAP_Demo; 
using HtmlAgilityPack; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
 
namespace ConsoleApp2 
{ 
	class Program 
	{ 
		static void Main(string[] args) 
		{ 
			var doc = GetDocument("https://scrapeme.live/shop/"); 
 
			HtmlNodeCollection names = doc.DocumentNode.SelectNodes("//a/h2"); 
			HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
			List<Products> products = new List<Products>(); 
 
			for (int i = 0; i < names.Count && i < prices.Count; i++) 
			{ 
				Products p = new Products(); 
				p.Name= names[i].InnerText; 
				p.Price = prices[i].InnerText; 
				products.Add(p); 
			} 
			foreach (var p in products) 
			{ 
				Console.WriteLine("Name: {0} , Price: {1}", p.Name, p.Price); 
			} 
		} 
		static HtmlDocument GetDocument(string url) 
		{ 
			HtmlWeb web = new HtmlWeb(); 
			HtmlDocument doc = web.Load(url); 
			return doc; 
		} 
	} 
 
	class Products 
	{ 
		private string name; 
		private string price; 
 
		public string Name { get => name; set => name = value; } 
		public string Price { get => price; set => price = value; } 
	} 
}

5. Scrapy Sharp

Scrapy Sharp — это библиотека веб-парсинга на C# с открытым исходным кодом, которая объединяет расширение HTMLAgilityPack с веб-клиентом, который может эмулировать веб-браузер, например jQuery.

Это значительно сокращает работу по настройке, часто связанную с очисткой веб-страницы, а его сочетание с HTMLAgilitypack позволяет легко получить доступ к полученному содержимому HTML. Scrapy Sharp может имитировать веб-браузер, поэтому он может обрабатывать файлы cookie, перенаправления и другие операции высокого уровня.

Недостатком использования библиотеки парсинга Scrapy Sharp C# является то, что для нее требуются прокси-серверы и антиботы, а также она не поддерживает автоматический анализ просканированного контента.

Парсинг веб-страницы на C# с помощью Scrapy Sharp

Создайте проект консольного приложения C# и установите последний пакет ScrapySharp с помощью диспетчера пакетов NuGet. Откройте файл Program.cs из консольного приложения и включите следующие необходимые библиотеки:

using HtmlAgilityPack; 
using ScrapySharp.Network; 
using System; 
using System.Linq;

Далее создайте объект staticScrapingBrowser в классе Program. Вы можете использовать функциональные возможности этого объекта, например mybrowser, для навигации по целевым URL-адресам и их парсинга.

static ScrapingBrowser mybrowser = new ScrapingBrowser();

Создайте вспомогательный метод для извлечения и возврата HTML-содержимого заданного целевого URL-адреса.

static HtmlNode GetHtml(string url) 
{ 
	WebPage webpage = mybrowser.NavigateToPage(new Uri(url)); 
	return webpage.Html; 
}

Вспомогательный метод GetHtml принимает целевой URL-адрес в качестве параметра и отправляет его методу NavigateToPage() объекта mybrowser, возвращая HTML-код веб-страницы.

Давайте создадим ещё один вспомогательный метод для извлечения и вывода названий продуктов и цен:

static void ScrapeNamesAndPrices(string url) 
{ 
	var html = GetHtml(url); 
 
	var nameNodes = html.OwnerDocument.DocumentNode.SelectNodes("//a/h2"); 
	var priceNodes = html.OwnerDocument.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
 
	foreach (var (n, p) in nameNodes.Zip(priceNodes)) 
	{ 
		Console.WriteLine("Name: {0} , Price: {1}", n.InnerText, p.InnerText); 
	} 
}

Этот фрагмент использует метод GetHtml() для получения HTML-кода URL-адреса и анализирует его с помощью функции SelectNodes(). Функция SelectNodes() использует XPath названий и цен продуктов и возвращает все элементы с одним и тем же XPath.

Цикл foreach получает значения InnerText для каждого элемента в коллекциях nameNode и priceNode и выводит их на консоль. В качестве последнего штриха добавьте код драйвера, чтобы привести всё в порядок.

static void Main(string[] args) 
{ 
	ScrapeNamesAndPrices("https://scrapeme.live/shop/"); 
}

И вот оно:

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Вот как выглядит окончательный код:

using HtmlAgilityPack; 
using ScrapySharp.Network; 
using System; 
using System.Linq; 
namespace ScrapyDemo 
{ 
	class Program 
	{ 
		static ScrapingBrowser mybrowser = new ScrapingBrowser(); 
		static void Main(string[] args) 
		{ 
			ScrapeNamesAndPrices("https://scrapeme.live/shop/"); 
		} 
		static HtmlNode GetHtml(string url) 
		{ 
			WebPage webpage = mybrowser.NavigateToPage(new Uri(url)); 
			return webpage.Html; 
		} 
		static void ScrapeNamesAndPrices(string url) 
		{ 
			var html = GetHtml(url); 
			var nameNodes = html.OwnerDocument.DocumentNode.SelectNodes("//a/h2"); 
			var priceNodes = html.OwnerDocument.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
 
			foreach (var (n, p) in nameNodes.Zip(priceNodes)) 
			{ 
				Console.WriteLine("Name: {0} , Price: {1}", n.InnerText, p.InnerText); 
			} 
		} 
	} 
}

6. Iron Web Scraper

IronWebscraper — это библиотека веб-скрейпинга .Net Core C#, исользуемая для извлечения и анализа данных из интернет-источников. Она способна контролировать разрешенные и запрещенные объекты, сайты, медиа и другие элементы.

Другие функции включают её способность управлять многочисленными удостоверениями и веб-кэшем. Основным недостатком использования этой библиотеки-парсера C# является:

  • Она не поддерживает сканирование динамического контента.
  • Требуется ручная интеграция прокси.

Парсинг веб-страницы на C# с помощью Iron Web Scraper

Настройка среды разработки для этой библиотеки -парсера C# довольно проста. Просто установите пакет IronWebScraper в консольный проект C#, и всё готово!

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Класс WebScraper в IronWebScraper имеет два абстрактных метода: Init и Parse. Метод Init инициализирует веб-запрос и получает ответ. Затем этот ответ передается функции Parse для извлечения необходимых элементов из содержимого HTML.

Чтобы создать свой веб-парсер Iron, вы должны наследовать класс WebScraper и переопределить эти два абстрактных метода. Если у вас есть основной класс парсера IronScraperDemo в файле Program.cs, реализуйте класс WebScraper следующим образом:

class IronScraperDemo : WebScraper 
{ 
	public override void Init() 
	{ 
		License.LicenseKey = "ENTER YOUR LICENSE KEY HERE"; 
		this.LoggingLevel = WebScraper.LogLevel.All; 
		this.Request("https://scrapeme.live/shop/", Parse); 
	} 
 
	public override void Parse(Response response) 
	{ 
		var names = response.Css("h2"); 
		var prices = response.Css("span.price"); 
		for(int i=0; i<names.Length;i++) 
		{ 
			Console.WriteLine("Name: {0}, Price: {1}", names[i].InnerText, prices[i].InnerText); 
		} 
	} 
}

Метод Init требует, чтобы вы добавили лицензионный ключ, который вы можете получить, создав учетную запись на их веб-сайте. Функция Init далее вызывает метод Parse для полученного ответа после запроса целевого URL.

В нашем случае метод Parse использует селекторы CSS для извлечения названий продуктов и цен из ответа и их вывода на консоль вывода.

Поздравляем! Ваш Iron Web Scraper готов к работе. Просто добавьте следующий код драйвера, чтобы создать объект вашего парсера и вызвать его метод Start().

static void Main(string[] args) 
{ 
	IronScraperDemo ironScraper = new IronScraperDemo(); 
	ironScraper.Start(); 
}

Используя Iron Web Scraper для парсинга целевой веб-страницы, ваш результат должен выглядеть следующим образом:

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Вот полный код для этого примера:

using IronWebScraper; 
using System; 
using System.Collections.Generic; 
 
namespace IronScrapDemo 
{ 
	class IronScraperDemo : WebScraper 
	{ 
		List<Products> products = new List<Products>(); 
		static void Main(string[] args) 
		{ 
			IronScraperDemo ironScraper = new IronScraperDemo(); 
			ironScraper.Start(); 
		} 
		public override void Init() 
		{ 
			License.LicenseKey = "ENTER YOUR LICENSE KEY HERE"; 
			this.LoggingLevel = WebScraper.LogLevel.All; // All Events Are Logged 
			this.Request("https://scrapeme.live/shop/", Parse); 
		} 
 
		public override void Parse(Response response) 
		{ 
			var names = response.Css("h2"); 
			var prices = response.Css("span.price"); 
			for (int i=0; i < names.Length; i++) 
			{ 
				Products p = new Products(); 
				p.Name = names[i].InnerText; 
				p.Price = prices[i].InnerText; 
				products.Add(p); 
			} 
			foreach(var p in products) 
			{ 
				Console.WriteLine("Name: {0}, Price: {1}", p.Name, p.Price); 
			} 
		} 
	} 
	class Products 
	{ 
		public String Name 
		{ 
			get; 
			set; 
		} 
		public String Price 
		{ 
			get; 
			set; 
		} 
	} 
}

Примечание: вам всё ещё необходимо настроить среду разработки в соответствии с инструкциями в этом разделе.

7. HttpClient

HttpClient — это библиотека парсинга HTML на C#, которая предоставляет асинхронные функции для извлечения только необработанного содержимого HTML из целевого URL-адреса. Однако для извлечения нужных данных вам по-прежнему необходимо использовать инструмент синтаксического анализа HTML.

Парсинг веб-страницы на C# с помощью HttpClient

HttpClient — это примитивный класс .NET, не требующий никакой внешней сборки, но вам необходимо установить HTML Agility Pack в качестве внешней зависимости через диспетчер пакетов.

Для начала включите следующие сборки в файл «Program.cs» консольного приложения C#:

using System; 
using System.Threading.Tasks; 
using System.Net.Http; 
using HtmlAgilityPack;

Класс System.Threading.Tasks помогает обрабатывать асинхронные функции. Импорт System.Net.Http необходим для создания HTTP-запросов, а элемент HtmlAgilityPack используется для анализа полученного содержимого HTML.

Добавьте метод GetHtmlContent() в класс Program, например:

private static Task<string> GetHtmlContent() 
{ 
	var hclient = new HttpClient(); 
	return hclient.GetStringAsync("https://scrapeme.live/shop"); 
}

Вы можете передать этот строковый ответ методу ParseHtml() для извлечения и отображения нужных данных.

 private static void ParseHtml(string html) 
{ 
	var doc = new HtmlDocument(); 
	doc.LoadHtml(html); 
 
	HtmlNodeCollection names = doc.DocumentNode.SelectNodes("//a/h2"); 
 
	HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
 
	for (int i = 0; i < names.Count; i++){ 
		Console.WriteLine("Name: {0}, Price: {1}", names[i].InnerText, prices[i].InnerText); 
	} 
}

Вышеприведенный код ParseHTML принимает строку HTML в качестве входных данных, затем анализирует ее с помощью метода SelectNodes() и отображает имена и цены на выходной консоли. Здесь функция SelectNodes() играет ключевую роль. Она извлекает только соответствующие элементы из строки HTML в соответствии с заданными селекторами XPath.

Чтобы завершить это, давайте посмотрим на код драйвера, чтобы выполнить всё по порядку:

static async Task Main(string[] args) 
{ 
	var html = await GetHtmlContent(); 
	ParseHtml(html); 
}

Обратите внимание, что функция Main() теперь является методом async. Причина в том, что каждый вызов awaitable может быть заключен только в метод async; таким образом, функция Main() должна быть асинхронной.

Как и в случае с другими библиотеками веб-парсинга на C#, обсуждаемыми в этой статье, ваш результат будет таким:

7 лучших библиотек C# для парсинга веб-страниц в 2023 году

Вот как выглядят все фрагменты кода, объединенные вместе:

using System; 
using System.Threading.Tasks; 
using System.Collections.Generic; 
using System.Net.Http; 
using System.Threading.Tasks; 
using HtmlAgilityPack; 
namespace ConsoleApp1 
{ 
	class Program 
	{ 
		static async Task Main(string[] args) 
		{ 
			var html = await GetHtmlContent(); 
			List<Products> products = ParseHtml(html); 
			foreach (var p in products) 
			{ 
				Console.WriteLine("Name: {0} , Price: {1}", p.Name, p.Price); 
			} 
		} 
 
		private static Task<string> GetHtmlContent() 
		{ 
			var hclient = new HttpClient(); 
			return hclient.GetStringAsync("https://scrapeme.live/shop"); 
		} 
 
		private static List<Products> ParseHtml(string html) 
		{ 
			var doc = new HtmlDocument(); 
			doc.LoadHtml(html); 
 
			HtmlNodeCollection names = doc.DocumentNode.SelectNodes("//a/h2"); 
			HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//div/main/ul/li/a/span"); 
 
			List<Products> products = new List<Products>(); 
 
			for (int i = 0; i < names.Count && i < prices.Count; i++) 
			{ 
				Products p = new Products(); 
				p.Name = names[i].InnerText; 
				p.Price = prices[i].InnerText; 
				products.Add(p); 
			} 
 
			return products; 
		} 
	} 
	class Products 
	{ 
		public String Name 
		{ 
			get; 
			set; 
		} 
		public String Price 
		{ 
			get; 
			set; 
		} 
	} 
}

Заключение

Существуют разные библиотеки, способные извлекать данные с веб-страниц, но мы провели тщательное тестирование и представили 7 лучших библиотек веб-скрейпинга на C# для использования в 2023 году. Как видно, это:

  1. ZenRows.
  2. Puppeteer Sharp.
  3. Selenium.
  4. HTML Agility Pack.
  5. Scrapy Sharp
  6. Iron Web Scraper.
  7. HttpClient.

Распространённой проблемой парсеров является их неспособность просканировать веб-страницу без запуска анти-ботов. ZenRows решает эту проблему парсинга, обрабатывая за вас все средства обхода защиты от ботов, избавляя вас от связанных с этим головных болей. Вы можете бесплатно протестировать ZenRows, чтобы увидеть, на что он способен.

Частые вопросы

Какая лучшая библиотека для парсинга на C#?

ZenRows API — лучший вариант для парсинга веб-страниц на C#. В отличие от других библиотек веб-скрейпинга на C#, она не требует ручной интеграции прокси-серверов или настройки логики защиты от ботов. Кроме того, она поддерживает парсинг динамического контента с помощью функций AutoParse.

HTML Agility Pack — самая популярная библиотека, которую скачали около 83 миллионов раз. Основной причиной её популярности является парсер HTML, который может загружать веб-страницы напрямую или через браузер.

Что такое хорошая библиотека веб-парсинга на C#?

Хорошая библиотека парсинга предоставляет эффективные механизмы для парсинга, избегая каких-либо блокировок (включая анти-боты/капчи) и не раскрывая ваш IP. Кроме того, она должна поддерживать парсинг динамического контента и должна иметь исчерпывающую документацию и активную поддержку сообщества. Учитывая эти показатели, ZenRows, Puppeteer Sharp и Selenium являются хорошими вариантами для парсинга веб-страниц с помощью C#.

Какие библиотеки используются для парсинга веб-страниц в C#?

Существуют разные библиотеки, используемые для парсинга веб-страниц с помощью C#. Лучшие из них:

  1. ZenRows Web Scraper API.
  2. Puppeteer Sharp.
  3. Selenium Web Driver.
  4. HTML Agility Pack.
  5. Scrapy Sharp.
  6. Iron Web Scraper.
  7. HttpClient.

+1
0
+1
3
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *