在開始講這些問題之前,需要先閱讀完以下文檔:
《優(yōu)化網(wǎng)站的抓取與收錄》 http://www.google.cn/ggblog/googlewebmaster-cn/2009/08/blog-post.html
《谷歌搜索引擎入門指南》第7頁到11頁。 點此下載
《創(chuàng)建方便 Google 處理的網(wǎng)址結構》 http://www.google.com/support/webmasters/bin/answer.py?hl=cnanswer=76329
這些都是google官方的文檔,講述了各種各樣的規(guī)則。這些對百度也是同樣適用的,因為它是針對爬蟲的特性提出來的,并不是只有某個搜索引擎才適用。
看完上面的那些這些規(guī)則,發(fā)現(xiàn)翻來覆去講得都是怎么讓爬蟲能非常順暢的抓取完整個網(wǎng)站。其實絕大部分網(wǎng)站都存在這樣或那樣的問題的,也包括我這個博客,在抓取方面也存在一些問題。但是看在每篇博文都能被收錄的情況下,也就不去優(yōu)化了。但是對于很多收錄還成問題的網(wǎng)站(特別是大中型網(wǎng)站)來說,就要好好規(guī)劃一下了。大家可以用HTTrack抓取semyj這個博客看看,就能發(fā)現(xiàn)為什么我這么說了。(誰能一天之內抓取完這個博客的人請告訴我。)
還是先從搜索引擎的處境講起吧。正如Google在文章中寫道的那樣:
網(wǎng)絡世界極其龐大;每時每刻都在產生新的內容。Google 本身的資源是有限的,當面對幾近無窮無盡的網(wǎng)絡內容的時候,Googlebot 只能找到和抓取其中一定比例的內容。然后,在我們已經抓取到的內容中,我們也只能索引其中的一部分。
URLs 就像網(wǎng)站和搜索引擎抓取工具之間的橋梁: 為了能夠抓取到您網(wǎng)站的內容,抓取工具需要能夠找到并跨越這些橋梁(也就是找到并抓取您的URLs)。
這段話很好的總結了搜索引擎所面臨的處境,那么爬蟲在處理URL的時候會遇到哪些問題呢?
我們先來看重復URL的問題,這里說的重復URL是指同一個網(wǎng)站內的不同頁面,都存在很多完全相同的URL。如:
http://www.semyj.com/archives/1097 和 http://www.semyj.com/archives/1114 這兩個頁面。
![](/d/20211019/239d6f479805488cd1dde33606f4a5e0.gif)
模板部分的URL是一樣的
雖然頁面不同,但是他們公用的部分,URL地址是一樣的??雌饋砣绻煌呐老x抓取到這些頁面的時候,會重復抓取,從而浪費很多不必要的時間。 這確實是一個問題,不過這個問題搜索引擎倒是基本解決好了。實際上,爬蟲的抓取模式不是像我們理解的那樣看到一個網(wǎng)頁就開始抓取一個網(wǎng)頁的。
爬蟲順著一個個的URL在互聯(lián)網(wǎng)上抓取網(wǎng)頁,它一邊下載這個網(wǎng)頁,一邊在提取這個網(wǎng)頁中的鏈接。假設從搜索引擎某一個節(jié)點出來的爬蟲有爬蟲A、爬蟲B、爬蟲C,當它們到達semyj這個網(wǎng)站的時候,每個爬蟲都會抓取到很多URL,然后他們都會把那個頁面上所有的鏈接都放在一個公用的“待抓取列表”里。(可以用lynx在線版模擬一下爬蟲提取鏈接。)
![](/d/20211019/9003a49422f9fd8754783e555299f244.gif)
待抓取列表
這樣一來,在“待抓取列表”里,那些重復的URL就可以被去重了。這是一個節(jié)點在一種理想狀態(tài)下的情況,不過實際上因為搜索引擎以后還要更新這個網(wǎng)頁等等一些原因,一個網(wǎng)站每天還是有很多重復抓取。所以在以前的文章中,我告訴大家用一些方法減少重復抓取的幾率。
這里有一個問題,很多人肯定想問是不是一個網(wǎng)頁上所有的鏈接搜索引擎都會提取的,答案是肯定的。但是在《google網(wǎng)站質量指南》中,有這樣一句:“如果站點地圖上的鏈接超過 100 個,則需要將站點地圖拆分為多個網(wǎng)頁。”有些人把這句話理解為:“爬蟲只能抓取前100個鏈接”,這是不對的。
因為在“待抓取列表”里的URL,爬蟲并不會每一個鏈接都會抓取的。 鏈接放在這個列表里是沒問題的,但是爬蟲沒有那么多時間也沒必要每個鏈接都要去抓取,需要有一定的優(yōu)先級。在“待訪問列表”里,爬蟲一邊按照優(yōu)先級抓取一部分的URL,一邊把還未被抓取的URL記錄下來等待下次抓取,只是這些還未被抓取的URL,下次爬蟲來訪問的頻率就每個網(wǎng)站都不一樣了, 每一類URL被訪問的頻率也不一樣。
![](/d/20211019/3366b845897cb48d08549324baca9756.gif)
按優(yōu)先級抓取
那么在“待抓取列表”里的URL,哪些是能被優(yōu)先抓取,哪些是被次要抓取的呢?
我們稍微思考一下都能明白這個抓取的優(yōu)先級策略應該怎么定。首先,那些目錄層級比較深的URL是次要抓取的;那些在模板部分的或重復率非常高的URL是被次要抓取的;那些動態(tài)參數(shù)多的URL是次要抓取的…。.
這么做的原因,就是因為搜索引擎的資源是有限的,一個網(wǎng)站實際擁有的內容也是有限的,但是URL數(shù)量是無限的。爬蟲需要一些“蛛絲馬跡”來確定哪些值得優(yōu)先抓取,哪些不值得。
在《谷歌搜索引擎入門指南》中,google建議要優(yōu)化好網(wǎng)站的URL結構,如建議不要用“…/dir1/dir2/dir3/dir4/dir5/dir6/page.html”這樣的多層嵌套。就是因為在待抓取列表里,在其他條件相同的情況下,爬蟲會優(yōu)先抓取目錄層級淺的URL。如用Lynx在線版查看本網(wǎng)站的頁面:
![](/d/20211019/e5cb197ed94d89613f48bb47f03ab498.gif)
抓取優(yōu)先級
如果說,在這17個鏈接里,爬蟲只能選幾個鏈接抓取的話,紅色箭頭所指的鏈接在其他條件相同的情況下是要優(yōu)先的。
但是這里又有一個誤區(qū),有人在SEO過程中,把所有的網(wǎng)頁都建立在根目錄下,以為這樣能有排名的優(yōu)勢。這樣也是沒有理解這個原因。而且爬蟲在這個網(wǎng)站上先抓取哪些URL后抓取哪些URL,都是自己的URL和自己的URL比,如果所有網(wǎng)頁都是在同一個目錄下,那就沒有區(qū)別了。
最好的規(guī)劃URL目錄層級的方式,就是按照業(yè)務方的邏輯來規(guī)劃,從內容上應該是什么從屬關系就怎么規(guī)劃URL就是。就像《谷歌搜索引擎入門指南》中舉的那些例子一樣。
(順帶說一下。我經??吹?,一個網(wǎng)站中,很多人非SEO的人員,如工程師和網(wǎng)頁設計人員或者網(wǎng)站編輯,都以為SEO和他們做的事情是相反的。這都是因為長期以來一些SEOer經常提交很多明顯違反用戶體驗的SEO需求給他們,造成他們以為SEO就是和他們做的事情是有沖突的。實際上,SEO和別的部門有非常少的沖突,只要你能用科學的方法去實踐,就能發(fā)現(xiàn)以前有太多誤導人的觀點了。還有,對于其他部門的專業(yè)人員,他們專業(yè)領域的意見非常值得去考慮。)
爬蟲有一個特點,就是它不能實時的比較它正在抓取的內容是不是重復的內容。因為如果要做到實時的比較,那它至少要把正在抓取的頁面和那些已經在索引庫的頁面做對比,這是不可能短時間內可以完成的。 前面把所有URL統(tǒng)一放到一個待抓取列表中的方法只能避免那種URL完全一模一樣的重復抓取,但是無法應對URL不一樣、但是內容一樣的抓取。
正如所有搜索引擎都強調的那樣,動態(tài)參數(shù)是一個經常產生URL不一樣、但是內容一樣的現(xiàn)象的原因。所以搜索引擎建議大家用靜態(tài)化的方法去掉那些參數(shù)。靜態(tài)化的本質是URL唯一化,在《優(yōu)化網(wǎng)站的抓取與收錄》這篇文章中,曾經用的“一人一票”這個描述就很貼切的表達了這個意思。靜態(tài)化只是一個手段而不是目的,為了保證URL的唯一化,可以把URL靜態(tài)化、也可以用robots.txt或nofollow屏蔽動態(tài)內容、可以用rel=canonical屬性、還可以在webmaster tool里屏蔽一些參數(shù)等等。
而靜態(tài)化也會有好的靜態(tài)化和不好的靜態(tài)化之別。我們這里不說那種把多個參數(shù)直接靜態(tài)化了的案例,而是單純來看看如下兩個URL:
http://www.semyj.com/archives/1097和 http://www.semyj.com?p=1097
這兩個URL中,這個靜態(tài)化的是不是就比動態(tài)的好呢? 實際上這兩個URL的差別很小。首先這兩種URL搜索引擎都能收錄,如果說動態(tài)URL“?p=1097”可能產生大量重復的內容讓爬蟲抓取,那這個靜態(tài)的URL“archives/1097”也不能保證不會產生大量重復的內容。特別是爬蟲在抓取時碰到大量有ID的靜態(tài)的URL時,爬蟲無法判斷這個網(wǎng)站是不是把session ID等參數(shù)靜態(tài)化了才造成的,還是這個網(wǎng)站本來就有這么多內容。 所以更好的靜態(tài)化是這樣的:
http://www.semyj.com/archives/seo-jingli
這種URL就能保證唯一化而不會和其他情況混淆了,所以URL中要盡量用有意義的字符。這不是因為要在URL增加關鍵詞密度而這么做的,是為了方便搜索引擎抓取。
以上是因為爬蟲固有的特點造成的抓取障礙,而有時網(wǎng)站的結構也能造成爬蟲的抓取障礙。這種結構在《優(yōu)化網(wǎng)站的抓取與收錄》一文中用的名字是“無限空間”。文中舉了一個日歷的例子:如很多博客上都會有一個日歷,順著這個日歷的日期一直往下點,永遠都有鏈接供你點擊的,因為時間是無限的。
其實還有更多的“無限空間”的例子,只是“無限空間”這個名詞沒怎么翻譯好,翻譯做“無限循環(huán)”就容易理解多了。 舉一個例子:
京東商城筆記本分類頁面: http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-1.html
![](/d/20211019/b2453db0398551b840fa9e1b2b1ee514.gif)
篩選條件
當點擊“惠普”+“11英寸”這2個條件后能出來一個頁面,點擊“聯(lián)想”+“14英寸”+“獨立顯卡”也能出來一個頁面。那總共能出來的頁面有多少呢?
這個頁面中,品牌有18個分類、價格9個分類、尺寸7個分類、平臺3個分類、顯卡2個分類。 那么可以組合成的URL個數(shù)為:
按1個條件篩選: 18+9+7+3+2 = 39 。
按2個條件篩選:18×9+18×7+18×3+18×2+9×7+9×3+9×2+7×3+7×2+3×2=527 。
按3個條件篩選:18×9×7+18×9×3+18×9×2+18×7×3+18×7×2+18×3×2+9×7×3+9×7×2+9×3×2+7×3×2=3093。
按4個條件篩選:18×9×7×3+18×9×7×2+18×7×3×2+18×9×3×2+9×7×3×2=7776。
按5個條件篩選:18×9×7×3×2=6804。
總共可以組合出的URL數(shù)量為:39+527+3093+7776+6804=18239 個。
筆記本分類里總共才 624個商品,要放在18239個頁面中,而有的頁面,一個頁面就能放32個產品。勢必造成大量的頁面是沒有商品的。如點擊這幾個篩選條件后,就沒有匹配的商品出來了:
![](/d/20211019/9c4400ce11210a4d5ba1a82103034f14.gif)
無結果
這樣的結果,就是造成大量重復的內容以及消耗爬蟲很多不必要的時間,這也可以認為是“無限空間”。 這類情況非常常見。如
![](/d/20211019/fa08ee20e41e97583097e7e5dd0ea8c2.gif)
某房產網(wǎng)的無限空間
上面舉的京東商城的例子還是不怎么嚴重的,有的網(wǎng)站能組合出幾億甚至無窮無盡個URL出來。我在國內和國外看過那么多同類的網(wǎng)站,居然發(fā)現(xiàn)迄今為止只有兩家網(wǎng)站注意到了這個問題。究其原因,還是因為很多SEO人員不太重視數(shù)據(jù),這種問題稍微分析爬蟲的日志就可以看出來的。直到現(xiàn)在,還有一些SEOer認為把這些以前是動態(tài)的頁面靜態(tài)化是個有積極意義的事情,沒看到不好的一面就是這樣的動作制造出了大量重復的頁面,向來就是一個在SEO方面不好的改動。
文章來源:http://www.semyj.com/archives/1136