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