使用HtmlAgilityPack获取HTML时显示“Loading...”的解决方法
这个问题我碰到过好多次啦!你看到的「Loading....」其实是因为HtmlAgilityPack的HtmlWeb只能抓取静态HTML内容,而目标网站的内容是通过JavaScript动态渲染出来的——当HtmlWeb请求页面时,JS还没来得及执行,所以拿到的只是未渲染的初始页面,自然看不到真实数据。
下面给你两个实用的解决方案:
解决方案一:用浏览器自动化工具模拟真实浏览
这类工具会启动真实浏览器,完整执行页面里的JS代码,等页面渲染完成后再抓取HTML,完美解决动态内容的问题。我常用Selenium,给你举个例子:
- 先安装NuGet包:
Selenium.WebDriver和Selenium.WebDriver.ChromeDriver(自动管理Chrome驱动) - 示例代码:
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using HtmlAgilityPack; using OpenQA.Selenium.Support.UI; private static void GetDynamicHtml() { // 配置Chrome浏览器,用无头模式不显示窗口 var options = new ChromeOptions(); options.AddArgument("--headless=new"); options.AddArgument("--disable-gpu"); using (var driver = new ChromeDriver(options)) { string targetUrl = "你的目标网站URL"; // 替换成实际要爬的地址 driver.Navigate().GoToUrl(targetUrl); // 显式等待页面渲染完成(比硬等几秒更可靠) var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); // 等待页面不再显示Loading文本 wait.Until(d => !d.PageSource.Contains("Loading....")); // 获取渲染完成后的完整HTML string renderedHtml = driver.PageSource; // 继续用HtmlAgilityPack解析 var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(renderedHtml); var node = htmlDoc.DocumentNode.SelectSingleNode("//body"); Console.WriteLine(node.OuterHtml); } }
解决方案二:直接抓取数据API(更高效)
很多网站的动态内容其实是通过AJAX请求后端API获取的,你可以跳过HTML直接抓这个接口,拿到JSON格式的数据,比解析HTML效率高多了:
- 打开浏览器开发者工具(F12),切换到「Network」标签
- 刷新页面,过滤「XHR」或「Fetch」请求,找到返回你需要数据的API接口
- 复制这个API的URL,用
HttpClient直接请求
示例代码:
using System.Net.Http; using System.Text.Json; private static async Task FetchDataFromApi() { string apiUrl = "你找到的API接口地址"; // 替换成实际API URL using var httpClient = new HttpClient(); // 有些接口需要请求头(比如User-Agent、Cookie),可以从开发者工具里复制过来 httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"); var response = await httpClient.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); string jsonContent = await response.Content.ReadAsStringAsync(); // 可以把JSON转换成实体类,方便后续处理 // var data = JsonSerializer.Deserialize<YourCustomModel>(jsonContent); Console.WriteLine(jsonContent); }
小提醒:用Selenium时要注意驱动版本和浏览器版本匹配;抓API的话,如果遇到请求失败,记得检查是否需要携带Cookie或其他请求头哦。
内容的提问来源于stack exchange,提问作者KobCoder
相关产品推荐
相关产品推荐

