javascript|搜尋引擎|頁面
在製作搜尋引擎的時候、或者做頁面分析及資料提取的時候,經常面臨頁面中存在許多javascript,而頁面內容,相當一部分寫入到了這些js指令碼的命令中,而導致正常的DOM分析失敗,無法提取所需的資訊。 當然,如果這個頁面模板確定,針對這個頁面製作資訊提模數板也不很難,每個頁面人工的分析出需要提取的資訊的位置,然後製作模板。可是對於general的網頁搜尋的話,這就不大現實了。正巧前兩天和朋友討論到這個問題,有些想法。在這裡,提供兩個思路,供大家參考。 1、做一個簡化的 javascript 解譯器,執行指令碼片段 做一個完整的 javascript 解譯器是比較難得,但是做一個簡化的 javascript 解譯器則很容易。我們不需要那些複雜的庫,我們只將基本的 javascript 文法實現,並且將涉及文字輸出的函數部分實現就可以了。 這樣做的目的並不是要真正的完整執行這個javascript,而是將指令碼中的字串,按照其程式邏輯進行組合,最後輸出這個指令碼的完整輸出。這樣自然不全面,肯定由於很多功能沒實現,導致輸出的字串和真實的輸出不完全一樣。但是,如果不出意外,
在製作搜尋引擎的時候、或者做頁面分析及資料提取的時候,經常面臨頁面中存在許多javascript,這些javascript 比較煩人,因為有相當部分頁面內容寫入到了這些js指令碼的命令中,而導致正常的DOM分析看不到這些文字,而使其中的文字資料提取失敗。
當然,如果這個頁面模板確定,針對這個特定的頁面製作資訊提模數板也不很難,每個頁面人工的分析出需要提取的資訊的位置,然後製作模板。可是對於general的網頁搜尋的話,這就不大現實了。正巧前兩天和朋友討論到這個問題,有些想法。在這裡,提供兩個思路,供大家參考。
1、做一個簡化的 javascript 解譯器,執行指令碼片段
做一個完整的 javascript 解譯器是比較難得,但是做一個簡化的 javascript 解譯器則很容易。我們不需要那些複雜的庫,我們只將基本的 javascript 文法實現,並且將涉及文字輸出的函數部分實現就可以了。
這樣做的目的並不是要真正的完整執行這個javascript,而是將指令碼中的字串,按照其程式邏輯進行組合,最後輸出這個指令碼的完整輸出。這樣自然不全面,肯定由於很多功能沒實現,導致輸出的字串和真實的輸出不完全一樣。但是,如果不出意外,應該不會產生太多的遺漏。因為所有的字串輸出部分我們都實現了,那麼完全可以將這些字串按照其將要輸出的邏輯組合在一起。
對於根據動態條件做動態事情的問題,如果這些條件無法確定,比如根據瀏覽器類型或者什麼的。完全可以將兩個分支的結果都輸出。當然,我們不應該將這兩塊文字組合,中間應該有我們理解的分割符。
這樣做得好處是高效能。這個解譯器可以做得很小巧,由於並非完整執行js,所以效能也較之迅速一些。缺點是由於是簡化的解譯器,因此和真實的結果會有差異。但是一般來說,資訊只會多而不會少,(因為同時輸出了不同分支的結果),所以,對於搜尋引擎的頁面分析來說,差不多是夠用了。
2、用HTML渲染引擎完整的解析頁面,最後從顯示結果中取資料
採用Gecko (Firefox) 或者Trident (mshtml.dll) (IE) 這些用於瀏覽器的 HTML 渲染引擎來對頁面進行完整的解析和渲染。最後對這些引擎的解析結果進行分析。
這樣做得好處是和顯示結果最接近,因為他們是頁面的真實解析結果。但是缺點是效能相對較差,因為是對頁面的所有元素的完整解析,所以做了很多與提取文字資訊無用的勞動,如果分析大資料量的頁面的時候,需要權衡一下。