手把手教你寫網路爬蟲(3):開源爬蟲框架對比

来源:https://www.cnblogs.com/tuohai666/archive/2018/04/17/8861422.html
-Advertisement-
Play Games

手把手教你寫網路爬蟲(3) 作者:拓海 摘要:從零開始寫爬蟲,初學者的速成指南! 封面: 介紹 大家好!我們從今天開始學習開源爬蟲框架Scrapy,如果你看過《手把手》系列的前兩篇,那麼今天的內容就非常容易理解了。細心的讀者也許會有疑問,為什麼不學出身名門的Apache頂級項目Nutch,或者人氣飆 ...


 

手把手教你寫網路爬蟲(3)

作者:拓海

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

封面:

 

 

介紹

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

Project

Language

Star

Watch

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、S3、本地文件系統)的內置支持。
  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,時間也到了,如果大家能夠喜歡上它,學習的效率一定會成倍提升!下次我會為大家帶來滿滿的乾貨,並完成更具挑戰性的爬蟲任務,我們下期再見!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個模塊還漏了一個稍微複雜點的API,就是app.render,首先看官網的定義: app.render(view, [locals], callback) view為對應的文件名,locals為一個配置對象,callback為解析完成的回調函數。 涉及到的全局屬性有 view:預設為一個內置模塊, ...
  • 對於前端初學者來說,css浮動部分的知識是一塊比較難以理解的部分,下麵我將把我學習過程中的心得分享給大家。 導讀: 1.css塊級元素講解 2.css中浮動是如何產生的 3.出現浮動後,如何清除浮動(本文將涉及到多種清除浮動的方法) 博客正文: 1.css塊級元素講解 常見的塊級元素主要有以下幾種: ...
  • “金三銀四,金九銀十”,都是要收穫的季節。面對各種面試題,各種概念、原理都要去記,挺枯燥的。本文是面向面試題和實際使用談一下Promise。 Promise是什麼? Promise是JS非同步編程中的重要概念,非同步抽象處理對象,是目前比較流行Javascript非同步編程解決方案之一。這句話說的很明白了 ...
  • 一、概念 享元模式是對象的結構模式,它以共用的方式高效的支持大量的細粒度對象,減少對象的數量,並達到節約記憶體的目的。 享元對象能夠做到共用的關鍵,主要是區分了內部狀態和外部狀態,內部狀態是對象是在建立時就已確定了,且它不隨環境的改變而有所不同,所以這些內部狀態就可以共用,而外部狀態是會隨著環境的變化 ...
  • 開發部署 Spring Cloud 微服務框架,需要先確定 Spring Cloud 的相關環境版本,主要包含:Spring Cloud、Spring Cloud Netflix、JDK、JRE、Java Version等相關版本,以及環境的配置。 現在最新版本 Java 10、Spring Boo ...
  • layout: post title: 2016 03 22 信息系統實踐手記3 按業務展開的代碼剝離 key: 20160322 tags: 測試 重構 方面編程 優化 持續集成 master PO 開發 剝離 modify_date: 2016 03 22 信息系統實踐手記3 按業務展開的代碼剝 ...
  • 在面向對象的設計中,我們應當遵循以下六大原則,只有掌握了這些原則,才能更好的理解設計模式。 1:單一職責原則(Single Responsibility Principle 簡稱 :SRP) : 就一個類而言,應該僅有一個引起他變化的原因 2:介面隔離原則(Interface Segregation ...
  • layout: post title: 2016 03 11 信息系統實踐手記2 客戶端啟動速度調優思路 key: 20160311 tags: 客戶端 調優 測試 伺服器 GIS WPF 模塊 壓力 瓶頸 modify_date: 2016 03 11 信息系統實踐手記2 客戶端啟動速度調優思路 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...