返回博客
指南
Sorin-Gabriel MaricaLast updated on Mar 31, 20261 min read

只需几分钟,用 C# 制作网页抓取工具!

只需几分钟,用 C# 制作网页抓取工具!

自古以来,信息收集的重要性便已为人所知,而善于利用信息的人往往能获得成功。

如今,借助数据抓取工具,我们可以更轻松、更快速地完成这些工作,而且自己开发一个抓取工具也并不难。更快地获取潜在客户、同时关注竞争对手和自身品牌动态、并在投资新点子前进行深入调研——这一切都触手可及。

至此,您或许已经有所领悟。

若您想深入了解网页抓取技术,或想学习如何用 C# 构建专属工具,请务必继续阅读!

网络爬虫是否合法?

只要您想抓取的网站允许,这便是合法的。您可以通过在网址后添加“/robots.txt”(例如 http://httpbin.org/robots.txt)并查看权限说明,或者查阅其服务条款(TOS)来确认这一点。

什么是 C# 网页抓取?

网络爬虫是一种自动化技术,各类规模的企业都会使用它来提取数据以满足各种需求,例如价格优化或收集电子邮件。研究人员利用网络爬虫收集数据报告和统计信息,而开发人员则通过它获取大量用于机器学习的数据。 

它是如何运作的?对于大多数网络爬虫工具而言,您只需指定需要提取数据的网站 URL 即可。根据爬虫工具的能力,它会以结构化的方式提取该网页的信息,供您按需进行解析和处理。 

需要注意的是,部分抓取工具仅通过解析页面的HTML内容来获取动态网页的信息。在这种情况下,需要更复杂的网络爬虫工具才能完成任务。

使用网页抓取工具非常实用,因为它能大幅缩短您通常用于此任务的时间。手动复制粘贴数据,反复操作绝非乐事。试想一下,要获取海量数据来训练人工智能,需要花费多少时间!如果您想进一步了解数据提取用途,不妨点击查看!  

让我们看看如何在短短几分钟内创建我们的网页抓取工具。

使用 C# 创建自己的网页爬虫

在本教程中,我将向您展示如何用 C# 编写网页抓取工具。我知道使用 Python 等其他编程语言可能更适合这项任务,但这并不意味着无法用 C# 实现。 

使用 C# 编程具有以下优势:

  • 它是面向对象的;
  • 具有更好的完整性和互操作性;
  • 支持跨平台;

1. 选择要抓取的页面

首先,你需要确定要抓取哪个网页。在本例中,我将抓取维基百科上的“希腊”条目,并查看其目录中包含哪些主题。这是一个简单的示例,但你也可以将其扩展到其他网页。

2. 检查网站代码

使用开发者工具,您可以检查每个元素,以确认所需信息位于哪个标签下。只需在网页上右键点击并选择“检查”,就会弹出“浏览器检查器”窗口。

你可以在“元素”面板中直接搜索类名,或者像下图所示那样使用网页上的检查工具。

由此,你发现所需数据位于具有 toctext 类的 span 标签内。接下来,你需要提取该页面的全部 HTML 代码,进行解析,并仅筛选出该特定类中的数据。让我们先做些快速准备工作!

3. 准备工作区

您可以使用任何您觉得顺手的 IDE。在本示例中,我将使用 Visual Studio Code。您还需要安装 .NET SDK

现在需要创建项目。为此,你需要打开 Visual Studio Code。接着,进入扩展菜单并安装 C# for Visual Studio Code。

我们需要一个编写和运行代码的场所。在菜单栏中,选择“文件 > 打开文件”(macOS 系统为“文件 > 打开…”),并在弹出的对话框中创建一个文件夹作为我们的工作区。

创建工作区后,您可以在项目终端中输入以下命令,生成一个简单的“Hello World”应用程序模板:

dotnet new console

您的新项目应如下所示:

接下来,你需要安装以下两个包:

  • HtmlAgilityPack 是一个用 C# 编写的 HTML 解析器,用于读写 DOM。
  • CsvHelper 是一个用于读写 CSV 文件的包。

您可以在项目终端中使用以下命令行安装它们:

dotnet add package csvhelper
dotnet add package htmlagilitypack

4. 编写代码

让我们导入刚才安装的包,以及一些后续会用到的其他有用包:

using CsvHelper;
using HtmlAgilityPack;
using System.IO;
using System.Collections.Generic;
using System.Globalization;

Main 函数外部,您需要创建一个用于存储目录标题的公共类。

public class Row
{
    public string Title {get; set;}
}

现在,回到 Main 函数,你需要加载想要抓取的页面。正如我之前提到的,我们将查看维基百科上关于希腊的内容!

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("https://en.wikipedia.org/wiki/Greece");

下一步是解析并筛选出包含目标信息的节点,这些信息位于类名为 toctext 的 span 标签内。

varHeaderNames = doc.DocumentNode.SelectNodes("//span[@class='toctext']");

现在该如何处理这些信息呢?让我们将其存储在 .csv 文件中以备后用。为此,你需要先遍历之前提取的每个节点,并将它们的文本存储到一个列表中。

CsvHelper 将完成剩余的工作,创建文件并将提取的信息写入其中。

var titles = new List<Row>();
foreach (var item in HeaderNames)
{
    titles.Add(new Row { Title = item.InnerText});
}
 
using (var writer = new StreamWriter("your_path_here/example.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteRecords(titles);
}

5. 运行代码

代码编写完成,现在只需运行它!在终端中输入以下命令行。请确保您已先保存文件!

dotnet run

大功告成!

希望本文能帮助你更好地理解使用 C# 进行网页抓取的基础知识。

拥有自己的爬虫工具非常实用,但请记住,您每次只能爬取一个网页,且仍需手动在网站的 HTML 代码中选择标签。

如果你想抓取其他多个页面,使用抓取工具确实比手动筛选信息快得多,但并非所有网站都能通过这种方法抓取。有些网站是动态生成的,本示例无法提取其全部数据。

您是否考虑过使用现成的、更先进的工具来帮助您批量抓取数据? 

不妨了解一下API能为你做些什么?这里有一份由WebScrapingAPI撰写的指南,可帮助你选择一款可能符合你需求的API。

下次见!

关于作者
Sorin-Gabriel Marica, 全栈开发工程师 @ WebScrapingAPI
Sorin-Gabriel Marica全栈开发工程师

索林·马里卡(Sorin Marica)是 WebScrapingAPI 的全栈及 DevOps 工程师,负责开发产品功能并维护确保平台平稳运行的基础设施。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。