python爬蟲之基礎學習(一)
網絡爬蟲
網絡爬蟲也叫網絡蜘蛛、網絡機器人。如今屬於數據的時代,信息采集變得尤為重要,可以想象單單依靠人力去采集,是一件無比艱辛和困難的事情。網絡爬蟲的產生就是代替人力在互聯網中自動進行信息采集和整理。
網絡爬蟲的組成
網絡爬蟲由控制節點、爬蟲節點以及資源庫構成,簡單而言就是控制節點控制爬蟲節點爬取和處理網頁存儲到資源庫中。網絡爬蟲中有多個控制節點和爬蟲節點,一個控制節點控制着多個爬蟲節點,同一個控制節點下的多個爬蟲節點可以相互通信,多個控制節點也可以相互通信。
網絡爬蟲的類型
通用網絡爬蟲:也稱為全網爬蟲,爬取目標是整個互聯網,主要應用於大型搜索引擎。主要應用的爬行策略:深度優先爬行策略和廣度優先爬行策略。
聚焦網絡爬蟲:爬取選擇的特定網頁。主要應用的爬行策略:基於內容評價的爬行策略、基於鏈接評價的爬行策略、基於增強學習的爬行策略和基於語境圖的爬行策略。
增量式網絡爬蟲:只爬取內容更新的網頁或者新產生的網頁。
深層網絡爬蟲:爬取互聯網中的深層頁面。網頁分為表層頁面和深層頁面,表層頁面是指通過靜態鏈接可以直接獲取的頁面,而深層頁面則是需要通過驗證表單獲取的頁面。因此,深層網絡爬蟲需要表單填寫,而對於表單的填寫又分為兩種類型:基於領域知識的表單填寫和基於網頁結構分析的表單填寫。基於領域知識的表單填寫:建立一個關鍵詞庫,填寫表單時,根據語義選擇關鍵詞填寫;基於網頁結構分析的表單填寫:當領域知識有限,根據網頁結構進行分析,自動填寫。
平時我們日常說的爬蟲多是指聚焦網絡爬蟲,聚焦網絡爬蟲的基本流程為:
- 通過網絡域名獲取HTML數據
- 解析數據獲取目標信息
- 存儲目標信息
- 移動至另一個網頁重復上述過程
聚焦網絡爬蟲控制中心負責整個爬蟲系統的管理和監控。初始URL集合傳遞到URL隊列,頁面爬行模塊從URL隊列取出一批URL列表,后爬取互聯網中的頁面並傳送到頁面數據庫中存儲。與此同時,爬取頁面獲取的新的URL會使用鏈接過濾模塊結合選定的主題濾除無用鏈接,剩余URL通過鏈接評價模塊和內容評價模塊進行優先級排序后推入URL隊列。另一方面,存儲在頁面數據塊的頁面需要經過頁面分析模塊對頁面信息進行處理,根據處理結果建立索引數據庫,方便用戶檢索。
搜索引擎核心
爬蟲與搜索引擎是密不可分的,搜索引擎核心工作流程:
搜索引擎利用爬蟲模塊(爬行器和控制器)爬取網頁,后把爬取的網頁存儲在原始數據庫中。索引器對原始數據庫中數據建立索引,並存儲到索引數據庫。用戶通過用戶交互接口檢索信息時,一方面通過檢索器和索引數據庫搜索信息;另一方面,產生的用戶日志通過用戶日志數據庫和日志分析器進行存儲和處理,處理結果反饋給原始數據庫和索引數據庫,根據用戶檢索要求對數據庫中信息進行調整排名等操作。
網絡爬蟲實現原理
網絡爬蟲實現過程
通用網絡爬蟲
- 獲取初始URL。初始URL可以是用戶人為指定,也可以是用戶指定初始爬取頁面決定。
- 根據初始URL爬取頁面獲得新URL。按照初始URL爬取頁面以后,將網頁存儲原始數據庫中,已使用的URL存放在一個URL列表,同時也會新發現URL地址。
- 將新發現的URL放到URL隊列中。
- 從URL隊列中讀取新URL,按照新的URL繼續爬取網頁,同時繼續從頁面中發現新的URL,並重復上述2、3步。
- 滿足爬蟲系統設置的停止條件是,停止爬取。一般爬蟲系統會設置停止條件,如果沒有設置,爬蟲會一直爬取下去。
聚焦網絡爬蟲
- 對爬取目標的定義和描述。在聚焦網絡爬蟲中,首先要依據爬蟲需求定義好爬取目標,以及相關描述。
- 獲取初始的URL。
- 根據初始的URL爬取頁面,並獲得新的URL。
- 從新的URL中過濾掉與爬取目標無關的鏈接。聚焦網路爬蟲是具有目的性的,與目標無關的網頁需要被過濾掉,同時對已爬取的URL需要存放在一個URL列表中,用於去重和判斷爬取進程。
- 將過濾后的鏈接加入到URL隊列。
- 從URL隊列中,根據搜索算法,確定URL的優先級以及下一步要爬取的URL。在通用網絡爬蟲中,下一步爬取哪些URL以及爬取順序是不太重要的,而在聚焦網絡爬蟲中,下一步爬取的URL和爬取順序會影響爬取效率。因此,需要根據搜索策略來確定。
- 從下一步要爬取的URL中讀取URL,根據新的URL爬取網頁,並重復上述爬取過程。
- 滿足系統設置的停止條件或者無法獲取新的與爬取目標有限的URL時,停止爬取。
爬行策略
前面說過,確定URL隊列中爬取優先順序在聚焦網絡爬蟲中尤為重要,而爬取URL優先級需要根據爬行策略來確定。主要的爬行策略有:深度優先策略、廣度優先策略、大站優先策略、反鏈爬行策略等。
深度優先策略:深度表現為縱向,深度優先策略會按照爬取的網頁依次爬取該網頁下層的所有鏈接在返回上層繼續爬取。順序為:A-E-F-B-C-G-H。
廣度優先策略:廣度表現為橫向,廣度優先策略會按照爬取的網頁依次爬取同一層級的所有網頁再爬取下一層級。順序為:A-B-C-E-F-G-H。
大站優先策略:大站是指網頁所在站點分類,單個站點所包含網頁數量多少依次排序,按照網頁數量多的站點開始爬取。
反向鏈策略:反向鏈是指該網頁被其他頁面指向鏈接,爬行策略為優先爬取反向鏈接數多的網頁,即按網頁被其他網頁鏈接指向次數排序。
其他爬行策略還有OPIC策略、PageRank策略...
網頁更新策略
我們知道網站的網頁是經常更新,產品上新或者新聞更新等等。那作為爬蟲什么時間重新爬取網頁呢?考慮兩個問題:一是網頁更新過慢情況,爬蟲爬取時間間隔短,勢必產生多次爬取無效內容,對爬蟲和服務器而言都會增加不必要的壓力;二是網頁更新過快,而爬蟲爬取時間間隔過長,那么必然會存在數據獲取不完整的情況。顯然,只有爬取時間間隔和網頁更新時間間隔一致的情況下,效果會更好。因此,當爬蟲服務器資源有限時,制定合理網頁更新策略,更有助於我們對網頁獲取以及網站服務器的減負。常見的網頁更新策略有:用戶體驗策略、歷史數據策略以及聚類分析策略等。
用戶體驗策略:用戶體驗表現在什么時候呢?打開百度,搜索關鍵詞出現一系列搜索結果,當我們作為用戶時,一般優先關注前幾條或者前幾頁的網頁。而用戶體驗策略則是優先更新搜索結果排名靠前的網頁,並依據爬蟲爬取網頁多個歷史版本的內容更新、搜索質量影響、用戶體驗等信息,確定爬蟲的爬取周期。
歷史數據策略:爬蟲爬取某個網頁的多個歷史版本,可以得出網頁的歷史更新數據,歷史數據策略是根據歷史數據借助數學手段建模分析,預測網頁下一次更新時間,進而確定爬蟲爬取周期。
聚類分析策略:用戶體驗策略和歷史數據策略都需要網頁歷史數據進行分析,對於新網頁而言是不友好的。聚類分析策略是采取對具有相同或者相似屬性的網頁划歸分類,這種分類稱之為聚類。對一個聚類而言,因為存在相同或者相似的屬性,我們認定網頁更新時間也比較相近,對一個聚類抽樣分析更新間隔,再對多個樣本結果求均值減小誤差,以此確定爬蟲爬取周期。
網頁分析算法
前面說過,搜索引擎搜索結果會按照先后排名出現,那么怎么實現搜索結果的網頁排序呢?網頁分析算法就是實現爬取網頁排序問題的方法,常見的網頁分析算法有:基於用戶行為的網頁分析算法、基於網絡拓撲的網頁分析算法、基於網頁內容的網頁分析算法。
基於用戶行為的網頁分析算法:簡單來說就是通過用戶對網頁的訪問行為,對網頁進行評價排序。訪問行為有:訪問頻率、訪問時長等。
基於網絡拓撲的網頁分析算法:依據網頁之間的鏈接關系、結構關系以及網頁數據等對網頁進行分析、評價、排序。基於網頁拓撲的網頁分析算法按照粒度有可細分為:基於網頁粒度的分析算法、基於網頁塊粒度的分析算法、基於網站粒度分析算法。
- 基於網頁粒度的分析算法:網頁之間一般存在多個鏈接關系,一個網頁鏈接關系越多說明網頁的重要程度越高,表現為其權值越高。權值高的,排名越前。例如,Google搜索引擎使用PageRank算法。影響因素:網頁鏈接數量
- 基於網頁塊粒度的分析算法:上面說過網頁存在多個鏈接關系,一個網頁的鏈接按照與主題相關程度又可以划分多個層次,其重要程度也會不同。那么網頁含有與主題相關程度高的鏈接越多,排名越前。影響因素:網頁與主題相關的鏈接數量
- 基於網站粒度的分析算法:同基於網頁粒度的分析算法相似,對網站的層次和等級划分,網站層次和等級越高,相應的排名越前。
基於網頁內容的分析算法:依據網頁中的數據和文本信息對網頁進行評價排序。
身份識別
爬蟲爬取網頁時,一般是需要先訪問網頁的。對於爬蟲而言,爬取網頁時,服務器是可以識別出不是用戶行為的,進而采取拒絕訪問或者封IP等行為。那么如何讓爬蟲偽裝成用戶呢?爬蟲爬取訪問網頁的時候,可以在HTTP請求中添加User-Agent信息來告訴服務器身份信息。
一般爬蟲訪問一個網站的時候,需要先檢查一下站點下的Robots.txt文件來確定可以爬取的網頁范圍,對於一些禁止的URL,按照Robot協議是不應爬取訪問的。
一般Robots.txt查看方式:根URL/Robots.txt。
具體添加User-Agent信息方法,查看:python爬蟲之User-Agent用戶信息