在我的工作生活中,C#爬虫代码咋个写以及国外代理IP哪儿找是时常会遇到的问题,通常会用 C# 编写一些代码,从网络中获取一些 HTML 内容并通过 C# 对其进行解析。那么你知道如何用 C# 解析 HTML 吗?
HTML 解析是网页抓取的重要组成部分,因为它允许将网页内容转换为有意义的结构化数据。尽管如此,由于 HTML 是一种树结构格式,它需要一个适当的解析工具,因为它不能使用 Regex 正确遍历。
如果你正在编写爬虫程序,对于某些网站,自动程序会限制爬取网站内容,通常我们会使用一些网络代理,这里有一些免费和付费的IP,也许你会感兴趣。
郑重提示:在有些国家,爬虫代码写得好,班房进得早,需要编写爬虫代码,你需要知道你面临的一些风险,另外免费国外代理IP只是适合测试,官方会不定期更新,要获得稳定的国外代理IP源,建议使用官方付费版本的即可。
C#爬虫代码国外代理IP
我们在用C#编写解析HTML的代码时,可以引入一些类库来更方便的简化我们的工作。顺便说一下,一些常见的类库是:
- HtmlAgilityPack
- AngleSharp
- CsQuery
- Fizzler
HtmlAgilityPack
HtmlAgilityPack 是 .NET 世界中最著名的 HTML 解析库之一。结果,很多文章都写了关于它的文章。简而言之,它是一个用于处理 HTML 的快速、相对方便的库(假设 XPath 查询很简单)。
如果任务是典型的并且由 XPath 表达式很好地描述,则此解析库将很方便。例如,要从一个页面获取所有链接,我们只需要很少的代码:
public IEnumerable<string> HtmlAgilityPackParse() { HtmlDocument htmlSnippet = new HtmlDocument(); htmlSnippet.LoadHtml(Html); List<string> hrefTags = new List<string>(); foreach (HtmlNode link in htmlSnippet.DocumentNode.SelectNodes("//a[@href]")) { HtmlAttribute att = link.Attributes["href"]; hrefTags.Add(att.Value); } return hrefTags; }
尽管如此,CSS 类的使用对于这个库来说并不方便,并且需要创建更复杂的表达式:
public IEnumerable<string> HtmlAgilityPackParse() { HtmlDocument hap = new HtmlDocument(); hap.LoadHtml(html); HtmlNodeCollection nodes = hap .DocumentNode .SelectNodes("//h3[contains(concat(' ', @class, ' '), ' r ')]/a"); List<string> hrefTags = new List<string>(); if (nodes != null) { foreach (HtmlNode node in nodes) { hrefTags.Add(node.GetAttributeValue("href", null)); } } return hrefTags; }
在观察到的怪事中——一个特定的 API,有时难以理解和混淆。然而,图书馆不再被遗弃的事实增加了热情,并使其成为 AngleSharp 的真正替代品。
AngleSharp
AngleSharp 是使用 C# 从头开始编写的。该 API 基于官方 JavaScript HTML DOM 规范。有些地方有一些 .NET 开发人员不常见的怪癖(例如,访问集合中的无效索引将返回 null 而不是抛出异常;有一个单独的 URL 类;名称空间非常细化),但通常没有什么关键的。
库代码干净、整洁且用户友好。例如,从页面中提取链接与 Javascript 和 Python 替代方案几乎没有什么不同:
public IEnumerable<string> AngleSharpParse() { List<string> hrefTags = new List<string>(); var parser = new HtmlParser(); var document = parser.Parse(Html); foreach (IElement element in document.QuerySelectorAll("a")) { hrefTags.Add(element.GetAttribute("href")); } return hrefTags; }
CsQuery
CsQuery 是 .NET 的 jQuery 端口。它实现了所有 CSS2 和 CSS3 选择器、jQuery 的所有 DOM 操作方法以及一些实用方法。
它是 .NET 的现代 HTML 解析器之一。该库基于 Java 的 validator.nu 解析器,而后者又是来自 Gecko (Firefox) 引擎的解析器的一个端口。
不幸的是,该项目被作者放弃。推荐的替代品是 AngleSharp。对于使用过 jQuery 的人来说,从页面获取链接的代码看起来不错且熟悉:
public IEnumerable<string> CsQueryParse() { List<string> hrefTags = new List<string>(); CQ cq = CQ.Create(Html); foreach (IDomObject obj in cq.Find("a")) { hrefTags.Add(obj.GetAttribute("href")); } return hrefTags; }
Fizzler
Fizzler 是 HtmlAgilityPack 的附加组件(Fizzler 的实现基于 HtmlAgilityPack),允许您使用 CSS 选择器。
让我们使用文档中的示例来发现 Fizzler 解决了什么问题:
// Load the document using HTMLAgilityPack as normal var html = new HtmlDocument(); html.LoadHtml(@" <html> <head></head> <body> <div> <p class='content'>Fizzler</p> <p>CSS Selector Engine</p></div> </body> </html>"); // Fizzler for HtmlAgilityPack is implemented as the // QuerySelectorAll extension method on HtmlNode var document = html.DocumentNode; // yields: [<p class="content">Fizzler</p>] document.QuerySelectorAll(".content"); // yields: [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>] document.QuerySelectorAll("p"); // yields empty sequence document.QuerySelectorAll("body>p"); // yields [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>] document.QuerySelectorAll("body p"); // yields [<p class="content">Fizzler</p>] document.QuerySelectorAll("p:first-child");
它的速度几乎与 HtmlAgilityPack 相同,但由于 CSS 选择器而更加方便。
结论
结论,可能,每个人都是为自己做出的。但是,我要补充一点,目前最好的选择是 AngleSharp,因为它正在积极开发中,具有直观的 API,并且显示出良好的处理时间。
从 HtmlAgilityPack 切换到 AngleSharp 有意义吗?可能不会——您可以使用 Fizzler 并享受快速便捷的库。
基准代码可以在这里找到。