- 網絡爬蟲原理與實踐:基于C#語言
- 李健 種惠芳
- 4018字
- 2023-02-23 16:13:15
1.3 網絡爬蟲的原理
1.3.1 網絡爬蟲概述
1.網絡爬蟲的定義
或許你不太了解網絡爬蟲(Web Crawler,簡稱爬蟲),但一定很熟悉搜索引擎,我們幾乎每天都在通過搜索引擎獲取互聯網信息。無論搜索引擎的功能多么強大,其基本工作原理并不復雜,我們總結如下:
1)在Web中廣泛收集數據。
2)為數據建立倒排索引。
3)根據搜索詞將相關結果排序后返回給用戶。
其中第1步“收集數據”的工作就是由網絡爬蟲完成的。
網絡爬蟲不僅是搜索引擎的關鍵組件,在其他領域也有廣泛應用。借助網絡爬蟲,語言學家可以下載大量文本以研究語言現象,銷售人員可以搜集產品的價格和銷量以分析市場行情,領域愛好者能夠將某個網站或欄目的內容收藏到本地,AI研究者能夠采集各類數據作為機器學習的素材。
網絡爬蟲是按照一定規則自動獲取Web信息資源的計算機程序。對于網絡爬蟲的定義,可以從以下幾個方面進行理解:
□ 爬蟲這個稱謂是一種形象的比喻,有時也被稱為網絡蜘蛛(Web Spider)或網絡機器人(Web Robot)。
□ 關于運行環境,雖然Web不是因特網的全部,但網絡爬蟲主要是面向Web的,這是由Web資源的開放性和豐富性所決定的。
□ 關于爬蟲規則,一方面指網絡爬蟲所采用的搜索策略(如深度優先、廣度優先等),另一方面指網絡爬蟲要遵循的行業規范(如Robots協議)。
□ 關于存在形式,網絡爬蟲是能夠執行數據采集任務的自動化程序,其具體形式既可以是可執行文件,也可以是某種腳本。
□ 關于抽取目標,網絡爬蟲通常會對原始Web數據進行二次抽取,以提高目標數據的結構化程度和價值密度。
2.爬蟲的分類
根據數據采集的范圍和精度不同,網絡爬蟲大致可分為“漫爬型”和“垂直型”:前者用于搜索引擎的廣泛采集,也被稱為通用爬蟲(General Purpose Web Crawler);后者用于領域數據的精準采集,也被稱為聚焦爬蟲(Focused Web Crawler)。如圖1-15所示,通用爬蟲對網頁中的所有超鏈接進行無差別搜索,得到一棵完整的生成樹;聚焦爬蟲則按照一定條件進行篩選,得到一棵被剪枝的生成樹。

圖1-15 兩類網絡爬蟲的搜索路徑
搜索引擎能夠滿足日常生活中的信息檢索,卻難以滿足行業用戶的需求。搜索引擎存在以下問題:
1)包含不相關的內容(如廣告、推廣等)。
2)包含內容重復的頁面。
3)僅返回部分搜索結果。
這與行業用戶對數據“查準、查全”的要求相去甚遠。如何高效獲取資源,解決信息不對稱問題,已成為互聯網信息利用的關鍵。面向特定主題和應用的爬蟲是行業人員獲取領域數據的重要工具,也是本書的主要研究對象。
網絡爬蟲還可從其他角度進行分類。根據目標資源的位置不同,網絡爬蟲可以分為淺層爬蟲(Surface Web Crawler)和深層爬蟲(Deep Web Crawler)。通過URL能夠直接到達的數據為淺層數據(如靜態頁面),需要用戶登錄、提交表單或異步加載才能獲得的數據為深層數據。研究發現,Web中的深層數據量遠遠超過淺層數據量,因此深層爬蟲就顯得十分重要。相比之下,淺層爬蟲比較容易開發,而開發深層爬蟲則需要更多的技術手段。
根據部署方式不同,網絡爬蟲可分為集中式爬蟲和分布式爬蟲。集中式爬蟲運行在單臺計算機上,可用于面向個人的中小規模數據采集;分布式爬蟲能夠實現在多臺計算機上的協同爬取,可用于面向企業的大規模數據采集。
根據數據更新方式的不同,網絡爬蟲可以分為累積式爬蟲(Cumulative Crawler)和增量式爬蟲(Incremental Crawler)。累積式爬蟲常用于數據集的整體建立或大規模更新,增量式爬蟲主要針對數據集的日常維護與實時更新。
3.工作流程
網絡爬蟲涉及很多技術環節,必要技術包括Web訪問、信息抽取、數據存儲、爬蟲控制等,可選技術包括多線程爬取、分布式部署、可視化編程、模擬瀏覽器、使用代理服務等。每個環節又包含很多技術細節,這些細節將在后續章節詳細介紹。網絡爬蟲的基本工作流程如圖1-16所示。

