有没有一种办法,以查看网页的产生源(后所有的代码AJAX调用和JavaScript DOM操作已经发生)从C#应用程序,而无需打开了浏览器的代码?查看生成的源代码(后AJAX/JavaScript的),在C#
使用WebRequest或WebClient查看初始页面对象工作正常,但如果页面在页面加载时广泛使用JavaScript来更改DOM,则这些不会提供页面的准确图片。
我已经尝试使用Selenium和Watin UI测试框架,它们完美地工作,提供所有JavaScript操作完成后显示的源代码。不幸的是,他们通过打开一个非常慢的实际网页浏览器来实现这一点。我已经实现了一个将这项工作卸载到另一台机器上的硒服务器,但仍然存在很大的延迟。
有一个.net库,将加载和分析页面(如浏览器)和吐出生成的代码?显然,谷歌和雅虎并没有为他们想要蜘蛛的每一页打开浏览器(当然他们可能比我拥有更多的资源......)。
是否有这样的图书馆还是我倒霉,除非我愿意来剖析一款开源浏览器的源代码?
SOLUTION
好,感谢大家对你的帮助。我有一个工作解决方案,比Selenium快10倍。呜!
感谢这个old article from beansoftware我能够使用System.Windows.Forms.WebBrowser控件下载页面并解析它,然后给它生成的源代码。尽管控件位于Windows.Forms中,但仍然可以从Asp.Net(我正在做的)中运行它,只需记住将System.Window.Forms添加到您的项目引用。
关于代码有两件值得注意的事情。首先,WebBrowser控件在新线程中调用。这是因为它必须在single threaded apartment上运行。
其次,GeneratedSource变量在两个地方设置。这不是由于一个明智的设计决定:)我仍在努力,并会在我完成时更新这个答案。 wb_DocumentCompleted()被多次调用。首先下载最初的HTML,然后在第一轮JavaScript完成时再次。不幸的是,我刮的网站有3个不同的装载阶段。 1)加载初始HTML 2)执行第一轮JavaScript DOM操作3)暂停半秒钟,然后进行第二轮JS DOM操作。
出于某种原因,第二轮不被wb_DocumentCompleted()函数造成的,但它总是陷于当wb.ReadyState ==完成。那么为什么不从wb_DocumentCompleted()中删除呢?我仍然不确定为什么它没有被捕获,这就是beadware软件文章推荐的。我会继续研究它。我只想发布此代码,以便任何感兴趣的人都可以使用它。请享用!
using System.Threading;
using System.Windows.Forms;
public class WebProcessor
{
private string GeneratedSource{ get; set; }
private string URL { get; set; }
public string GetGeneratedHTML(string url)
{
URL = url;
Thread t = new Thread(new ThreadStart(WebBrowserThread));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
return GeneratedSource;
}
private void WebBrowserThread()
{
WebBrowser wb = new WebBrowser();
wb.Navigate(URL);
wb.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(
wb_DocumentCompleted);
while (wb.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
//Added this line, because the final HTML takes a while to show up
GeneratedSource= wb.Document.Body.InnerHtml;
wb.Dispose();
}
private void wb_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = (WebBrowser)sender;
GeneratedSource= wb.Document.Body.InnerHtml;
}
}
你可以尝试破解萤火虫的来源。 – 2009-08-20 18:08:15
我的尝试本来是和Watin和朋友一起的。伟大的问题! – orip 2009-08-20 18:25:51
尝试运行你对“http://www.host.com/path/page.html?ast=3”或“http://gwt.google.com/samples/Showcase/Showcase.html”代码。您会注意到,它没有获取正确的HTML。任何想法如何解决这个问题? – Cosmo 2010-08-15 16:21:50