站点图标 江湖人士

2024 C#爬虫代码搭配国外代理IP想爬啥就爬啥

C#爬虫代码咋个写以及国外代理IP哪儿找

C#爬虫代码咋个写以及国外代理IP哪儿找

在我的工作生活中,C#爬虫代码咋个写以及国外代理IP哪儿找是时常会遇到的问题,通常会用 C# 编写一些代码,从网络中获取一些 HTML 内容并通过 C# 对其进行解析。那么你知道如何用 C# 解析 HTML 吗?

HTML 解析是网页抓取的重要组成部分,因为它允许将网页内容转换为有意义的结构化数据。尽管如此,由于 HTML 是一种树结构格式,它需要一个适当的解析工具,因为它不能使用 Regex 正确遍历。

如果你正在编写爬虫程序,对于某些网站,自动程序会限制爬取网站内容,通常我们会使用一些网络代理,这里有一些免费和付费的IP,也许你会感兴趣。


郑重提示:在有些国家,爬虫代码写得好,班房进得早,需要编写爬虫代码,你需要知道你面临的一些风险,另外免费国外代理IP只是适合测试,官方会不定期更新,要获得稳定的国外代理IP源,建议使用官方付费版本的即可。

C#爬虫代码国外代理IP

我们在用C#编写解析HTML的代码时,可以引入一些类库来更方便的简化我们的工作。顺便说一下,一些常见的类库是:

  1. HtmlAgilityPack
  2. AngleSharp
  3. CsQuery
  4. Fizzler

HtmlAgilityPack

HtmlAgilityPack 是 .NET 世界中最著名的 HTML 解析库之一。结果,很多文章都写了关于它的文章。简而言之,它是一个用于处理 HTML 的快速、相对方便的库(假设 XPath 查询很简单)。

MIT License.

如果任务是典型的并且由 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 类;名称空间非常细化),但通常没有什么关键的。

MIT License.

库代码干净、整洁且用户友好。例如,从页面中提取链接与 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) 引擎的解析器的一个端口。

MIT license

不幸的是,该项目被作者放弃。推荐的替代品是 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 选择器。

GNU GPL license.

让我们使用文档中的示例来发现 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 并享受快速便捷的库。

基准代码可以在这里找到。

https://github.com/kami4ka/dot-net-html-parsers-benchmark

退出移动版