调用Javascript来返回web scrape的数据

时间:2014-04-16 21:01:40

标签: c# javascript webbrowser-control mshtml

我试图编写一个网络抓取应用程序,并且在运行一些JavaScript的网站遇到问题,以便在页面加载后生成我需要的数据。

页面加载后,页面运行此javascript:

$(document).ready( function() { 
$("#periodSelect, #typeSelect").change(spotSystemPrice.load);
spotSystemPrice.load();

完成后,它会用数据填充div(id =" spotSystemPriceOutput")。

我尝试仅使用WebBrowser类,但InvokeScript只允许您调用函数,而不是调用方法。我到目前为止找到的最接近的解决方案是使用调用该方法的MSHTML.dll插入一些javascript。这似乎工作,但我需要一些帮助将div输出加载到一个字符串,或者我甚至可以使用全身html。我对C#非常陌生,所以我对此完全不了解,我认为我需要的最后一步将变得非常简单,所以我只需要你们中的一位专家来帮助我:)

以下是我正在使用的代码。任何建议,以帮助我完成它,甚至完全不同的解决方案将不胜感激。

WebBrowser wb = new WebBrowser();
wb.Navigate(URL);
while (wb.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();
var doc = (IHTMLDocument2)wb.Document.DomDocument;
var headItems = (IHTMLElementCollection)doc.all.tags("head");
var scriptObject = (IHTMLScriptElement)doc.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = "spotSystemPrice.load();";
var node = (IHTMLDOMNode)headItems.item(null, 0);
node.appendChild((IHTMLDOMNode)scriptObject);

有趣的是,如果我将我的javascript注入更改为" spotSystemPrice.load();警报('');" 在消息框上单击“确定”后,我可以使用文本可视化器在对象资源管理器中查看结果,该文本可视化器为我提供了(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((如何为javascript添加警报会改变我的结果?我是否需要等待某种onComplete事件?

更新:我还发现这看起来很有用Calling javascript object method using WebBrowser.Document.InvokeScript并且我将我的代码修改为:

WebBrowser wb = new WebBrowser();
wb.Navigate(URL);
while (wb.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();
string JScript = "spotSystemPrice.load();";
object[] args = { JScript };
wb.Document.InvokeScript("eval", args);
while (wb.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();

但是仍然没有给我div元素中的数据。但出于某种原因,如果我冒险使用我的javascript警告('');"并且甚至不试图调用该方法,我需要的数据就在那里!到底发生了什么?我很困惑。

1 个答案:

答案 0 :(得分:0)

如果脚本中已存在函数spotSystemPrice.load,您可以尝试调用InvokeScript:

wb.Document.InvokeScript("spotSystemPrice.load");

注意我没有在函数末尾使用()。在此之后,当您加载更多数据时,您需要等待它再次加载,因此重复使用您的代码:

while (wb.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

你也可以等到wb.Document.Body不为null和/或你的div包含数据。

while (wb.Document.Body == null) Application.DoEvents();
while (wb.Document.GetElementById("spotSystemPriceOutput").InnerHtml.length == 0) Application.DoEvents();

但是在这一点上我会实施一些时间,以防万一失败,所以它不会永远被卡在那里,但值得一试。