如果我使用此功能收回一个网站,我会获得整个页面,但没有加载ajax的值。
htmlDoc.LoadHtml(new WebClient().DownloadString(url));
是否可以像在gChrome中一样加载所有值的网站?
答案 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他们只是宣布这个功能所以也许会对你感兴趣,但它不是免费的。