我试图刮一页。一切都很好,但是当值更新时,页面的代码仍然是一分钟的相同。即使我刷新一个网速较慢的网页,我首先看到的是旧数据,只有在页面获得满载后才会显示当前值。 我想javascript会更新它们。不管怎么说还是要下载它们。
我如何获得当前值?
我用C#编写程序,但是如果你有一些想法/建议/例子,语言并不重要。
谢谢。
答案 0 :(得分:2)
你说得对 - javascript可能在加载后更新数据。
我可以想到三种方法来解决这个问题:
使用webbrowser控件 - 我猜您使用HttpWebRequest对象从站点检索值。如果您需要让javascript运行,这将无效。您可以使用webbrowser控件,让javascript运行并从DOM中检索值。我唯一不喜欢这种方法的是它感觉像是一个黑客,可能对于prod应用来说太笨重了。您还需要知道何时读取DOM的内容(更新可能在后台进行)。 Google“C#WebBrowser Control以编程方式读取DOM”,或者您可以阅读有关该here的更多信息。
我个人比以前更喜欢这个,但它不会一直有效。首先,您需要从firebug或其他东西检查网站,并查看从后台调用哪些网址。比如说网站正在使用javascript更新股票报价。最有可能的是,它使用异步请求从Web服务中检索更新的信息。使用firebug,您可以在NET> XHR下查看此内容。现在是困难的部分。好吧,看看请求和返回的值。我们的想法是,您可以尝试检索自己的值并解析内容 - 这比抓取页面要容易得多。问题是,你需要做一些逆向工程才能做到正确。您可能还会遇到身份验证和/或加密问题。
最后,我最喜欢的解决方案是直接询问[您正在抓取的网站的所有者]。
答案 1 :(得分:0)
有一些工具可以通过C#:iMacros Scripting Edition或WatiN自动化Web浏览器。 iMacros更易于使用,但Watin是免费的。两者都有一个庞大的用户社区。 p>
答案 2 :(得分: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'循环的评论并依赖于'完整'状态让我离开它。我也可以在那里放一些计时器 - 只是为了安全。