![基于IE內(nèi)核的網(wǎng)頁信息抽取程序開發(fā)文檔_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/29/89707b30-55b5-4011-b1e1-3134d9bc361b/89707b30-55b5-4011-b1e1-3134d9bc361b1.gif)
![基于IE內(nèi)核的網(wǎng)頁信息抽取程序開發(fā)文檔_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/29/89707b30-55b5-4011-b1e1-3134d9bc361b/89707b30-55b5-4011-b1e1-3134d9bc361b2.gif)
![基于IE內(nèi)核的網(wǎng)頁信息抽取程序開發(fā)文檔_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/29/89707b30-55b5-4011-b1e1-3134d9bc361b/89707b30-55b5-4011-b1e1-3134d9bc361b3.gif)
![基于IE內(nèi)核的網(wǎng)頁信息抽取程序開發(fā)文檔_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/29/89707b30-55b5-4011-b1e1-3134d9bc361b/89707b30-55b5-4011-b1e1-3134d9bc361b4.gif)
![基于IE內(nèi)核的網(wǎng)頁信息抽取程序開發(fā)文檔_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/29/89707b30-55b5-4011-b1e1-3134d9bc361b/89707b30-55b5-4011-b1e1-3134d9bc361b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、基于internet explorer內(nèi)核的網(wǎng)頁信息抓取程序2009年3月25日程序開發(fā)背景本程序來源于我們項目組最近正在開發(fā)的一個開源項目網(wǎng)頁分塊工具。其目的是作為一個底層的信息抽取模塊,為后期分析提供盡可能詳盡的分塊線索,包括盡可能完整的html源代碼和網(wǎng)頁元素的位置、顏色、字體、背景色等信息。程序還要具有較好的適應(yīng)性,能夠支持多種網(wǎng)頁,而事實上很多網(wǎng)頁都是不標(biāo)準(zhǔn)的。從通用性考慮,程序應(yīng)該能夠支持多種應(yīng)用,而不僅限于網(wǎng)頁分塊。預(yù)期目標(biāo)分析程序應(yīng)達到以下幾點設(shè)計要求:l 能夠指定要處理的網(wǎng)頁的url。l 能夠為html源代碼添加附件信息,如元素位置。l 對于javascript等動態(tài)腳本具有
2、良好的解析能力。l 通過命令行調(diào)用,提供良好的通用性。l 通過socket套接字返回html源代碼。l 支持延時讀取,保證抓取的成功率。l 支持超時退出,保證程序不會因為加載不成功而卡死。使用ie內(nèi)核的原因本程序的核心部分使用的是ie內(nèi)核。至于為什么要基于ie內(nèi)核,而不使用其他瀏覽器的內(nèi)核,有以下幾方面的原因:首先,firefox、google chrome等瀏覽器雖然是開放源代碼的,但是其源代碼的閱讀難度相當(dāng)大,想在短時間內(nèi)弄明白是很困難的。其次,ie的相關(guān)開發(fā)文檔比較完整,開發(fā)環(huán)境比較容易構(gòu)建,開發(fā)起來更容易上手。最后,從網(wǎng)頁的兼容性考慮,得益于ie的廣泛的市場占有率,其兼容性明顯要比其他
3、瀏覽器要好很多,盡管對很多標(biāo)準(zhǔn)都支持得不是很好。綜上,就可以確定本程序使用ie內(nèi)核進行開發(fā),實驗證明,這個做法是正確的。internet explorer的程序結(jié)構(gòu)對于本程序來說,其中最重要的的就是網(wǎng)頁內(nèi)容處理層,所用到的接口也都位于mshtml.dll文件中。開發(fā)環(huán)境系統(tǒng):windows xpide:visual studio 2005中文版ie版本:internet explorer 6構(gòu)建基于對話框的mfc程序運行visual studio 2005(c+),新建一個項目,選擇mfc標(biāo)簽下的 “mfc應(yīng)用程序”作為模板,填入項目名稱,確定。此時會彈出一個向?qū)?,按照以下步驟操作:點擊左側(cè)的
4、”應(yīng)用程序類型”,選擇”基于對話框”,”在靜態(tài)庫中使用mfc”(方便以后發(fā)布),其他保持默認(rèn)即可。然后單擊完成,程序會自動生成相應(yīng)的類。切換到資源視圖,依次展開,在dialog中找到以項目名稱命名的對話框,雙擊打開。刪除“確定”和“取消”按鈕。在對話框窗口上單擊右鍵,選擇“插入activex控件”。在新彈出的窗口中選擇”microsoft web 瀏覽器”,確定。調(diào)整好ie控件的位置后,在其上單擊右鍵,選擇“添加變量”,輸入名稱m_webbrowser。切換到解決方案視圖,打開對話框的源文件,名稱通常為*dlg.cpp(*為項目名)。將下面的代碼添加到對話框初始化函數(shù)oninitdialog(
5、)中。lpctstr url = _t(“http:/*”);m_webbrowser.navigate(url,&vtempty,&vtempty,&vtempty,&vtempty);如何確定webbrowser控件中的網(wǎng)頁加載完成當(dāng)網(wǎng)頁下載完成后,webbrowser控件觸發(fā)documentcomplete 事件。通過在程序中添加響應(yīng)documentcomplete事件的程序,我們就可以在網(wǎng)頁下載完成后對其進行分析和處理。添加事件處理程序的操作步驟如下:切換到資源視圖,打開包含webbrowser控件的對話框,在webbrowser控件上單擊右鍵,選擇“添加事件處理程序”,然后在彈出的對
6、話框中選擇documentcomplete消息,點擊“添加編輯”以確認(rèn)。webbrowser控件觸發(fā)documentcomplete事件的readystate屬性更改為 readystate_complete時,這表示 webbrowser 控件已完成下載網(wǎng)頁。雖然通過響應(yīng)documentcomplete事件可以知道網(wǎng)頁是否加載完成,但是有的網(wǎng)頁觸發(fā)了不止一次documentcomplete事件,例如網(wǎng)易首頁會從加載開始到完全加載完畢會激發(fā)二十多次documentcomplete事件。出現(xiàn)這種情況的主要原因是:網(wǎng)頁中包含javascript等動態(tài)腳本,而且有可能會改變網(wǎng)頁元素的結(jié)構(gòu),當(dāng)這些腳本
7、完成解析后會觸發(fā)documentcomplete事件;如果網(wǎng)頁是由多個frame框架組成的,每個框架中的網(wǎng)頁加載完成也會觸發(fā)documentcomplete事件。針對第二種情況,微軟給出了具體的解決方案, 通過將documentcomplete事件處理函數(shù)的參數(shù)中的url與當(dāng)前的網(wǎng)頁文檔的url相比較,若相同,則說明整個網(wǎng)頁都已經(jīng)完成加載,此時再對網(wǎng)頁進行分析和處理,然后退出。按照理論,只需對網(wǎng)頁做一次處理就可以了。然而在測試新浪博客時,我又發(fā)現(xiàn)了問題 在博客評論加載完成之前觸發(fā)很多次documentcomplete事件,其中的一次事件對應(yīng)的url與網(wǎng)頁文檔的url一樣。如果只對網(wǎng)頁處理一次,
8、程序是無法處理獲取加載評論之后的網(wǎng)頁。這就是為什么程序需要加上延時讀取功能的原因,具體思路請參照下一節(jié)。當(dāng)然,在webbrowser控件的事件中,還有其他的事件,比如navigatecomplete2事件。我曾經(jīng)嘗試在其他事件觸發(fā)時對網(wǎng)頁進行分析,但是都會出錯,要么只能獲取到一部分元素,要么直接就彈出錯誤信息。這是因為此時網(wǎng)頁尚未完全加載,很多元素的屬性都沒確定,當(dāng)然無法確定元素的具體信息,如元素位置信息。延時讀取和超時退出為了降低網(wǎng)絡(luò)、機器配置、系統(tǒng)軟件等外界因素對程序的影響,提高讀取的成功率。本程序加入了延時讀取和超時退出的功能。具體實現(xiàn)方法是:首先在程序的初始化函數(shù)中,如對話框的onin
9、itdialog函數(shù),添加一個固定id的定時器,使程序定時發(fā)出一個wm_time消息。具體函數(shù)如下:settimer(8888,1000,null);/8888為該定時器的id,1000為定時發(fā)出wm_time消息的時間,單位為毫秒。然后添加一個處理wm_time消息的函數(shù),其代碼如下:void cmybrowserdlg:ontimer(uint_ptr nidevent)ctime ct;ctimespan cts(0,0,0,5000);/程序延時執(zhí)行時間ctimespan timeout(0,0,0,m_timeout);/程序超時退出時間/判斷定時器id,若非指定的定時器id則退出i
10、f(nidevent =! 8888)cdialog:ontimer(nidevent);return;/獲取當(dāng)前時間ct = ctime:getcurrenttime();/超時退出,并輸出錯誤信息if(ct (m_time+timeout):postquitmessage(3);/強制退出程序,并返回一個int型的值/獲取ihtmldocument2指針,以便進行下面的操作ccomqiptr spdoc2 = (ihtmldocument2 *)m_webbrowser.get_document();/判斷網(wǎng)頁加載狀態(tài),若加載完成則繼續(xù)處理;否則返回if(1 != m_flag)/m_fl
11、ag為documentcomplete事件觸發(fā)標(biāo)志,1表示已觸發(fā),0表示尚未觸發(fā)return;else if(m_webbrowser.readystate_complete != m_webbrowser.get_readystate()return;else if(ct get_body(&pbody);/獲取body對象的指針,返回操作結(jié)果if( succeeded( hr ) )/若操作成功,則繼續(xù)執(zhí)行/ something to doihtmldocument3接口前面說過了ihtmldocument3只是ihtmldocument2接口的擴展,而且在本程序中用到該接口的地方也就一兩
12、處。使用ihtmldocument3接口的原因是其提供了一個get_documentelement函數(shù),下面是其介紹和簡單的示例:函數(shù)原型 功能說明 hresultget_documentelement(ihtmlelement*p); 獲取html文檔中根節(jié)點的接口指針 示例:ihtmlelement * pdocelem;/ ihtmlelement接口指針,指向body對象 hresult hr;/用于存放函數(shù)調(diào)用結(jié)果 hr = pdoc2-get_documentelement (& pdocelem);/獲取body對象的指針,返回操作結(jié)果if( succeeded( hr ) )/
13、若操作成功,則繼續(xù)執(zhí)行 / something to do 獲取根節(jié)點的目的是通過它獲取整個html文檔的源代碼,具體如何獲得請看下面關(guān)于ihtmlelement接口的介紹。ihtmlelement接口函數(shù)原型 功能說明 hresultget_innerhtml(bstr*p); 獲取當(dāng)前對象開始和結(jié)束標(biāo)簽之間的html源代碼(動態(tài)內(nèi)容) hresultget_innertext(bstr*p);獲取當(dāng)前對象開始和結(jié)束標(biāo)簽之間的文本內(nèi)容(動態(tài)內(nèi)容)hresult get_outerhtml(bstr*p); 獲取對象的html的內(nèi)容(靜態(tài)內(nèi)容) hresult get_outertext(bs
14、tr*p); 獲取對象的文本內(nèi)容(靜態(tài)內(nèi)容) 下面只給出get_innerhtml函數(shù)的使用方法示例,另外三個函數(shù)類似:ihtmlelement * pelem;/ ihtmlelement接口指針,指向body對象 bstr html;/存放html源代碼 _bstr_t html_t;/用于將bstr轉(zhuǎn)換為cout可以處理的字符串 hr = pelem-get_innerhtml(&html);if( succeeded( hr ) )html_t = html; cout”the html within this element is:”getabsx();/獲取父節(jié)點的絕對坐標(biāo)if(s
15、ucceeded(spelement-get_offsetleft(&absx) absx += parentabsx;值得注意的是這兩個函數(shù)獲取到的都是相對于父節(jié)點的坐標(biāo),計算元素絕對坐標(biāo)時還需要加上父節(jié)點的絕對坐標(biāo)。因此在設(shè)計程序時使用了一個自定義的node類,其中包含著當(dāng)前節(jié)點位置信息,然后傳遞給子節(jié)點,子節(jié)點計算出相對坐標(biāo)后再加上該絕對坐標(biāo)就可以得到子節(jié)點的絕對坐標(biāo)。在ie的內(nèi)存模型中,網(wǎng)頁文檔是以dom(document object model文檔對象模型)存放在內(nèi)存中的,對網(wǎng)頁的處理和分析都是基于dom來操作的,其操作方法與普通的dom并無太大區(qū)別。下面簡單介紹ie處理網(wǎng)頁的兩個
16、dom相關(guān)接口:ihtmldomnode接口函數(shù)原型 功能說明 hresultget_childnodes(idispatch*p); 獲取指定節(jié)點的所有直接后裔節(jié)點的集合 hresultget_nodetype(long*p); 返回指定節(jié)點的類型 在網(wǎng)頁文檔的dom結(jié)構(gòu)中,標(biāo)簽的屬性、文本和注釋都是以節(jié)點的形式存在的。然而這些節(jié)點卻無法使用其他接口來處理,如ihtmlelement接口,如果要對這些類型的節(jié)點強行操作,程序就會報錯退出。因此在dom遞歸時要進行查詢ihtmlelement接口時,就要通過ihtmldomnode的nodetype來進行判斷。只有當(dāng)nodetype為eleme
17、nt時才有子節(jié)點,向下遞歸才不會出錯。nodetype所對應(yīng)的節(jié)點類型:(attribute屬性) 1(element元素) 3(text文本) 8(comment注釋)。 ihtmldomchildrencollection接口函數(shù)原型 功能說明 hresultget_length(long*p); 獲取集合中子節(jié)點的個數(shù) hresultitem(longindex, idispatch*ppitem ); 獲取指定索引位置的子節(jié)點 遍歷dom中的所有節(jié)點結(jié)合ihtmldomnode接口和ihtmldomchildrencollection接口就可以遍歷dom中的所有節(jié)點。下面是示例代碼:v
18、oid getallchild(ihtmldomnode * pnode)ccomptr spchildrendisp;/用于子節(jié)點的集合 ccomptr spchilddisp;/正在處理的子節(jié)點 ihtmldomchildrencollection *spchildrennode;longnodetype;/節(jié)點類型 pnode-get_nodetype(&nodetype);pnode-get_childnodes(&spchildrendisp);if( 3 = nodetype )/判斷節(jié)點類型是否為element /一些額外的操作spchildrennode = (ihtmldomchildrencollection *)spchildrendisp;spchildrennode-get_length(&childrennum);/獲取子節(jié)點的集合長度 for(long i = 0 ; iitem(i,&spchi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度教學(xué)儀器知識產(chǎn)權(quán)保護合同
- 全新轎車購買合同范本
- 2025年度金融貸款居間風(fēng)險控制合同
- 全國授權(quán)合同范本
- 養(yǎng)鵝合同范例
- 切割支撐合同范本
- 業(yè)主和裝修工長合同范例
- 2025年度花卉市場渠道建設(shè)與拓展合同
- 自愿租賃房屋意向合同范本
- n 1賠償合同范本
- 生物技術(shù)制藥課件
- 2020年新概念英語第一冊lesson97-102單元檢測
- 工業(yè)級七水硫酸亞鐵
- 追求理解的教學(xué)設(shè)計課件資料文檔
- 腹主動脈瘤(護理業(yè)務(wù)學(xué)習(xí))
- 注射用醋酸亮丙瑞林微球
- 部編版語文五年級下冊 全冊教材分析
- 胎兒性別鑒定報告模板
- CLSIM100-S24英文版 抗菌藥物敏感性試驗執(zhí)行標(biāo)準(zhǔn);第二十四版資料增刊
- 惠豐f1000g變頻器說明書
- 耳穴療法治療失眠
評論
0/150
提交評論