使用 Html Agility Pack 解析前通过代理获取 HTML
将配置了代理的 HttpClient 与 Html Agility Pack 结合,把网络错误与 HTML 解析区分开来。
using var handler = new HttpClientHandler
{
UseProxy = true,
Proxy = new WebProxy("http://proxy.example:8080")
};
using var client = new HttpClient(handler);
string html = await client.GetStringAsync(
"https://www.example.com/catalog");
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);这段现代 .NET 片段使用 System.Net 和 System.Net.Http。配置好的客户端负责网络路由,Html Agility Pack 接收返回的 HTML 字符串。对于持续进行的工作,应保留一个配置得当的客户端,而不是为每个页面重建其连接池。
对于这个公开页面示例,来自 HTTP 代理列表 的未认证候选项可以替换中间层。目标地址需单独替换。网站 URL 保留其 TLS 身份。经过认证的代理凭据属于 WebProxy;网站凭据或禁用验证都不能替代它们。
GetStringAsync 将非成功的 HTTP 状态视为错误。不要将失败的下载转换为空的 HtmlDocument。如果应用需要响应头、状态详情或错误正文,请使用面向响应的 HTTP 操作,并在解析前检查它。
字符串方法避免对原始字节进行无条件的额外 UTF-8 转换。如果你有意获取字节,请把响应和文档的编码要求带入解码过程。
LoadHtml 生成已解析的文档;它不执行脚本、不加载样式,也不跟随链接。请针对响应的位置解析后续的相对链接,并记住浏览器渲染的元素可能不在下载的源码中。即使请求共享同一个已配置的 HTTP 客户端,每个响应也应生成各自的文档。