[原創]手把手教你寫網絡爬蟲(3):開源爬蟲框架對比

 

手把手教你寫網絡爬蟲(3)git

做者:拓海 (https://github.com/tuohai666)github

摘要:從零開始寫爬蟲,初學者的速成指南!web

封面:算法

 

 

介紹

你們好!咱們從今天開始學習開源爬蟲框架Scrapy,若是你看過《手把手》系列的前兩篇,那麼今天的內容就很是容易理解了。細心的讀者也許會有疑問,爲何不學出身名門的Apache頂級項目Nutch,或者人氣飆升的國內大神開發的Pyspider等框架呢?緣由很簡單,咱們來看一下主流爬蟲框架在GitHub上的活躍度:shell

Project數據庫

Language後端

Star緩存

Watchcookie

Fork網絡

Nutch

Java

1111

195

808

webmagic

Java

4216

618

2306

WebCollector

Java

1222

255

958

heritrix3

Java

773

141

428

crawler4j

Java

1831

242

1136

Pyspider

Python

8581

687

2273

Scrapy

Python

19642

1405

5261

看到了嗎?星星數排名第一的Scrapy比其餘全部的加起來都要多,我彷彿聽到他這樣說:

 

 

好了,以上純屬玩笑,切莫認真,否則要引起口水戰了!這些框架都很優秀,都有不少用戶,活躍度相對低的並不說明技術低,活躍度相對高的也許只是多知足了一些用戶需求。接下來咱們仍是要理性的對主流爬蟲框架作一個對比分析。

 

開源框架大PK

各路英雄已經到齊了, PK如今開始!

 

Nutch

介紹:

Nutch是一個開源的Java實現的搜索引擎。它提供了咱們運行本身的搜索引擎所需的所有工具,包括全文搜索和網絡爬蟲。

儘管搜索是上網的基本要求,可是現有的搜索引擎的數目卻在降低。而且這頗有可能進一步演變成爲一個公司壟斷了幾乎全部的網頁搜索爲其謀取商業利益。這顯然不利於廣大Internet用戶。

Nutch爲咱們提供了這樣一個不一樣的選擇。相對於那些商用的搜索引擎,Nutch做爲開放源代碼的搜索引擎將會更加透明,從而更值得你們信賴。如今全部主要的搜索引擎都採用私有的排序算法, 而不會解釋爲何一個網頁會排在一個特定的位置。除此以外, 有的搜索引擎依照網站所付的費用, 而不是根據它們自己的價值進行排序。與它們不一樣,Nutch沒有什麼須要隱瞞,也沒有動機去扭曲搜索的結果。Nutch將盡本身最大的努力爲用戶提供最好的搜索結果。

 

優勢:

Nutch支持分佈式抓取,並有Hadoop支持,能夠進行多機分佈抓取,存儲和索引。另外很吸引人的一點在於,它提供了一種插件框架,使得其對各類網頁內容的解析、各類數據的採集、查詢、集羣、過濾等功能可以方便的進行擴展。正是因爲有此框架,使得 Nutch 的插件開發很是容易,第三方的插件也層出不窮,極大的加強了 Nutch 的功能和聲譽。

 

缺點:

對於大多數用戶來講,通常是想作一個精確數據爬取的爬蟲,就像第一篇裏爬歌單那個「主題爬蟲」。而第二篇介紹的「通用爬蟲」適合作搜索引擎,這種需求就比較少。若是以此爲標準,那麼爲搜索引擎而生的Nutch就有着天生缺點。Nutch的架構裏大部分爲搜索引擎而設計的,對精確爬取沒有特別的考慮。也就是說,用Nutch作主題爬蟲,會浪費不少的時間在沒必要要的計算上。並且若是你試圖經過對Nutch進行二次開發來擴展其定製能力,基本上就要破壞Nutch的框架,反而不如本身寫了。

 

Pyspider

介紹:

Pyspider是一個國人編寫的強大的網絡爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分佈式架構,支持多種數據庫後端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。

 

Pyspider的主要功能包括,抓取、更新調度多站點的特定的頁面;須要對頁面進行結構化信息提取;靈活可擴展,穩定可監控。知足了絕大多數Python爬蟲的需求 —— 定向抓取,結構化化解析。可是面對結構迥異的各類網站,單一的抓取模式並不必定能知足,靈活的抓取控制是必須的。爲了達到這個目的,單純的配置文件每每不夠靈活,因而,經過腳本去控制抓取成爲了最後的選擇。而去重調度,隊列,抓取,異常處理,監控等功能做爲框架,提供給抓取腳本,並保證靈活性。最後加上web的編輯調試環境,以及web任務監控,即成爲了最終的框架。

 

優勢:

  1. 支持分佈式部署。
  2. 徹底可視化,對用戶很是友好:WEB 界面編寫調試腳本,起停腳本,監控執行狀態,查看活動歷史,獲取結果產出。
  3. 簡單,五分鐘就能上手。腳本規則簡單,開發效率高。
  4. 支持抓取JavaScript的頁面。

總之,Pyspider很是強大,強大到更像一個產品而不是一個框架。

 

缺點:

  1. URL去重使用數據庫而不是布隆過濾器,億級存儲的db io將致使效率急劇下降。
  2. 使用上的人性化犧牲了靈活度,定製化能力下降。

 

Scrapy

介紹:

Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。 能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。Scrapy 使用 Twisted這個異步網絡庫來處理網絡通信,架構清晰,而且包含了各類中間件接口,能夠靈活的完成各類需求。Scratch,是抓取的意思,這個Python的爬蟲框架叫Scrapy,大概也是這個意思吧。

 

優勢:

  1. 極其靈活的定製化爬取。
  2. 社區人數多、文檔完善。
  3. URL去重採用布隆過濾器方案。
  4. 能夠處理不完整的HTML,Scrapy已經提供了selectors(一個在lxml的基礎上提供了更高級的接口),能夠高效地處理不完整的HTML代碼。

 

缺點:

  1. 不支持分佈式部署。
  2. 原生不支持抓取JavaScript的頁面。
  3. 全命令行操做,對用戶不友好,須要必定學習週期。

 

結論

篇幅有限,就先選擇這三個最有表明性的框架進行PK。他們都有遠超別人的優勢,好比:Nutch天生的搜索引擎解決方案、Pyspider產品級的WebUI、Scrapy最靈活的定製化爬取。也都各自致命的缺點,好比Scrapy不支持分佈式部署,Pyspider不夠靈活,Nutch和搜索綁定。究竟該怎麼選擇呢?

咱們的目標是作純粹的爬蟲,不是搜索引擎,因此先把Nutch排除掉,剩下人性化的Pyspider和高可定製的Scrapy。Scrapy的靈活性幾乎可以讓咱們完成任何苛刻的抓取需求,它的「難用」也讓咱們不知不覺的研究爬蟲技術。如今還不是享受Pyspider的時候,目前的當務之急是打好基礎,應該學習最接近爬蟲本質的框架,瞭解它的原理,因此把Pyspider也排除掉。

最終,理性的從我的的需求角度對比,仍是Scrapy勝出!其實Scrapy還有更多優勢:

  1. HTML, XML源數據選擇及提取的原生支持。
  2. 提供了一系列在spider之間共享的可複用的過濾器(即 Item Loaders),對智能處理爬取數據提供了內置支持。
  3. 經過 feed導出 提供了多格式(JSON、CSV、XML),多存儲後端(FTP、S三、本地文件系統)的內置支持。
  4. 提供了media pipeline,能夠 自動下載 爬取到的數據中的圖片(或者其餘資源)。
  5. 高擴展性。您能夠經過使用 signals ,設計好的API(中間件, extensions, pipelines)來定製實現您的功能。
  6. 內置的中間件及擴展爲下列功能提供了支持:
    1. cookies and session 處理
    2. HTTP 壓縮
    3. HTTP 認證
    4. HTTP 緩存
    5. user-agent模擬
    6. robots.txt
    7. 爬取深度限制
  7. 針對非英語語系中不標準或者錯誤的編碼聲明, 提供了自動檢測以及健壯的編碼支持。
  8. 支持根據模板生成爬蟲。在加速爬蟲建立的同時,保持在大型項目中的代碼更爲一致。
  9. 針對多爬蟲下性能評估、失敗檢測,提供了可擴展的 狀態收集工具 。
  10. 提供 交互式shell終端 , 爲您測試XPath表達式,編寫和調試爬蟲提供了極大的方便。
  11. 提供 System service, 簡化在生產環境的部署及運行。
  12. 內置 Telnet終端 ,經過在Scrapy進程中鉤入Python終端,使您能夠查看而且調試爬蟲。
  13. Logging 爲您在爬取過程當中捕捉錯誤提供了方便。
  14. 支持 Sitemaps 爬取。
  15. 具備緩存的DNS解析器。

 

下一步

吹了半天的Scrapy,時間也到了,若是你們可以喜歡上它,學習的效率必定會成倍提高!下次我會爲你們帶來滿滿的乾貨,並完成更具挑戰性的爬蟲任務,咱們下期再見!

相關文章
相關標籤/搜索