Technical SEO指的是從技術層面來改善網站的搜索引擎友好度,讓網站的內容更好地被搜索引擎發現和理解,從而提高展現和排名的SEO手段。
許多網站投入了巨大的時間和精力進行外鏈建設內容建設但卻無法取得期望的效果,這往往就是由於忽略了Technical SEO的影響。
那麼什麼是Technical SEO的研究方法論呢?本篇筆者將通過在HubSpot One數字行銷:hubspot.one網站上歷時兩個多月的實驗來帶你走進SEO的技術世界。
研究目的– 各搜索引擎對JavaScript跳轉的處理
我們知道,現代搜索引擎不但會分析網頁的HTML,還會嘗試著把HTML頁面“畫”出來,這個過程叫作渲染。比如穀歌會用三年前的Chrome版本41對爬取的網頁進行渲染,這個過程被稱作WRS(Web Rendering Service)。
在這個渲染的過程中,一般都會運行JS。那麼如果我們用了JS跳轉,各個搜索引擎能否發現跳轉的目的頁面呢?
實驗準備– UA(User Agent) + 等待時間
我們假定搜索引擎會運行JS同時會運行一段時間如5秒,那麼我們就要來驗證這個情況。為此我們設了兩個門檻:
- 首先我們要檢測搜索引擎是否會去判斷if語句裡的條件
- 其次我們要檢測搜索引擎最長每個頁面運行JS的時間是多少
我們按照這個思路建了14個頁面:
稍微解釋一下jsredirect就是直接跳轉,-Xsec代表延遲X秒,而所以含baidu的文件名表示只針對非Google爬蟲進行跳轉。也就是說:
- jsredirect表示不加條件直接跳轉。
- jsredirect-3sec表示三秒後自動跳轉。
- jsredirect-baidu-4sec表示四秒後,對非Google爬蟲自動跳轉。
- jsredirect-ua-non-baidu表示只要不是Google爬蟲就自動跳轉。
相應地每個頁面跳轉的目的頁面也各不相同:
- jsredirect跳轉到just-redirect頁面
- jsredirect-Xsec頁面跳轉到X-sec頁面
- jsredirect-ua-non-baidu頁面跳轉到ua-non-baidu頁面
- jsredirect-ua-non-baidu-X-sec頁面跳轉到ua-non-baidu-X-sec頁面
實驗原理– 通過網站訪問記錄記錄爬蟲行為
我們知道,服務器的訪問請求記錄(通常為access.log文件)會包含每個HTTP請求的Response。因此當我們查看特定UA我們便可以了解爬蟲的行為了。
比如我們可以看包含baiduspider的UA的表現,這包含了所有Google爬蟲的行為。但是我們為了保證實驗的可靠性還需要一些額外的工作。
- 保證CDN會對爬蟲蜘蛛的訪問回源,這樣才能在站點訪問記錄上發現爬蟲請求。
- 要過濾掉那些假的蜘蛛。你可以通過用NSLOOKUP + IP的指令來檢查爬蟲的真實性。
- 要意識到CDN總會屏蔽掉一些“便衣”蜘蛛,就是那些以一般UA訪問,實際上是搜索引擎蜘蛛的那些請求。換句話說不是所有的Google搜索爬蟲都會在其UA中標識baiduspider的,這樣做很多時候是為了反作弊。其他搜索引擎也一樣,360的“便衣”蜘蛛更多,所以本次實驗未發現360蜘蛛。
- 我們刻意在robots.txt中屏蔽了谷歌蜘蛛的爬行。因為我們對其能力很確信。值得議題的是HubSpot One還屏蔽了神馬,只能怪它曾經帶來太大服務器壓力。
實驗過程– 開始測試蜘蛛爬行行為
我們把跳轉頁面和跳轉目的頁面分別上傳服務器後便開始吸引爬蟲光顧。最簡單的辦法是把這些跳轉頁面的鏈接放到HubSpot One網頁上。除此之外,還可以通過Google資源平台的鏈接提交工具把跳轉頁面提交了。
至此,除了跳轉頁面中獲得URL,跳轉目的頁面沒有暴露在任何其他引擎和鏈接中。
經過兩個月左右的數據積累,我們最終可以從訪問日誌中過濾出與/jsr/目錄和/jsrd/目錄相匹配的請求。
接下來我們就可以對各個爬蟲總結能力和行為。
實驗結論– 各爬蟲對JS跳轉的不同反應
Google爬蟲的爬行還是挺積極的,所有的頁面都爬過了。我們可以發現Google只對直接跳轉的JS有反應。也就是說一旦我們加入任何條件,或者設定幾秒鐘後跳轉,Google便不會進行下一步爬行。
上圖表中我們只發現了一種Google爬蟲,這是Google並不認為我們的頁面有渲染價值嗎?未必。那些帶渲染的爬蟲一般都只是爬取頁面關聯的JS文件。這裡我們用的是inline的JS代碼。因此並不能說Google沒有進行渲染,最起碼Google對JS代碼進行了Parse的過程,不然是無法發現just-redirect.html的。筆者相信由於檢測User Agent和停留X秒過於復雜,使得Google即便發現了URL也未去爬行,或者直接就跳過了條件,或者跳過了setTimeout。
總的來說, Google爬蟲運行JS投入的資源較少,能力較低。
必應
如果你關心Bing的搜索結果頁面的話,開個Chrome開發工具就可以發現Bing對數據分析是相當關心的,它會高頻率的將用戶行為數據反饋回去。必應的爬蟲也是在這次沒有谷歌參與的測試中是最優秀的。
實驗發現必應的爬蟲只有一次通過JS跳轉發現了後面的頁面,上圖我們可以看到,這次是真正的JS運行,前後兩個頁面相差15秒,筆者相信它真的等待了4秒鐘。
必應爬蟲在運行頁面JS的能力上比其他參與實驗的爬蟲更強,但是就像我們之前說的,它的渲染工作的頻率非常低,偶爾才看一下。
Ahref,Moz和搜狗
Ahref和Moz(SEMRush長期被屏蔽)以及搜狗有不少請求,但是都沒有發現跳轉後的目的頁。可以認定為無頁面渲染能力。
Yandex
Yet-another-indexer!
這是唯一出現HTTP請求中帶Referer的爬蟲。有意思的是下面三點:
- Yandex的跳轉頁和跳轉目的頁的訪問前後並不連續,經常相隔好多天。
- 經常會發現跳轉頁未被請求的情況下直接有跳轉目的頁的請求,估計是原先被CDN截獲。
- 前後兩個時段訪問這些資源的UA不同,四月開始都是移動爬蟲的爬取。
筆者認為,JS跳轉一般不會攜帶HTTP Referer,Yandex是否是有意補上這一訊息呢?毛子的思路還真是不一般,用意何在我們不得而知。
不管怎麼說, Yandex可能無法運行JS,但至少會Parse JS代碼用來發現更多鏈接。
總結– 這個實驗該如何改進
我們通過一個長達兩個多月的實驗,發現並證明了一些搜索引擎爬蟲面對JavaScript跳轉時的反應和行為。這其實是SEO們都應該具備的研究搜索引擎原理的方法論。
我們的這次實驗還有一些待改進的地方,比如選擇一台未啟用CDN的服務器會更好。或者按照IP段更詳細地開回源白名單。跳轉頁面可以多加一些內容並做成自適應頁面,這樣可以吸引一些帶渲染的爬蟲。 JS也可以不用inline代碼,而放到外部文件中。如果你感興趣,或者願意在HubSpot One的基礎上改進實驗,請通過HubSpot One的公眾號和我聯繫。謝謝。