2.27抓取网页内容(爬虫)

更新于 2026 年 8 月 22 日约 3 分钟读完

本节介绍三种抓取网页内容的方式:直接抓取配合 HTML 解析库,以及借助无头浏览器抓取 JavaScript 渲染的页面。

借助 HTTP 远程请求模块,您可以轻松抓取互联网上的任意网页内容(即常说的“爬虫”)。配合 HTML 解析库(如 AngleSharp 或 HtmlAgilityPack),可进一步提取所需数据;对于依赖 JavaScript 渲染的页面,还可借助无头浏览器(如 Playwright)抓取渲染后的完整内容。

以下以抓取博客园(cnblogs)首页的博客标题为例,分别展示两种解析库与无头浏览器的使用方式。

使用 AngleSharp

1. 安装 NuGet 包

bash
Install-Package AngleSharp

2. 编写爬取代码

cs
// 获取博客园首页 HTML 字符串var cnblogs = await httpRemoteService.SendAsStringAsync(HttpRequestBuilder.Get("https://www.cnblogs.com/")     .SetUserAgent(UserAgents.GetRandom())); // 随机浏览器 User-Agent// 使用默认配置创建一个用于解析网页的上下文var context = BrowsingContext.New(Configuration.Default);// 将获取到的 HTML 字符串作为虚拟请求的内容,解析为可操作的文档对象var document = await context.OpenAsync(req => req.Content(cnblogs));// 使用 CSS 选择器查询文档中所有匹配的元素:id 为 post_list 下的 post-item-title 类元素var elements = document.QuerySelectorAll("#post_list .post-item-title");// 提取每个元素的文本内容(即博客标题)var titles = elements.Select(u => u.TextContent).ToList();

使用 HtmlAgilityPack

1. 安装 NuGet 包

bash
Install-Package HtmlAgilityPack

2. 编写爬取代码

cs
// 获取博客园首页 HTML 字符串var cnblogs = await httpRemoteService.SendAsStringAsync(HttpRequestBuilder.Get("https://www.cnblogs.com/")     .SetUserAgent(UserAgents.GetRandom())); // 随机浏览器 User-Agent// 创建 HtmlDocument 实例,用于解析 HTMLvar document = new HtmlDocument();// 加载获取到的 HTML 字符串document.LoadHtml(cnblogs);// 使用 XPath 获取节点集合:选择 id 为 post_list 的元素内,所有 class 包含 post-item-title 的子元素var nodes = document.DocumentNode.SelectNodes("//*[@id='post_list']//*[contains(@class,'post-item-title')]");// 提取每个节点的内部文本(即博客标题)var titles =  nodes.Select(node => node.InnerText).ToList();

使用无头浏览器(Playwright)

部分网页依赖 JavaScript 动态渲染(如单页应用 SPA、异步加载的列表),直接抓取 HTML 拿不到最终内容。此时可借助无头浏览器在真实浏览器内核中执行页面脚本,再提取渲染后的数据。Playwright for .NET(Microsoft.Playwright 包)是当前 C# 生态最主流的无头浏览器库(NuGet 累计下载量超 6000 万),由微软官方维护,默认以无头模式运行,支持 Chromium、Firefox、WebKit 三种内核。如仅需 Chromium,也可选用 PuppeteerSharp。

1. 安装 NuGet 包

bash
Install-Package Microsoft.Playwright

2. 下载浏览器内核

首次使用前需下载浏览器内核(以下载 Chromium 为例):

bash
dotnet tool install --global Microsoft.Playwright.CLIplaywright install chromium

3. 编写抓取代码

cs
// 启动 Playwright(默认以无头模式运行 Chromium)using var playwright = await Playwright.CreateAsync();await using var browser = await playwright.Chromium.LaunchAsync();// 新建页面并设置窗口尺寸(模拟真实浏览器环境)var page = await browser.NewPageAsync();await page.SetViewportSizeAsync(1920, 1080);// 访问页面并等待网络空闲,确保 JavaScript 执行完毕await page.GotoAsync("https://www.cnblogs.com/", new() { WaitUntil = WaitUntilState.NetworkIdle });// 等待目标元素出现(SPA 页面可能异步渲染)await page.WaitForSelectorAsync("#post_list .post-item-title");// 提取所有匹配元素的文本(即博客标题);page.ContentAsync() 可获取渲染后的完整 HTMLvar titles = await page.Locator("#post_list .post-item-title").AllTextContentsAsync();

无头浏览器会真实执行页面脚本,能抓取到 JavaScript 渲染后的最终内容,是三种方式中能力最强的;其开销与使用建议见下文注意事项。

注意事项

  • 合法合规:请务必遵守目标网站的 robots.txt 协议及相关法律法规,合理控制请求频率,避免对服务器造成压力。
  • 反爬策略:可适当设置 User-Agent、延时等待、代理 IP 等策略,以提高抓取稳定性。
  • 解析方式:AngleSharp 支持 CSS 选择器,语法更接近前端;HtmlAgilityPack 则基于 XPath,两者各有所长,可按需选用。
  • 无头浏览器:首次使用需下载浏览器内核(约数百 MB),运行开销大于直接抓取,建议仅在页面依赖 JavaScript 渲染时使用;常规静态页面优先使用前两节的直接抓取方式,更轻量高效。

通过 HTTP 远程请求、解析库与无头浏览器的结合,您可以快速实现各类网页数据采集需求。