圖1-16 網絡爬蟲的基本工作流程
爬蟲的基本工作流程可描述為以下7個步驟:
1)初始化爬蟲參數,將種子添加到URL隊列。
2)判斷URL隊列是否為空,若不空則進入第3步,否則進入第7步。
3)從隊列中取出下一個URL,訪問其Web資源。
4)解析Web資源,根據條件抽取目標數據和擴展鏈接。
5)根據用戶需要將目標數據保存到文件或數據庫。
6)將符合條件的擴展鏈接補充到URL隊列,轉到第2步。
7)結束任務,退出爬蟲。
在上述步驟中,種子可以是一個或多個,這是爬蟲采集的起點。采集任務啟動后將循環判斷URL隊列是否為空,在URL不斷出列的同時又有新的補充,這樣就實現了自動采集。目標數據和擴展鏈接的選取條件可在初始化模塊中設置。
為了避免重復采集,我們通常借助一個Visited數組來記錄那些已被訪問的URL。隨著爬蟲任務的執行,Visited數組將會越來越大,直到所有符合條件的擴展鏈接都包含在其中,此時不會再有新的URL入列,URL隊列最終將被清空。
爬蟲的目標數據通常是對原始Web數據進一步抽取的結果(如文章的標題和正文、產品的款型和價格)。常見的抽取對象包括HTML數據、XML數據、JSON數據等。
1.3.2 Robots協議
網絡爬蟲排除協議(Robots Exclusion Protocol,簡稱Robots協議)用于告知網絡爬蟲允許抓取網站哪些內容,不允許抓取哪些內容。Robots協議內容通常以文本文件(robots.txt)的形式存放于網站根目錄下,也可以在HTML文檔的<meta>標簽中進行描述。
1.通過robots.txt文件描述Robots協議
網站根目錄下的robots.txt文件默認采用ASCII編碼,其中描述了一系列Robots規則。不同網站的robots.txt文件的書寫方式各不相同,百度(www.baidu.com)網站的robots.txt文件內容如圖1-17所示。

圖1-17 百度網站的robots.txt文件
百度網站的Robots協議指定了某些網絡爬蟲(如Baiduspider、Googlebot等)不允許抓取的資源(如/baidu、/s?、/home/news/data/等),除此之外的內容都可以抓取。搜狐(www.sohu.com)網站的robots.txt文件內容如圖1-18所示。

