最简可行方案是用 httpclient(禁用 webclient/httpwebrequest),设 user-agent、复用实例、异步读取响应;中文乱码时手动指定编码;解析用 htmlagilitypack 加载 html 字符串后 xpath 提取,避免正则;遇 403/429 先查请求头与限速。

用 HttpClient 抓取网页 HTML 最简可行方案
直接上手就用 HttpClient,别碰 WebClient(已过时)或 HttpWebRequest(太重)。它默认支持异步、连接池复用,且能自动处理重定向和基础编码识别。
关键点:必须设置 User-Agent,否则多数网站会返回 403 或空内容;响应体要用 await response.Content.ReadAsStringAsync() 读取,别用 GetAwaiter().GetResult() 阻塞线程。
-
HttpClient实例应复用(全局单例或 DI 注入),不要每次请求都 new - 若目标页含中文,但返回乱码,大概率是服务器未声明
Content-Type编码,需手动指定:response.Content.Headers.ContentType?.CharSet可能为空,此时建议 fallback 到Encoding.UTF8或用HtmlDocument.Load(response.Content.ReadAsStreamAsync().Result, Encoding.GetEncoding("gb2312"))(配合 HtmlAgilityPack) - 超时必须设:
client.Timeout = TimeSpan.FromSeconds(10),否则 DNS 卡住会挂死整个调用链
用 HtmlAgilityPack 提取文本最不容易翻车的方式
别用正则解析 HTML——标签嵌套、注释、CDATA、属性换行都会让正则崩溃。HtmlAgilityPack 是 .NET 生态里最稳的 HTML 解析器,NuGet 安装 HtmlAgilityPack 即可。
核心操作是加载文档后用 XPath 或 LINQ 查询节点,再调用 InnerText 获取纯文本(自动去标签、合并空白)。注意:它不执行 JS,所以动态渲染的内容抓不到。
- 加载时优先用
doc.LoadHtml(htmlString),而非Load直接读 URL(避免重复发请求) - 提取正文常用路径:
//article//p | //div[@class="content"]//text(),但更稳妥的是先定位容器节点(如doc.DocumentNode.SelectSingleNode("//main")),再对其子节点调用SelectNodes(".//p") -
InnerText会保留换行和大量空格,后续通常要.Replace("\r\n", "\n").Replace(" ", " ").Trim()
遇到 403 / 429 / 空响应?检查这三件事
不是代码写错了,而是反爬第一道门槛卡住了。
- 确认
HttpClient.DefaultRequestHeaders.UserAgent已设为常见浏览器值,例如:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36";光设一个字符串不够,有些站还校验Accept、Accept-Language - 检查是否被限速:连续请求间隔低于 1 秒,很多小站点会直接封 IP 段或返回 429;加
await Task.Delay(1000)是最低成本缓解手段 - 响应状态码是 200,但
html字符串长度异常短(比如只有几百字节),大概率返回了 JS 跳转或验证码页面,此时需打开 F12 → Network 面板对比真实请求头
简单爬虫不该碰但新手常踩的坑
“简单”意味着只处理静态页、单页抓取、无登录态、无分页翻页逻辑。一旦越界,复杂度指数上升。
- 别在控制台程序里用
async Main却忘记await,导致主程序退出、HTTP 请求被取消——加await或用GetAwaiter().GetResult()(仅限测试) - 别把
HtmlNode.InnerText当万能提取器:表格中单元格文本、<script></script>里的字符串、注释节点都会混进来;需要结构化数据时,应明确遍历td、span等特定标签 - 别忽略
HtmlDocument.OptionFixNestedTags = true,遇到破格式 HTML(比如<b><i>text</i></b>)时,不开启这个选项会导致节点树解析错乱
真正麻烦的从来不是怎么拿到 HTML,而是怎么判断哪段 HTML 是你要的“正文”,以及当页面结构微调时,XPath 表达式是否还健壮——这部分没法靠库自动解决,得结合人工观察和容错逻辑。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











