作者:韋瑋
如需轉載請聯絡大資料(ID:hzdashuju)
01 網路爬蟲實現原理詳解
不同型別的網路爬蟲,其實現原理也是不同的,但這些實現原理中,會存在很多共性。在此,我們將以兩種典型的網路爬蟲為例(即通用網路爬蟲和聚焦網路爬蟲),分別為大家講解網路爬蟲的實現原理。
1. 通用網路爬蟲
首先我們來看通用網路爬蟲的實現原理。通用網路爬蟲的實現原理及過程可以簡要概括如下(見圖3-1)。
▲圖3-1 通用網路爬蟲的實現原理及過程
-
獲取初始的URL。初始的URL地址可以由使用者人為地指定,也可以由使用者指定的某個或某幾個初始爬取網頁決定。
-
根據初始的URL爬取頁面並獲得新的URL。獲得初始的URL地址之後,首先需要爬取對應URL地址中的網頁,爬取了對應的URL地址中的網頁後,將網頁儲存到原始資料庫中,並且在爬取網頁的同時,發現新的URL地址,同時將已爬取的URL地址存放到一個URL串列中,用於去重及判斷爬取的行程。
-
將新的URL放到URL佇列中。在第2步中,獲取了下一個新的URL地址之後,會將新的URL地址放到URL佇列中。
-
從URL佇列中讀取新的URL,並依據新的URL爬取網頁,同時從新網頁中獲取新URL,並重覆上述的爬取過程。
-
滿足爬蟲系統設定的停止條件時,停止爬取。在編寫爬蟲的時候,一般會設定相應的停止條件。如果沒有設定停止條件,爬蟲則會一直爬取下去,一直到無法獲取新的URL地址為止,若設定了停止條件,爬蟲則會在停止條件滿足時停止爬取。
以上就是通用網路爬蟲的實現過程與基本原理,接下來,我們為大家分析聚焦網路爬蟲的基本原理及其實現過程。
2. 聚焦網路爬蟲
聚焦網路爬蟲,由於其需要有目的地進行爬取,所以對於通用網路爬蟲來說,必須要增加標的的定義和過濾機制,具體來說,此時,其執行原理和過程需要比通用網路爬蟲多出三步,即標的的定義、無關連結的過濾、下一步要爬取的URL地址的選取等,如圖3-2所示。
▲圖3-2 聚焦網路爬蟲的基本原理及其實現過程
-
對爬取標的的定義和描述。在聚焦網路爬蟲中,我們首先要依據爬取需求定義好該聚焦網路爬蟲爬取的標的,以及進行相關的描述。
-
獲取初始的URL。
-
根據初始的URL爬取頁面,並獲得新的URL。
-
從新的URL中過濾掉與爬取標的無關的連結。因為聚焦網路爬蟲對網頁的爬取是有目的性的,所以與標的無關的網頁將會被過濾掉。同時,也需要將已爬取的URL地址存放到一個URL串列中,用於去重和判斷爬取的行程。
-
將過濾後的連結放到URL佇列中。
-
從URL佇列中,根據搜尋演演算法,確定URL的優先順序,並確定下一步要爬取的URL地址。在通用網路爬蟲中,下一步爬取哪些URL地址,是不太重要的,但是在聚焦網路爬蟲中,由於其具有目的性,故而下一步爬取哪些URL地址相對來說是比較重要的。對於聚焦網路爬蟲來說,不同的爬取順序,可能導致爬蟲的執行效率不同,所以,我們需要依據搜尋策略來確定下一步需要爬取哪些URL地址。
-
從下一步要爬取的URL地址中,讀取新的URL,然後依據新的URL地址爬取網頁,並重覆上述爬取過程。
-
滿足系統中設定的停止條件時,或無法獲取新的URL地址時,停止爬行。
現在我們初步掌握了網路爬蟲的實現原理以及相應的工作流程,下麵來瞭解網路爬蟲的爬行策略。
02 爬行策略
在網路爬蟲爬取的過程,在待爬取的URL串列中,可能有很多URL地址,那麼這些URL地址,爬蟲應該先爬取哪個,後爬取哪個呢?
在通用網路爬蟲中,雖然爬取的順序並不是那麼重要,但是在其他很多爬蟲中,比如聚焦網路爬蟲中,爬取的順序非常重要,而爬取的順序,一般由爬行策略決定。我們將為大家介紹一些常見的爬行策略。
爬行策略主要有深度優先爬行策略、廣度優先爬行策略、大站優先策略、反鏈策略、其他爬行策略等。下麵我們將分別進行介紹。
如圖3-3所示,假設有一個網站,ABCDEFG分別為站點下的網頁,圖中箭頭表示網頁的層次結構。
▲圖3-3 某網站的網頁層次結構示意圖
假如此時網頁ABCDEFG都在爬行佇列中,那麼按照不同的爬行策略,其爬取的順序是不同的。
比如,如果按照深度優先爬行策略去爬取的話,那麼此時會首先爬取一個網頁,然後將這個網頁的下層連結依次深入爬取完再傳回上一層進行爬取。
所以,若按深度優先爬行策略,圖3-3中的爬行順序可以是:A → D → E → B → C → F → G。
如果按照廣度優先的爬行策略去爬取的話,那麼此時首先會爬取同一層次的網頁,將同一層次的網頁全部爬取完後,在選擇下一個層次的網頁去爬行,比如,上述的網站中,如果按照廣度優先的爬行策略去爬取的話,爬行順序可以是:A→B→C→D→E→F→G。
除了以上兩種爬行策略之外,我們還可以採用大站爬行策略。我們可以按對應網頁所屬的站點進行歸類,如果某個網站的網頁數量多,那麼我們則將其稱為大站,按照這種策略,網頁數量越多的網站越大,然後,優先爬取大站中的網頁URL地址。
一個網頁的反向連結數,指的是該網頁被其他網頁指向的次數,這個次數在一定程度上代表著該網頁被其他網頁的推薦次數。所以,如果按反鏈策略去爬行的話,那麼哪個網頁的反鏈數量越多,則哪個網頁將被優先爬取。
但是,在實際情況中,如果單純按反鏈策略去決定一個網頁的優先程度的話,那麼可能會出現大量的作弊情況。比如,做一些垃圾站群,並將這些網站互相連結,如果這樣的話,每個站點都將獲得較高的反鏈,從而達到作弊的目的。
作為爬蟲專案方,我們當然不希望受到這種作弊行為的幹擾,所以,如果採用反向連結策略去爬取的話,一般會考慮可靠的反鏈數。
除了以上這些爬行策略,在實際中還有很多其他的爬行策略,比如OPIC策略、Partial PageRank策略等。
03 網頁更新策略
一個網站的網頁經常會更新,作為爬蟲方,在網頁更新後,我們則需要對這些網頁進行重新爬取,那麼什麼時候去爬取合適呢?如果網站更新過慢,而爬蟲爬取得過於頻繁,則必然會增加爬蟲及網站伺服器的壓力,若網站更新較快,但是爬蟲爬取的時間間隔較長,則我們爬取的內容版本會過老,不利於新內容的爬取。
顯然,網站的更新頻率與爬蟲訪問網站的頻率越接近,則效果越好,當然,爬蟲伺服器資源有限的時候,此時爬蟲也需要根據對應策略,讓不同的網頁具有不同的更新優先順序,優先順序高的網頁更新,將獲得較快的爬取響應。
具體來說,常見的網頁更新策略主要有3種:使用者體驗策略、歷史資料策略、聚類分析策略等,以下我們將分別進行講解。
在搜尋引擎查詢某個關鍵詞的時候,會出現一個排名結果,在排名結果中,通常會有大量的網頁,但是,大部分使用者都只會關註排名靠前的網頁,所以,在爬蟲伺服器資源有限的情況下,爬蟲會優先更新排名結果靠前的網頁。
這種更新策略,我們稱之為使用者體驗策略,那麼在這種策略中,爬蟲到底何時去爬取這些排名結果靠前的網頁呢?此時,爬取中會保留對應網頁的多個歷史版本,併進行對應分析,依據這多個歷史版本的內容更新、搜尋質量影響、使用者體驗等資訊,來確定對這些網頁的爬取週期。
除此之外,我們還可以使用歷史資料策略來確定對網頁更新爬取的週期。比如,我們可以依據某一個網頁的歷史更新資料,透過泊松過程進行建模等手段,預測該網頁下一次更新的時間,從而確定下一次對該網頁爬取的時間,即確定更新週期。
以上兩種策略,都需要歷史資料作為依據。有的時候,若一個網頁為新網頁,則不會有對應的歷史資料,並且,如果要依據歷史資料進行分析,則需要爬蟲伺服器儲存對應網頁的歷史版本資訊,這無疑給爬蟲伺服器帶來了更多的壓力和負擔。
如果想要解決這些問題,則需要採取新的更新策略。比較常用的是聚類分析策略。那麼什麼是聚類分析策略呢?
在生活中,相信大家對分類已經非常熟悉,比如我們去商場,商場中的商品一般都分好類了,方便顧客去選購相應的商品,此時,商品分類的類別是固定的,是已經擬定好的。
但是,假如商品的數量巨大,事先無法對其進行分類,或者說,根本不知道將會擁有哪些類別的商品,此時,我們應該如何解決將商品歸類的問題呢?
這時候我們可以用聚類的方式解決,依據商品之間的共性進行相應分析,將共性較多的商品聚為一類,此時,商品聚整合的類的數目是不一定的,但是能保證的是,聚在一起的商品之間一定有某種共性,即依據“物以類聚”的思想去實現。
同樣,在我們的聚類演演算法中,也會有類似的分析過程。
將聚類分析演演算法運用在爬蟲對網頁的更新上,我們可以這樣做,如圖3-4所示。
▲圖3-4 網頁更新策略之聚類演演算法
-
首先,經過大量的研究發現,網頁可能具有不同的內容,但是一般來說,具有類似屬性的網頁,其更新頻率類似。這是聚類分析演演算法運用在爬蟲網頁的更新上的一個前提指導思想。
-
有了1中的指導思想後,我們可以首先對海量的網頁進行聚類分析,在聚類之後,會形成多個類,每個類中的網頁具有類似的屬性,即一般具有類似的更新頻率。
-
聚類完成後,我們可以對同一個聚類中的網頁進行抽樣,然後求該抽樣結果的平均更新值,從而確定對每個聚類的爬行頻率。
以上,就是使用爬蟲爬取網頁的時候,常見的3種更新策略,我們掌握了其演演算法思想後,在後續我們進行爬蟲的實際開發的時候,編寫出來的爬蟲執行效率會更高,並且執行邏輯會更合理。
04 網頁分析演演算法
在搜尋引擎中,爬蟲爬取了對應的網頁之後,會將網頁儲存到伺服器的原始資料庫中,之後,搜尋引擎會對這些網頁進行分析並確定各網頁的重要性,即會影響使用者檢索的排名結果。
所以在此,我們需要對搜尋引擎的網頁分析演演算法進行簡單瞭解。
搜尋引擎的網頁分析演演算法主要分為3類:基於使用者行為的網頁分析演演算法、基於網路拓撲的網頁分析演演算法、基於網頁內容的網頁分析演演算法。接下來我們分別對這些演演算法進行講解。
1. 基於使用者行為的網頁分析演演算法
基於使用者行為的網頁分析演演算法是比較好理解的。這種演演算法中,會依據使用者對這些網頁的訪問行為,對這些網頁進行評價,比如,依據使用者對該網頁的訪問頻率、使用者對網頁的訪問時長、使用者的單擊率等資訊對網頁進行綜合評價。
2. 基於網路拓撲的網頁分析演演算法
基於網路拓撲的網頁分析演演算法是依靠網頁的連結關係、結構關係、已知網頁或資料等對網頁進行分析的一種演演算法,所謂拓撲,簡單來說即結構關係的意思。
基於網路拓撲的網頁分析演演算法,同樣主要可以細分為3種型別:基於網頁粒度的分析演演算法、基於網頁塊粒度的分析演演算法、基於網站粒度的分析演演算法。
PageRank演演算法是一種比較典型的基於網頁粒度的分析演演算法。相信很多朋友都聽過Page-Rank演演算法,它是谷歌搜尋引擎的核心演演算法,簡單來說,它會根據網頁之間的連結關係對網頁的權重進行計算,並可以依靠這些計算出來的權重,對網頁進行排名。
當然,具體的演演算法細節有很多,在此不展開講解。除了PageRank演演算法之外,HITS演演算法也是一種常見的基於網頁粒度的分析演演算法。
基於網頁塊粒度的分析演演算法,也是依靠網頁間連結關係進行計算的,但計算規則有所不同。
我們知道,在一個網頁中通常會包含多個超連結,但一般其指向的外部連結中並不是所有的連結都與網站主題相關,或者說,這些外部連結對該網頁的重要程度是不一樣的,所以若要基於網頁塊粒度進行分析,則需要對一個網頁中的這些外部連結劃分層次,不同層次的外部連結對於該網頁來說,其重要程度不同。
這種演演算法的分析效率和準確率,會比傳統的演演算法好一些。
基於網站粒度的分析演演算法,也與PageRank演演算法類似,但是,如果採用基於網站粒度進行分析,相應的,會使用SiteRank演演算法。即此時我們會劃分站點的層次和等級,而不再具體地計算站點下的各個網頁的等級。
所以其相對於基於網頁粒度的演演算法來說,則更加簡單高效,但是會帶來一些缺點,比如精確度不如基於網頁粒度的分析演演算法精確。
3. 基於網頁內容的網頁分析演演算法
在基於網頁內容的網頁分析演演算法中,會依據網頁的資料、文字等網頁內容特徵,對網頁進行相應的評價。
以上,我簡單為大家介紹了搜尋引擎中的網頁分析演演算法,我們學習爬蟲,需要對這些演演算法進行相應的瞭解。
05 身份識別
在爬蟲對網頁爬取的過程中,爬蟲必然需要訪問對應的網頁,正規的爬蟲一般會告訴對應網頁的網站站長其爬蟲身份。網站的管理員則可以透過爬蟲告知的身份資訊對爬蟲的身份進行識別,我們稱這個過程為爬蟲的身份識別過程。
那麼,爬蟲應該如何告知網站站長自己的身份呢?
一般地,爬蟲在對網頁進行爬取訪問的時候,會透過HTTP請求中的User Agent欄位告知自己的身份資訊。一般爬蟲訪問一個網站的時候,首先會根據該站點下的Robots.txt檔案來確定可爬取的網頁範圍,Robots協議是需要網路爬蟲共同遵守的協議,對於一些禁止的URL地址,網路爬蟲則不應爬取訪問。
同時,如果爬蟲在爬取某一個站點時陷入死迴圈,造成該站點的服務壓力過大,如果有正確的身份設定,那麼該站點的站長則可以想辦法聯絡到該爬蟲方,然後停止對應的爬蟲程式。
當然,有些爬蟲會偽裝成其他爬蟲或瀏覽器去爬取網站,以獲得一些額外資料,或者有些爬蟲,會無視Robots協議的限制而任意爬取。從技術的角度來說,這些行為實現起來不難,但是這些行為是我們不提倡的,因為只有共同遵守一個良好的網路規則,才能夠達到爬蟲方和站點服務方的雙贏。
06 網路爬蟲實現技術
透過前面的學習,我們基本上對爬蟲的基本理論知識有了比較全面的瞭解,那麼,如果我們要實現網路爬蟲技術,要開發自己的網路爬蟲,可以使用哪些語言進行開發呢?
開髮網路爬蟲的語言有很多,常見的語言有:Python、Java、PHP、Node.JS、C++、Go語言等。以下我們將分別介紹一下用這些語言寫爬蟲的特點:
-
Python:爬蟲框架非常豐富,並且多執行緒的處理能力較強,並且簡單易學、程式碼簡潔,優點很多。
-
Java:適合開發大型爬蟲專案。
-
PHP:後端處理很強,程式碼很簡潔,模組也較豐富,但是併發能力相對來說較弱。
-
Node.JS:支援高併發與多執行緒處理。
-
C++:執行速度快,適合開發大型爬蟲專案,成本較高。
-
Go語言:同樣高併發能力非常強。
07 小結
-
聚焦網路爬蟲,由於其需要有目的地進行爬取,所以對於通用網路爬蟲來說,必須要增加標的的定義和過濾機制,具體來說,此時,其執行原理和過程需要比通用網路爬蟲多出3步,即標的的定義、無關連結的過濾、下一步要爬取的URL地址的選取。
-
常見的網頁更新策略主要有3種:使用者體驗策略、歷史資料策略、聚類分析策略。
-
聚類分析可以依據商品之間的共性進行相應的處理,將共性較多的商品聚為一類。
-
在爬蟲對網頁爬取的過程中,爬蟲必然需要訪問對應的網頁,此時,正規的爬蟲一般會告訴對應網頁的網站站長其爬蟲身份。網站的管理員則可以透過爬蟲告知的身份資訊對爬蟲的身份進行識別,我們稱這個過程為爬蟲的身份識別過程。
-
開髮網路爬蟲的語言有很多,常見的語言有Python、Java、PHP、Node.JS、C++、Go語言等。
關於作者:韋瑋,資深網路爬蟲技術專家、大資料專家和軟體開發工程師,從事大型軟體開發與技術服務多年,精通Python技術,在Python網路爬蟲、Python機器學習、Python資料分析與挖掘、Python Web開發等多個領域都有豐富的實戰經驗。
本文摘編自《精通Python網路爬蟲:核心技術、框架與專案實戰》,經出版方授權釋出。
延伸閱讀《精通Python網路爬蟲》
點選上圖瞭解及購買
轉載請聯絡微信:DoctorData
推薦語:資深專家以實戰為導向,講透Python網路爬蟲各項核心技術和主流框架,深度講解網路爬蟲的抓取技術與反爬攻關技巧。
朋友會在“發現-看一看”看到你“在看”的內容