圖1-18 搜狐網站的robots.txt文件
搜狐網站的Robots協議指定了某些網絡爬蟲(如Baiduspider等)允許抓取的資源(如/a/*?*、/abroad_a/*?*、/picture/*?*等),除此之外的內容都不能抓取。由此可見,百度和搜狐所采取的爬蟲排除策略恰好相反。
如果網站不存在robots.txt文件或者文件內容為空,則默認沒有設置排除規則,網絡爬蟲可以訪問站點的所有資源。如圖1-19所示,網易網站的robots.txt文件內容即為空。

圖1-19 網易網站的robots.txt文件
通過以上幾個示例可見,robots.txt文件由若干字段構成,表1-13給出了robots.txt文件中的常用字段名及說明。
表1-13 robots.txt文件的常用字段及說明

(續)

下面通過幾個簡單例子來說明常見robots.txt內容的書寫方法。
1)允許所有的爬蟲訪問所有內容,寫法如下:

另一種寫法如下:

2)僅允許特定爬蟲訪問所有內容,寫法如下:

3)禁止所有爬蟲訪問網站的任何內容,寫法如下:

4)禁止所有爬蟲訪問指定目錄,寫法如下:

5)禁止特定爬蟲訪問指定目錄,寫法如下:

6)禁止所有爬蟲訪問指定文件類型,寫法如下:

Robots協議通過模式匹配字符串(Allow和Disallow字段值)定位URL。以斜杠“/”結尾時表示目錄,否則表示文件。若希望單獨定義網絡爬蟲對某個子目錄的行為限制,可將相關設置合并到根目錄下的robots.txt中。User-agent字段用于指定網絡爬蟲,常見的網絡爬蟲名稱如表1-14所示。
表1-14 常見的網絡爬蟲名稱

2.通過<meta>標簽描述Robots協議
除了通過robots.txt文件描述之外,還可以通過HTML文檔的<meta>標簽描述Robots協議。前者用于描述整個站點對爬蟲的訪問限制,后者用于描述某個具體的頁面。描述Robots協議的<meta>標簽的基本形式如下:

標簽的name屬性用來指定爬蟲名稱(如name="Baiduspider"),若取值為Robots,則表示對所有網絡爬蟲有效。contect屬性用于描述爬蟲的操作權限,其可選取值如表1-15所示。
表1-15 contect屬性的可選取值

這里的“檢索”是指下載網頁的內容,“查詢”是指繼續搜索頁面中的鏈接。表1-15中的contect取值還可組合使用,以下代碼表示本網頁可檢索、可查詢:

上述代碼相當于:

若contect="index,nofollow",則表示可檢索、不可查詢;若contect="noindex,nofollow",則表示不可檢索、不可查詢,相當于contect="none"。
說明:Robots協議只是一種行業約定,并不是法律規范,沒有強制約束力。但需要強調的是,若進行商業用途的數據采集,無論是否使用網絡爬蟲、是否遵守Robots協議,哪怕采用手動復制的方式,都可能會侵犯他人知識產權,引發不正當競爭。
1.3.3 網絡爬蟲框架
國內外眾多機構和個人已開發出多款爬蟲工具軟件,如Nutch、Heritrix、SOUP、ParseHub、GooSeeker、八爪魚、火車頭等。常用的爬蟲框架包括WebCollector、Nutch、WebMagic、Heritrix、Scrapy和PySpider等。這些爬蟲軟件和框架極大地方便了人們對網絡數據的獲取,但具有以下局限性:
□ 有的爬蟲功能相對單一,使用方式受限,可定制化程度不夠。
□ 有的爬蟲安裝配置煩瑣,框架結構復雜,使用門檻較高。
□ 有的爬蟲采用封閉式框架,不提供開源代碼,難以進行二次開發。
□ 有的爬蟲抓取速度慢,解析和抽取能力弱,性能表現不佳。
總之,基于現有框架快速開發個性化爬蟲仍然具有一定難度。因此,為開發者提供一個輕量級、模塊化、免費開源、高效易用的網絡爬蟲框架就顯得十分重要。
面向個性化需求的輕量級爬蟲框架應當采用模塊化設計,能夠下載各類網絡資源,并支持異步下載、編碼檢測、提交表單、壓縮傳輸、使用代理等機制;能夠解析和抽取HTML、XML、JSON等多種數據;能夠提供靈活的爬蟲控制方式,內置常用搜索算法;能夠管理、分配線程資源和代理資源,支持分布式部署。根據上述需求,可設計如圖1-20所示的爬蟲框架,主要組件包括:控制器、下載器、解析器、線程池、代理池、分布式部署器和智能化工具包。

圖1-20 輕量級爬蟲框架
框架中的智能化工具包通過人機交互技術實現可視化模板配置,用戶不必掌握Web專業知識就能完成模板配置,從而降低了爬蟲的使用門檻;通過智能抽取技術實現對網頁內容(如正文、日期、目錄等)的自動抽取,進一步減少配置工作量;通過主題模型計算網頁內容的相關度,從而提高主題爬蟲的采集精度。
通常情況下,框架中的控制器、解析器、下載器為必選組件,其余為可選組件,用戶可根據需要進行組裝。爬蟲框架的基本應用模式如圖1-21所示。

圖1-21 爬蟲框架的應用模式
引入爬蟲框架后,開發者只需編寫幾行代碼即可完成對簡單任務的爬取;對于較復雜的任務,亦可通過參數化定制或二次開發來實現。當需要規劃新的爬蟲路線時,開發者通常只需要重寫控制器的相關方法,從而最大限度地復用框架功能。
上述框架具有高內聚、低耦合、可拼裝、易使用的特點,能夠有效降低使用門檻,簡化配置流程,優化搜索路線,提高采集精度,從而提高爬蟲的自動化、智能化水平。
爬蟲框架中的重要模塊將在后續章節中詳細介紹,其中第3章重點介紹下載器,第4、5章重點介紹解析器,第7章重點介紹控制器,第8章重點介紹線程池,第9章重點介紹代理池。
- Learning Cython Programming(Second Edition)
- Web Scraping with Python
- 羅克韋爾ControlLogix系統應用技術
- 零基礎學Java(第4版)
- Mastering KnockoutJS
- AppInventor實踐教程:Android智能應用開發前傳
- HTML5與CSS3基礎教程(第8版)
- HTML5+CSS3 Web前端開發技術(第2版)
- Building Microservices with .NET Core
- Instant PHP Web Scraping
- Beginning C++ Game Programming
- Python機器學習算法與應用
- SpringBoot從零開始學(視頻教學版)
- Web編程基礎:HTML5、CSS3、JavaScript(第2版)
- Learning D3.js 5 Mapping(Second Edition)