本發(fā)明是關(guān)于網(wǎng)頁搜索引擎技術(shù)領(lǐng)域,特別涉及一種基于瀏覽器內(nèi)核的網(wǎng)絡(luò)爬蟲系統(tǒng)。
背景技術(shù):
網(wǎng)絡(luò)爬蟲有著廣泛的應(yīng)用場景,它是網(wǎng)頁搜索引擎的重要組成部分,也被用來獲取網(wǎng)絡(luò)中的特定信息。網(wǎng)絡(luò)爬蟲最核心的功能就是從一個頁面中發(fā)現(xiàn)其他頁面的URL。
目前常見的網(wǎng)絡(luò)爬蟲,都是基于對頁面的靜態(tài)分析的——在分析頁面時,不會去動態(tài)的執(zhí)行頁面中的Javascript腳本,也不會加載頁面中的圖片、腳本等資源。靜態(tài)分析頁面時,主要提取頁面中的<a>標(biāo)簽、<form>標(biāo)簽等可能含有指向其他頁面URL的內(nèi)容。
隨著互聯(lián)網(wǎng)技術(shù)飛速發(fā)展,網(wǎng)頁的實現(xiàn)方式也越來越多樣化,各種前端技術(shù)手段層出不窮,傳統(tǒng)的對頁面進(jìn)行靜態(tài)分析的方法要想分析這些頁面,就變得越來越難,比如:
1.頁面中的按鈕在被點擊時,向服務(wù)器的另一個頁面發(fā)送一個Ajax請求;
2.頁面中的<a>標(biāo)簽是在頁面中的Javascript腳本執(zhí)行時動態(tài)生成的。
在例子1中,Ajax請求被發(fā)到哪里只有執(zhí)行過Javascript腳本才知道。Ajax請求的目的URL可能指向一個新的頁面。如果用靜態(tài)分析的方法來分析頁面,就可能漏掉這個頁面了。在例子2中,<a>標(biāo)簽是在瀏覽器中執(zhí)行Javascript腳本才會產(chǎn)生并顯示給用戶的,如果只是靜態(tài)分析,根本無法在頁面的源碼中找到該標(biāo)簽。
技術(shù)實現(xiàn)要素:
本發(fā)明的主要目的在于克服現(xiàn)有技術(shù)中的不足,提供一種能夠抓取Ajax請求中的URL以及動態(tài)構(gòu)建的DOM節(jié)點中含有的URL的系統(tǒng)。為解決上述技術(shù)問題,本發(fā)明的解決方案是:
提供一種基于瀏覽器內(nèi)核的網(wǎng)絡(luò)爬蟲系統(tǒng),用于進(jìn)行頁面分析并發(fā)現(xiàn)其他頁面的URL,所述基于瀏覽器內(nèi)核的網(wǎng)絡(luò)爬蟲系統(tǒng)包括瀏覽器引擎模塊、網(wǎng)絡(luò)通信模塊、策略模塊;
所述瀏覽器引擎模塊用于接收一個網(wǎng)頁的URL作為輸入,加載該頁面以及對頁面進(jìn)行分析,并動態(tài)執(zhí)行頁面中的腳本;瀏覽器引擎模塊在加載完一個頁面之后,能形成一個DOM樹,DOM樹中的需要通過事件觸發(fā)JS操作的DOM節(jié)點會綁定事件(如點擊、雙擊、鍵盤按鍵等事件);
所述網(wǎng)絡(luò)通信模塊是瀏覽器引擎模塊與網(wǎng)絡(luò)服務(wù)器進(jìn)行交互的模塊,用于發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)包,從而獲取URL;網(wǎng)絡(luò)通信模塊能處理http請求、ftp通信,并抓取瀏覽器引擎模塊發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包,用于通過抓取的網(wǎng)絡(luò)數(shù)據(jù)包來獲取和本頁面有關(guān)的所有其他URL;
所述策略模塊能在瀏覽器引擎模塊一個頁面加載完成后,觸發(fā)頁面中的DOM節(jié)點綁定的事件,用于執(zhí)行頁面中只有通過觸發(fā)才能執(zhí)行到的Javascript代碼。
在本發(fā)明中,所述瀏覽器引擎模塊能采用webkit、blink、Trident或者Gecko實現(xiàn)。
在本發(fā)明中,所述網(wǎng)絡(luò)通信模塊能利用瀏覽器引擎模塊中原有的網(wǎng)絡(luò)通信接口實現(xiàn)(瀏覽器內(nèi)核中包含有發(fā)送接收網(wǎng)絡(luò)數(shù)據(jù)包的接口,可以通過直接修改該接口將需要的URL數(shù)據(jù)以一定格式輸出方便獲取),或者使用HOOK技術(shù)實現(xiàn)。
在本發(fā)明中,所述策略模塊是使用Javascript編寫的腳本文件,用于觸發(fā)DOM事件。
提供所述基于瀏覽器內(nèi)核的網(wǎng)絡(luò)爬蟲系統(tǒng)的使用方法,使用基于瀏覽器內(nèi)核的網(wǎng)絡(luò)爬蟲系統(tǒng)處理一個頁面,具體步驟為:
1)輸入一個初始URL地址給瀏覽器引擎;
2)瀏覽器引擎會加載該URL地址的網(wǎng)頁,并加載該網(wǎng)頁內(nèi)的所有資源,在加載過程中,會發(fā)送一些HTTP請求,這些HTTP請求都會被網(wǎng)絡(luò)通信部分獲得并保存起來;
3)加載完畢之后,逐個觸發(fā)DOM樹中節(jié)點所有綁定的事件,有些事件在觸發(fā)時,會在DOM中增加新的節(jié)點,這部分節(jié)點中綁定了事件的,也要逐個觸發(fā)事件并注意處理不停產(chǎn)生新節(jié)點而導(dǎo)致程序無法結(jié)束的問題;在該過程中,瀏覽器引擎又會發(fā)送一些HTTP請求,這些HTTP請求同樣都會被網(wǎng)絡(luò)通信部分獲得并保存起來;
4)把步驟2)和步驟3)的HTTP請求匯總,根據(jù)需求提取所有或部分HTTP請求的URL部分、Method部分、Body部分等,作為輸出的結(jié)果。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
本發(fā)明使用動態(tài)分析技術(shù),通過內(nèi)置的瀏覽器內(nèi)核,去動態(tài)的加載頁面依賴的資源,并執(zhí)行Javascript腳本,對DOM節(jié)點進(jìn)行動態(tài)的操作如模擬鼠標(biāo)點擊、雙擊、回車等事件,以發(fā)現(xiàn)新的頁面,彌補了傳統(tǒng)爬蟲的不足。
附圖說明
圖1為本發(fā)明的工作示意圖。
具體實施方式
首先需要說明的是,本發(fā)明涉及網(wǎng)頁搜索引擎技術(shù),是計算機技術(shù)在互聯(lián)網(wǎng)技術(shù)領(lǐng)域的一種應(yīng)用。在本發(fā)明的實現(xiàn)過程中,會涉及到多個軟件功能模塊的應(yīng)用。申請人認(rèn)為,如在仔細(xì)閱讀申請文件、準(zhǔn)確理解本發(fā)明的實現(xiàn)原理和發(fā)明目的以后,在結(jié)合現(xiàn)有公知技術(shù)的情況下,本領(lǐng)域技術(shù)人員完全可以運用其掌握的軟件編程技能實現(xiàn)本發(fā)明。前述軟件功能模塊包括但不限于:瀏覽器引擎模塊、網(wǎng)絡(luò)通信模塊、策略模塊等,凡本發(fā)明申請文件提及的均屬此范疇,申請人不再一一列舉。
下面結(jié)合附圖與具體實施方式對本發(fā)明作進(jìn)一步詳細(xì)描述:
如圖1所示的一種基于瀏覽器內(nèi)核的網(wǎng)絡(luò)爬蟲系統(tǒng)包括瀏覽器引擎模塊、網(wǎng)絡(luò)通信模塊、策略模塊,用于進(jìn)行頁面分析并發(fā)現(xiàn)其他頁面的URL。
所述瀏覽器引擎用于接收一個網(wǎng)頁的URL作為輸入,加載該頁面以及對頁面進(jìn)行分析,并動態(tài)執(zhí)行頁面中的腳本,瀏覽器引擎能夠發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包。瀏覽器引擎可以是webkit、blink、Trident、Gecko等,也可以是自己實現(xiàn)的一個瀏覽器引擎。
在程序中集成一個瀏覽器引擎之后,可以自己實現(xiàn)網(wǎng)絡(luò)通信模塊來處理http請求、ftp通信等,這樣就可以在這部分代碼中抓取瀏覽器引擎的所有網(wǎng)絡(luò)數(shù)據(jù)包。如果不自己實現(xiàn)網(wǎng)絡(luò)通信模塊,也可以通過在原有的網(wǎng)絡(luò)通信模塊插入代碼,或者直接調(diào)用瀏覽器引擎的接口來實現(xiàn)抓取網(wǎng)絡(luò)數(shù)據(jù)包的功能。
瀏覽器引擎在加載一個頁面完畢之后,會形成一個DOM樹,DOM樹中的某些節(jié)點會綁定事件(如點擊、雙擊、鍵盤按鍵等事件)。為了讓頁面中的所有的Javascript代碼都執(zhí)行到,需要逐個觸發(fā)DOM樹中節(jié)點綁定的事件。如果一個事件的處理函數(shù)中有發(fā)起Ajax請求的行為,則數(shù)據(jù)包會被網(wǎng)絡(luò)通信模塊抓取到。
使用該基于瀏覽器內(nèi)核的網(wǎng)絡(luò)爬蟲系統(tǒng)處理一個頁面,其具體流程為:
1、輸入一個初始URL地址給瀏覽器引擎。
2、瀏覽器引擎會加載該URL地址的網(wǎng)頁,并加載該網(wǎng)頁內(nèi)的所有資源(如Javascript,CSS,圖片等),在加載過程中,會發(fā)送一些HTTP請求,這些HTTP請求都會被網(wǎng)絡(luò)通信部分獲得并保存起來。
3、加載完畢之后,逐個觸發(fā)DOM樹中節(jié)點所有綁定的事件,有些事件在觸發(fā)時,會在DOM中增加新的節(jié)點,這部分節(jié)點中綁定了事件的,也要逐個觸發(fā)事件并注意處理不停產(chǎn)生新節(jié)點而導(dǎo)致程序無法結(jié)束的問題;在該過程中,瀏覽器引擎又會發(fā)送一些HTTP請求,這些HTTP請求同樣都會被網(wǎng)絡(luò)通信部分獲得并保存起來。
4、爬蟲程序把步驟2和步驟3的HTTP請求匯總,根據(jù)需求提取所有或部分HTTP請求的URL部分、Method部分、Body部分等,作為程序輸出的結(jié)果。
最后,需要注意的是,以上列舉的僅是本發(fā)明的具體實施例。顯然,本發(fā)明不限于以上實施例,還可以有很多變形。本領(lǐng)域的普通技術(shù)人員能從本發(fā)明公開的內(nèi)容中直接導(dǎo)出或聯(lián)想到的所有變形,均應(yīng)認(rèn)為是本發(fā)明的保護(hù)范圍。