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

时间:2016-03-23 10:12:24

标签: c# webclient

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

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

是否可以像在gChrome中一样加载所有值的网站?

2 个答案:

答案 0 :(得分:3)

您可以使用WebBrowser控件来获取和呈现页面。不幸的是,控件使用Internet Explorer而你必须change a registry value才能强制它使用最新版本,即使这样,实现也很脆弱。

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

我参与了一个小型演示应用程序以获取内容,这就是我想出的:

    class Program
    {
        static void Main(string[] args)
        {
            GetRenderedWebPage("http://siderite.blogspot.com", 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使用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/

答案 1 :(得分:2)

在你的例子中不可能。因为它会将内容加载为字符串。你应该在&#34;浏览器引擎&#34;中渲染该字符串。或者找到任何可以帮助你的组件。

我建议你研究abotx他们只是宣布这个功能所以也许会对你感兴趣,但它不是免费的。