2011-03-10 23 views
0

有沒有辦法訪問IE DOM進程,例如,一個網頁刮板,加載當前顯示的頁面和抓取數據。我已經看到了幾種下載頁面並處理它的方法,但是當網站回覆動態結果並需要登錄時,這不起作用。在C中訪問IE Dom進程#

我希望不必編寫bho來訪問數據並通過wcf共享它。我已經看到了一些使用C++和msaa服務器獲取數據的例子,但是這並不能真正幫助我獲得它,因爲我不願意使用C++助手,因爲我多年沒有使用C++。

TIA。

回答

2

根據你需要做多少事情,你可能要考慮使用一些簡單的東西,如WatiN。這是一個用於實例化瀏覽器實例並漫遊樹的好工具。 DOM操作非常簡單,並且有很好的文檔記錄(網上有很多例子)。

+0

+1。忘了想到這一點。除了WebRequest +解析器可以提供的功能之外,他可能會滿足他的大部分需求。 – meklarian

1

如果您只是在進行刮擦和請求,那麼您最好使用.NET附帶的WebRequest對象來完成您的工作。

WebRequest Class @ MSDN

但是,如果你必須有什麼是在IE瀏覽器的DOM表示確切的訪問,那麼應該使用Microsoft Active Accessibility的獲取訪問權。如果您可以識別目標IE窗口的窗口句柄或可靠位置,並且它在用戶會話中可見,則Active Accessibility是訪問目標IE窗口並挖掘DOM的最佳方式。使用C++並非絕對必要,但在C++中完成大部分工作可能會更容易。

Active Accessibility User Interface Services @ MSDN

你要使用EnumChildWindows定位(或蠻力查詢)從枚舉進程中檢索到的DOM窗口從桌面或框架窗口的句柄。在.NET中,可以從System.Process類中獲得進程的枚舉。

EnumChildWindows @ MSDN

EnumWindows signature @ pinvoke.net
EnumChildWindows signature @ pinvoke.net

Process.GetProcesses() @ MSDN
Process.MainWindowHandle @ MSDN

要添加您需要能夠走DOM在C#和交談MSAA,添加一個COM類型聲明爲您的項目引用「Microsoft HTML Object Library」,併爲MSAA添加P/Invoke簽名。

AccessibleObjectFromWindow Signature @ pinvoke.net

一旦你可以打電話MSAA,通過檢索從窗口句柄Active Accessibility的一個IDispatch。您需要發送OBJID_NATIVEOM,您可以詢問您的IDispatch

Retrieving an IAccessible Object @ MSDN
AccessibleObjectFromWindow() @ MSDN

從這裏,IDispatch可以鑄造到IHTMLWindow2IHTMLDocument2(和衍生物),其具有所有的DOM腳本模型方法,並且更。不幸的是,我不記得哪一個是通過這種方法返回的,但是在任何情況下,IHTMLWindow2都具有document屬性(與腳本中的window.document相同)。可以解決任何一種情況,以提供對由IHTMLDocument2和所有派生接口表示的DOM的訪問。