長期以來站長們選擇使用JavaScript來實現網頁的動態行為這樣做的原因是多種多樣的如加快頁面的響應速度降低網站流量隱藏鏈接或 者嵌入廣告等由於早期的搜索引擎沒有相應的處理能力導致在索引這類網頁上往往出現問題可能無法收錄有價值的資源也可能出現作弊
引入JavaScript解析的目的正是為了解決上述兩方面的問題其結果也就是使搜索引擎可以更為清晰的了解用戶實際打開該網頁時看到的效果 比如有些網站會將用戶評論評分等信息從網頁HTML中抽離利用JavaScript甚至AJAX等方法在頁面被打開的時候動態顯示出來早期的搜索引 擎此時能處理到的頁面內容就是缺失的由此會進一步影響對該頁面索引價值的判斷
要引入JavaScript解析需要考慮本身的設計與實現解析速度和對系統其它方面影響等因素本文通過一些典型的案例來分析如何設計並實現一套網頁JavaScript解析系統並簡要介紹這樣的系統對於搜索引擎其它部分的作用和影響
一發現頁面鏈接
一般來說頁面鏈接都是以HTML中的A標簽形式存在鏈接URL標記在href屬性中但實際存在著一些網站會選擇更為“動態”的方式較為常見的方式有兩種一種是動態寫入或調整A標簽另一種是在用戶點擊的時候觸發事件改變默認的鏈接打開方式
動態寫入或調整鏈接標簽
抽象的說網頁要實現這樣的效果乃至後文描述的其它效果與把大象放入冰箱極為類似分為三步找到要寫入/修改的目標(找到大象)准備好要寫入/修改的內容(打開冰箱門)執行寫入/修改(把它放進去)
這三步操作映射到JavaScript上就是先後調用三組標准的浏覽器功能函數頁面元素定位數據准備以及頁面修改那麼JavaScript解析的工作就是同樣提供出這樣的函數隨著被站長的JavaScript代碼調用自然的發現相應的內容和行為
分析至此所需實現的函數也就基本確定了其中較為簡單的包括
documentgetElementById // 定位
documentgetElementsByTagName // 定位
documentgetElementsByClassName // 定位
node[firstChild/nextSibling/previousSibling/parentNode] // 定位
document[createElement/createTextNode] // 創建鏈接
node[appendChild/insertBefore/innerHTML=?] // 寫入內容
elementgetAttribute elementsetAttribute // 設置屬性
elementhref = ? // 設置屬性
至於要寫入的內容可能是以數組等形式保存在JavaScript種也可能是使用AJAX動態加載前者屬於JavaScript語言的內置功能此處不再復述後者是一個單獨的話題會在後文專門討論
點擊時觸發事件改變默認的鏈接打開方式
頁面這樣做的原因不一有的是為了隱藏鏈接有的是為了實現彈出窗口有的則是為了程序拼接URL還有的是做檢查看是否應該打開鏈接等等但所有這些原因都對應著同樣的實現方法添加click事件
添加click事件的方法有三種
將A標簽的href屬性設置為“javascript:func(…)”的形式
設置A標簽的onclick屬性設置為onclick=”js_code” 的形式
調用事件綁定函數如my_link_nodeaddEventListener(click func false)
支持這三種方法本身是較為簡單的需要注意的地方在於如何觸發這樣的click事件以及如何在觸發之後截獲目的URL
對於觸發事件而言首先需要收集到所有可能的click事件而後再依次觸發但對於每一個要觸發的click而言實際觸發之前必須先檢查其是否還存在這是由於在其之前的click事件很可能已經把當前這個click刪除掉了
要做到截獲URL首先要實現相關的頁面跳轉函數既locationhref = ?windowopen等而後通過設置一系列標志將本次點擊和頁面跳轉關連起來如此也就得到了目標URL
二動態頁面內容
頁面動態內容是一種提升頁面加載速度增強網站技術靈活性的手段可以將那些會改變的內容(如評論評分等)抽離使頁面分為靜態和動態兩部分靜態內容可以使用緩存等方法加快頁面顯示速度降低網站流量動態內容則有格式簡單好生成的優勢同時也能節省流量
另一方面動態內容也是加載廣告和內容作弊的重要方法最常見的就是寫入iframe這對於早期搜索引擎而言有極大的隱蔽性
在技術層次上動態頁面內容所需要的工作與上一節“動態寫入或調整A標簽”在很大程度上是相同的這裡需要增加的是經典的“documentwrite”方法
該方法是最早的JavaScript功能之一用於向頁面直接寫入一段HTML代碼至今仍在廣泛使用對於該方法早期的搜索引擎都有所支持但 方法基本限於字符匹配僅能支持最直接的寫入一個JavaScript字符串的方式對於稍微復雜的文本拼接顯得無能為力但對於JavaScript解 析而言這段代碼終究是要符合語言規范的因此就能做到完整支持處理文本拼接條件判斷和混淆代碼等各種情況
這裡還需要討論的一點是嵌套的documentwrite也就是通過documentwrite寫入一個SCRIPT標簽該標簽內部是另一 段documentwrite這類問題在跳轉作弊頁面中屢見不鮮對其支持就不只需要JavaScript解析還需要HTML解析器能夠支持處理嵌 套的HTML寫入功能這裡就不加以分析了
通過上述方法無論是網頁的主體信息還是廣告或其它輔助信息都會被暴露出來從而更好的理解站長意圖
三網頁跳轉
網頁跳轉在有些情況下是達到頁面效果的必要選擇但同樣會用於作弊在技術上多以下面兩種方式出現
直接調用頁面跳轉函數
針對搜索引擎的UAreferer等調用頁面跳轉函數
這裡要實現識別最核心的就是實現頁面跳轉函數location對象由於這是技術上唯一的JavaScript跳轉函數所以無論頁面的JavaScript如何撰寫如何混淆最終都會調用該函數因此盡管不同頁面的跳轉代碼看上去五花八門但識別出來卻是簡單的
四關於AJAX
AJAX是極為常見的網頁技術根本上說就是在網頁顯示期間動態的從互聯網上獲取一段數據(可能是HTML也可能是其它)經過處理後加以顯示
對於該技術根本的工作並不在於XMLHttpRequest對象的實現而是在於對搜索引擎爬蟲架構的影響眾所周知爬蟲抓取頁面遍歷其鏈 接再依次抓取的形式設計的其工作主要集中在調度和控制抓取壓力上抓取器本身較為簡單通常不具備抓取後即時執行JavaScript並抓取AJAX 數據的能力因此需要技術升級方可支持AJAX
對抓取器的分析超出了本文的范圍有興趣的讀者可以查看其它相關文獻
總結
通過前面的案例分析我們總結出了實現JavaScript解析所需要的基本工作此外再增加一定的基礎性建設就能構成一套較為完整的系統了這裡我們再次整理一下將其分為三個部分
在HTML解析器中嵌入JavaScript語言引擎語言引擎可以選擇VSpiderMonkey等成熟的開源方案
實現所需的功能函數具體可參考WC的相關HTML和DOM規范
作為一個直接推論需要收錄所謂的js文件這是JavaScript解析所需要“解析”的源代碼
本文中介紹的功能僅是一部分較為常見的JavaScript功能要讓搜素引擎真正看到實際的頁面還需要進一步實現其它需要的功能此外還需要配合對HTMLCSS圖片等資源的支持
最後對於希望使用JavaScript的站長來說本文給出如下建議
不要使用過於復雜的JavaScript技術這不利於搜索引擎的收錄
不要阻止對js文件的收錄否則會限制JavaScript解析的能力
合理的劃分站點的靜態部分和動態部分
by Lileding
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20565.html