2011-05-18 28 views
4

我试图刮一页。一切都很好,但是当值更新时,页面的Sourse代码在一分钟内仍然是一样的。即使当我刷新网页连接速度较慢的网页时,首先我会看到旧数据,并且只有在页面获得完全加载的值后才是最新数据。 我想javascript更新它们。它仍然需要以某种方式下载它们。如何在页面加载后抓取包含使用JavaScript更新的数据的页面?

如何获得当前值?

我用C#编写我的程序,但是如果您有一些想法/建议/示例语言并不重要。

谢谢。

+1

对于Python中的这个问题,请参阅:http://stackoverflow.com/questions/5338979/scraping-a-web-page-with-java-script-in-python – 2011-05-18 17:17:52

+0

谢谢,即时通讯要谷歌这些建议。 – Alena 2011-05-18 17:24:52

回答

2

你说得对 - javascript可能在加载后更新数据。

我能想到的三种方式来处理这个问题:

  1. 使用WebBrowser控件 - 我想使用HttpWebRequest对象来检索网站价值的。如果你需要让javascript运行,这将不起作用。您可以使用webbrowser控件,让javascript运行并从DOM中检索值。只有我不喜欢这种方法的感觉就像是黑客攻击,对于刺激应用程序来说可能太笨重。您还需要知道何时读取DOM的内容(更新可能在后台进行)。 Google“C#WebBrowser控件以编程方式读取DOM”,或者您可以阅读更多关于here的信息。

  2. 我个人比以前更喜欢这个,但它并不是一直工作。首先,你需要从萤火虫或其他东西检查网站,看看哪些网址是从后台调用的。比如说,该网站正在使用JavaScript更新股票报价。最有可能的是,它使用异步请求从Web服务中检索更新的信息。使用firebug,您可以在NET> XHR下查看它。现在是困难的部分。那么,请查看请求并返回值。这个想法是,你可以尝试检索自己的值并解析其中的内容 - 这比抓取页面要容易得多。问题是,你需要做一些逆向工程才能做到。您可能还会遇到身份验证和/或加密问题。

  3. 最后,我最喜欢的解决方案是直接询问您[所在站点的所有者]的所有者。

0

有一些工具可以通过C#:iMacros Scripting Edition或WatiN自动执行Web浏览器。 iMacros更易于使用,但Watin是免费的。两者都有一个庞大的用户群体。

0

我认为WebBrowser控件方法可能是好的,不依赖于第三方库。以下是我打算用它解决了等待页面完成加载问题:

private string ReadPage(string Link) 
{ 
    using (var client = new WebClient()) 
    { 
    this.wbrwPages.Navigate(Link); 
    while (this.wbrwPages.ReadyState != WebBrowserReadyState.Complete) 
    { 
     Application.DoEvents(); 
    } 
    ReadPage = this.wbrwPages.DocumentText; 
    } 
} 

我会通过某种形式的DOM或XPath治疗的获取信息了HTML的。我很好奇,如果别人会对进入'while'循环有意见,并且取决于'完成'状态以使我摆脱困境。我可能会在那里放一些计时器 - 只是为了安全起见。

相关问题