Skip to main content
 首页 » 编程设计

C#解析带有ajax加载内容的网站

2024年01月31日29lyhabc

如果我收到一个具有此功能的网站,我会得到整个页面,但没有 ajax 加载的值。

htmlDoc.LoadHtml(new WebClient().DownloadString(url)); 

是否可以像在 gChrome 中那样使用所有值加载网站?

请您参考如下方法:

您可以使用 WebBrowser控制获取和呈现页面。不幸的是,该控件使用 Internet Explorer,您必须 change a registry value为了强制它使用最新版本,即使这样,实现也非常脆弱。

另一种选择是采用独立的浏览器引擎,例如 WebKit并使其在 .NET 中工作。我找到了一个解释如何执行此操作的页面,但它已经过时了:http://webkitdotnet.sourceforge.net/basics.php

我开发了一个小演示应用程序来获取内容,这就是我想出的:

    class Program 
    { 
        static void Main(string[] args) 
        { 
            GetRenderedWebPage("https://siderite.dev", TimeSpan.FromSeconds(5), output => 
            { 
                Console.Write(output); 
                File.WriteAllText("output.txt", output); 
            }); 
            Console.ReadKey(); 
        } 
 
        private static void GetRenderedWebPage(string url, TimeSpan waitAfterPageLoad, Action<string> callBack) 
        { 
            const string cEndLine= "All output received"; 
 
            var sb = new StringBuilder(); 
            var p = new PhantomJS(); 
            p.OutputReceived += (sender, e) => 
            { 
                if (e.Data==cEndLine) 
                { 
                    callBack(sb.ToString()); 
                } else 
                { 
                    sb.AppendLine(e.Data); 
                } 
            }; 
            p.RunScript(@" 
var page = require('webpage').create(); 
page.viewportSize = { width: 1920, height: 1080 }; 
page.onLoadFinished = function(status) { 
    if (status=='success') { 
        setTimeout(function() { 
            console.log(page.content); 
            console.log('" + cEndLine + @"'); 
            phantom.exit(); 
        }," + waitAfterPageLoad.TotalMilliseconds + @"); 
    } 
}; 
var url = '" + url + @"'; 
page.open(url);", new string[0]); 
        } 
    } 

这使用了 PhantomJS通过包装器实现“ headless ”浏览器 NReco.PhantomJS您可以直接从 Visual Studio 通过“引用 NuGet 包”获得。我相信它可以做得更好,但这就是我今天所做的。你可能想看看 PhantomJS 回调,这样你就可以正确地调试正在发生的事情。例如,如果 URL 不起作用,我的示例将永远等待。这是一个有用的链接:https://newspaint.wordpress.com/2013/04/25/getting-to-the-bottom-of-why-a-phantomjs-page-load-fails/