有没有办法在进程外访问IE DOM,例如网页抓取器加载当前显示的页面并抓取数据。我已经看到了几种下载页面并进行处理的方法,但是当网站回馈动态结果并需要登录时,这种方法无效。
我希望不必写一个bho来访问数据并通过wcf共享它。我已经看到了一些使用c ++和msaa服务器获取数据的例子,但这并没有真正帮助我获取它,因为我不想使用C ++帮助器,因为我多年没有使用过c ++。
TIA。
答案 0 :(得分:2)
根据您需要做多少事情,您可能需要考虑使用像WatiN这样的简单内容。它是实例化浏览器实例和遍历树的绝佳工具。 DOM操作非常简单,并且有很好的文档记录(网上有很多例子)。
答案 1 :(得分:1)
如果您只是在进行抓取和请求,那么最好使用.NET附带的WebRequest
对象来完成您的工作。
但是,如果您必须具有对IE DOM中表示的内容的准确访问权限,则应使用Microsoft Active Accessibility获取访问权限。如果您可以识别目标IE窗口的窗口句柄或可靠位置,并且它在用户会话中可见,则Active Accessibility是访问目标IE窗口并深入DOM的最佳方式。使用C ++并不是绝对必要的,但在C ++中完成大部分操作可能会更容易。
Active Accessibility User Interface Services @ MSDN
您将希望使用EnumChildWindows从桌面或从枚举进程检索到的框架窗口的句柄中定位(或强制查询)DOM窗口。在.NET中,可以从System.Process类中获取进程的枚举。
EnumWindows signature @ pinvoke.net
EnumChildWindows signature @ pinvoke.net
Process.GetProcesses() @ MSDN
Process.MainWindowHandle @ MSDN
要添加类型声明,您需要能够在C#中遍历DOM并与MSAA交谈,向项目添加“Microsoft HTML Object Library”的COM引用,并为MSAA添加P / Invoke签名。 / p>
AccessibleObjectFromWindow Signature @ pinvoke.net
一旦你可以调用MSAA,从窗口句柄通过Active Accessibility检索IDispatch。您需要发送OBJID_NATIVEOM
,这将为您提供IDispatch
您可以查询的内容。
Retrieving an IAccessible Object @ MSDN
AccessibleObjectFromWindow() @ MSDN
从这里开始,IDispatch
可以转换为IHTMLWindow2
或IHTMLDocument2
(以及派生词),其中包含所有DOM脚本模型方法等。不幸的是我不记得通过这种方法返回了哪一个,但无论如何,IHTMLWindow2
具有document
属性(与脚本中的window.document
相同)。可以解析为提供对DOM的访问,DOM由IHTMLDocument2
和所有派生接口表示。