7 лучших библиотек C# для парсинга веб-страниц в 2023 году
Существуют различные библиотеки веб-скрейпинга на C# для извлечения данных, в том числе для таких целей, как отслеживание цен, генерация потенциальных клиентов, мониторинг настроений, агрегация финансовых данных и так далее.
Существуют разные показатели, которые следует учитывать при выборе лучшей библиотеки для парсинга, и в этой статье мы обсудим 7 лучших библиотек для парсинга на C# для использования в 2023 году. Кроме того, мы увидим примеры, которые помогут вам понять, как эти фреймворки работают.
https://t.me/csharp_ci – C# телеграм канала для разработчиков.
Давайте начинать!
Какие лучшие библиотеки для парсинга на C#?
Мы протестировали различные библиотеки для парсинга веб-страниц, и вот лучшие из них для использования в 2023 году:
- ZenRows.
- Puppeteer Sharp.
- Selenium.
- HTML Agility Pack.
- Scrapy Sharp.
- Iron web scraper.
- HttpClient.
Библиотеки C# сравнивались на основе основных функций, которые упрощают парсинг, таких как конфигурации прокси, динамическое содержимое, документация, обход защиты от ботов, автоматический анализ и масштабируемость инфраструктуры.
Давайте поговорим об этих библиотеках, основываясь на функциях, которые они предоставляют, и о том, как их можно использовать для извлечения данных с веб-страницы. Мы будем использовать веб-сайт ScrapeMe в качестве эталона.
1. ZenRows API
ZenRows API — лучшая библиотека веб-парсинга данных на C# в этом списке. Это API, который обрабатывает обход ботов от вращающихся прокси и безголовых браузеров до CAPTCHA. Кроме того, ZenRows API поддерживает автоматический анализ (т. е. преобразование HTML в JSON) для многих популярных сайтов и может извлекать динамический контент.
Единственным недостатком является то, что у ZenRows нет проприетарного ПО C# Nuget для отправки HTTP-запросов к API. Поэтому вам нужно использовать дополнительные пакеты для отправки HTTP-запросов.
Парсинг веб-страницы на C# с помощью ZenRows
Создайте бесплатную учетную запись на ZenRows, чтобы получить ключ API. Вы попадете на следующий экран:
После того, как вы добавите URL-адрес, который хотите сканировать, отправьте на него HTTP-запрос GET. Это сгенерирует простой HTML, который можно извлечь с помощью любого парсера HTML.
Если вы использовали https://scrapeme.live/shop
URL адрес для очистки, 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#… и не были заблокированы каким-либо антиботом.
Вот как выглядит полный код:
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, как показано ниже.
Повторите ту же процедуру для установки библиотеки 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#:
Вот как выглядит полный код:
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:
После их установки запустите драйвер 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]);
}
Вот и все! Вот как будет выглядеть ваш вывод:
Если вы заблудились в строках, вот полный используемый код:
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.
Как только мы установим инструменты, давайте извлечем некоторые данные. Первым шагом является включение необходимых файлов библиотеки в ваш файл 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#.
Вот как выглядит полный код:
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/");
}
И вот оно:
Вот как выглядит окончательный код:
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#, и всё готово!
Класс 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 для парсинга целевой веб-страницы, ваш результат должен выглядеть следующим образом:
Вот полный код для этого примера:
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#, обсуждаемыми в этой статье, ваш результат будет таким:
Вот как выглядят все фрагменты кода, объединенные вместе:
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 году. Как видно, это:
- ZenRows.
- Puppeteer Sharp.
- Selenium.
- HTML Agility Pack.
- Scrapy Sharp
- Iron Web Scraper.
- HttpClient.
Распространённой проблемой парсеров является их неспособность просканировать веб-страницу без запуска анти-ботов. ZenRows решает эту проблему парсинга, обрабатывая за вас все средства обхода защиты от ботов, избавляя вас от связанных с этим головных болей. Вы можете бесплатно протестировать ZenRows, чтобы увидеть, на что он способен.
Частые вопросы
Какая лучшая библиотека для парсинга на C#?
ZenRows API — лучший вариант для парсинга веб-страниц на C#. В отличие от других библиотек веб-скрейпинга на C#, она не требует ручной интеграции прокси-серверов или настройки логики защиты от ботов. Кроме того, она поддерживает парсинг динамического контента с помощью функций AutoParse.
Какая самая популярная библиотека C# для парсинга веб-страниц?
HTML Agility Pack — самая популярная библиотека, которую скачали около 83 миллионов раз. Основной причиной её популярности является парсер HTML, который может загружать веб-страницы напрямую или через браузер.
Что такое хорошая библиотека веб-парсинга на C#?
Хорошая библиотека парсинга предоставляет эффективные механизмы для парсинга, избегая каких-либо блокировок (включая анти-боты/капчи) и не раскрывая ваш IP. Кроме того, она должна поддерживать парсинг динамического контента и должна иметь исчерпывающую документацию и активную поддержку сообщества. Учитывая эти показатели, ZenRows, Puppeteer Sharp и Selenium являются хорошими вариантами для парсинга веб-страниц с помощью C#.
Какие библиотеки используются для парсинга веб-страниц в C#?
Существуют разные библиотеки, используемые для парсинга веб-страниц с помощью C#. Лучшие из них:
- ZenRows Web Scraper API.
- Puppeteer Sharp.
- Selenium Web Driver.
- HTML Agility Pack.
- Scrapy Sharp.
- Iron Web Scraper.
- HttpClient.