0

0

C# 网页内容抓取方法 C#如何爬取网页数据

星降

星降

发布时间:2026-01-26 10:29:02

|

362人浏览过

|

来源于php中文网

原创

<p>HttpClient 是现代 C# 爬虫首选,需异步调用、检查状态码、设置 User-Agent;HtmlAgilityPack 解析 HTML 时须处理编码与空节点;静态页用 HttpClient 足够,动态渲染页应选 PuppeteerSharp。</p>

c# 网页内容抓取方法 c#如何爬取网页数据

HttpClient 获取网页 HTML 最直接可靠

现代 C# 爬虫首选 HttpClient,它支持异步、自动处理重定向和 Cookie(需手动配置),比已过时的 WebClient 更稳定。同步调用(DownloadString)在 .NET 6+ 中已被标记为过时,必须用 GetAsync + ReadAsStringAsync

常见错误:忽略响应状态码,直接读取内容,导致空字符串或异常;或未设置 User-Agent 被服务器拒绝(返回 403)。

  • 务必检查 response.IsSuccessStatusCode,否则 404/500 也会进后续解析流程
  • 添加请求头:client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
  • 若目标页依赖 JavaScript 渲染,HttpClient 拿到的是原始 HTML,无法获取动态内容——此时不是代码问题,而是技术选型错误
var client = new HttpClient();
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
var response = await client.GetAsync("https://example.com");
if (!response.IsSuccessStatusCode)
    throw new Exception($"HTTP {response.StatusCode}");
var html = await response.Content.ReadAsStringAsync();

HtmlAgilityPack 解析 HTML 结构

HtmlAgilityPack 是 C# 生态中事实标准的 HTML 解析库,能容忍 malformed HTML(如缺失闭合标签),比正则匹配安全得多。NuGet 包名就是 HtmlAgilityPack,.NET Core / .NET 5+ 全支持。

容易踩的坑:直接对 html 字符串调用 LoadHtml() 却忽略编码问题,中文乱码;或用 SelectNodes("//div[@class='item']") 但没确认节点是否为 null 就访问 InnerText,引发 NullReferenceException

  • 加载前显式指定编码(尤其 GB2312/GBK 页面):doc.LoadHtml(html, Encoding.GetEncoding("gb2312"))
  • 所有 SelectNodesSelectSingleNode 返回值必须判空,再取 InnerTextGetAttributeValue
  • XPath 中 class 属性含空格或多值时,用 contains(@class, 'xxx')@class='xxx' 更鲁棒
var doc = new HtmlDocument();
doc.LoadHtml(html);
var nodes = doc.DocumentNode.SelectNodes("//div[contains(@class, 'title')]");
if (nodes != null)
    foreach (var node in nodes)
        Console.WriteLine(node.InnerText.Trim());

绕过反爬:处理 Cookie、Referer 和简单 JS 挑战

多数静态页面只需加 User-AgentReferer;但遇到登录态依赖或基础 JS 检查(如生成时间戳、计算 token),就得维持会话上下文。

Programming Helper
Programming Helper

AI代码自动生成器,在AI的帮助下更快地编程

下载

关键点:用同一个 HttpClient 实例复用连接和 Cookie 容器,不要每次新建;HttpClientHandlerUseCookies = true 必须开启(默认是 true,但显式写上更安心)。

  • Referer 头要与目标 URL 同域,否则部分站点拒收(例如从 https://a.com 请求 https://b.com/api 会被拦截)
  • 若首次请求返回 Set-Cookie,后续请求自动携带——前提是没换 HttpClient 实例
  • 遇到 document.cookie = xxxMath.random() 生成参数,不能硬编码,得用 JavaScriptEngineSwitcher 或预编译 JS 片段(小范围可行),否则应转向 PuppeteerSharp

何时该换 PuppeteerSharp

当目标页面大量使用 fetchVue/React 渲染、或有滑动验证、鼠标轨迹检测时,HttpClient + HtmlAgilityPack 就失效了。这时候 PuppeteerSharp(Chromium 自动化)是更实际的选择,而非强行逆向加密逻辑。

注意:它体积大(约 80MB Chromium 二进制)、启动慢、内存占用高,不适合高频轻量采集;且需要确保运行环境有可用的 Chromium(或启用 DownloadBrowser = true 自动下载)。

  • 首次运行会自动下载 Chromium,耗时长且可能失败(国内网络需配代理或手动下载)
  • 务必调用 browser.CloseAsync()DisposeAsync(),否则残留进程吃光内存
  • 等待元素出现用 WaitForSelectorAsync("div.content"),别用 Thread.Sleep

真实场景里,90% 的企业内网报表、政府公开数据页,HttpClient 足够;剩下 10% 才需要评估是否值得引入 PuppeteerSharp。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6500

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6608

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

842

2023.09.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号