開源爬蟲框架各有什麼優缺點?
作者:老夏
開發網路爬蟲應該選擇Nutch、Crawler4j、WebMagic、scrapy、WebCollector還是其他的?這裡按照我的經驗隨便扯淡一下:上面說的爬蟲,基本可以分3類:
1.分散式爬蟲:Nutch
2.JAVA單機爬蟲:Crawler4j、WebMagic、WebCollector
3. 非JAVA單機爬蟲:scrapy
Python 爬蟲的工具列表 附Github程式碼下載連結
33款可用來抓資料的開源爬蟲軟體工具
第一類:分散式爬蟲
爬蟲使用分散式,主要是解決兩個問題:
1)海量URL管理
2)網速
現在比較流行的分散式爬蟲,是Apache的Nutch。但是對於大多數使用者來說,Nutch是這幾類爬蟲裡,最不好的選擇,理由如下:
1)Nutch是為搜尋引擎設計的爬蟲,大多數使用者是需要一個做精準資料爬取(精抽取)的爬蟲。Nutch執行的一套流程裡,有三分之二是為了搜尋引擎而設計的。對精抽取沒有太大的意義。也就是說,用Nutch做資料抽取,會浪費很多的時間在不必要的計算上。而且如果你試圖通過對Nutch進行二次開發,來使得它適用於精抽取的業務,基本上就要破壞Nutch的框架,把Nutch改的面目全非,有修改Nutch的能力,真的不如自己重新寫一個分散式爬蟲框架了。
2)Nutch依賴hadoop執行,hadoop本身會消耗很多的時間。如果叢集機器數量較少,爬取速度反而不如單機爬蟲快。
3)Nutch雖然有一套外掛機制,而且作為亮點宣傳。可以看到一些開源的Nutch外掛,提供精抽取的功能。但是開發過Nutch外掛的人都知道,Nutch的外掛系統有多蹩腳。利用反射的機制來載入和呼叫外掛,使得程式的編寫和除錯都變得異常困難,更別說在上面開發一套複雜的精抽取系統了。而且Nutch並沒有為精抽取提供相應的外掛掛載點。Nutch的外掛有隻有五六個掛載點,而這五六個掛載點都是為了搜尋引擎服務的,並沒有為精抽取提供掛載點。大多數Nutch的精抽取外掛,都是掛載在“頁面解析”(parser)這個掛載點的,這個掛載點其實是為了解析連結(為後續爬取提供URL),以及為搜尋引擎提供一些易抽取的網頁資訊(網頁的meta資訊、text文字)。
4)用Nutch進行爬蟲的二次開發,爬蟲的編寫和除錯所需的時間,往往是單機爬蟲所需的十倍時間不止。瞭解Nutch原始碼的學習成本很高,何況是要讓一個團隊的人都讀懂Nutch原始碼。除錯過程中會出現除程式本身之外的各種問題(hadoop的問題、hbase的問題)。
5)很多人說Nutch2有gora,可以持久化資料到avro檔案、hbase、mysql等。很多人其實理解錯了,這裡說的持久化資料,是指將URL資訊(URL管理所需要的資料)存放到avro、hbase、mysql。並不是你要抽取的結構化資料。其實對大多數人來說,URL資訊存在哪裡無所謂。
6)Nutch2的版本目前並不適合開發。官方現在穩定的Nutch版本是nutch2.2.1,但是這個版本綁定了gora-0.3。如果想用hbase配合nutch(大多數人用nutch2就是為了用hbase),只能使用0.90版本左右的hbase,相應的就要將hadoop版本降到hadoop 0.2左右。而且nutch2的官方教程比較有誤導作用,Nutch2的教程有兩個,分別是Nutch1.x和Nutch2.x,這個Nutch2.x官網上寫的是可以支援到hbase 0.94。但是實際上,這個Nutch2.x的意思是Nutch2.3之前、Nutch2.2.1之後的一個版本,這個版本在官方的SVN中不斷更新。而且非常不穩定(一直在修改)。
所以,如果你不是要做搜尋引擎,儘量不要選擇Nutch作為爬蟲。有些團隊就喜歡跟風,非要選擇Nutch來開發精抽取的爬蟲,其實是衝著Nutch的名氣(Nutch作者是Doug Cutting),當然最後的結果往往是專案延期完成。
如果你是要做搜尋引擎,Nutch1.x是一個非常好的選擇。Nutch1.x和solr或者es配合,就可以構成一套非常強大的搜尋引擎了。如果非要用Nutch2的話,建議等到Nutch2.3釋出再看。目前的Nutch2是一個非常不穩定的版本。
第二類:JAVA單機爬蟲
這裡把JAVA爬蟲單獨分為一類,是因為JAVA在網路爬蟲這塊的生態圈是非常完善的。相關的資料也是最全的。這裡可能有爭議,我只是隨便扯淡。
其實開源網路爬蟲(框架)的開發非常簡單,難問題和複雜的問題都被以前的人解決了(比如DOM樹解析和定位、字符集檢測、海量URL去重),可以說是毫無技術含量。包括Nutch,其實Nutch的技術難點是開發hadoop,本身程式碼非常簡單。網路爬蟲從某種意義來說,類似遍歷本機的檔案,查詢檔案中的資訊。沒有任何難度可言。之所以選擇開源爬蟲框架,就是為了省事。比如爬蟲的URL管理、執行緒池之類的模組,誰都能做,但是要做穩定也是需要一段時間的除錯和修改的。
對於爬蟲的功能來說。使用者比較關心的問題往往是:
1)爬蟲支援多執行緒麼、爬蟲能用代理麼、爬蟲會爬取重複資料麼、爬蟲能爬取JS生成的資訊麼?
不支援多執行緒、不支援代理、不能過濾重複URL的,那都不叫開源爬蟲,那叫迴圈執行http請求。
能不能爬js生成的資訊和爬蟲本身沒有太大關係。爬蟲主要是負責遍歷網站和下載頁面。爬js生成的資訊和網頁資訊抽取模組有關,往往需要通過模擬瀏覽器(htmlunit,selenium)來完成。這些模擬瀏覽器,往往需要耗費很多的時間來處理一個頁面。所以一種策略就是,使用這些爬蟲來遍歷網站,遇到需要解析的頁面,就將網頁的相關資訊提交給模擬瀏覽器,來完成JS生成資訊的抽取。
2)爬蟲可以爬取ajax資訊麼?
網頁上有一些非同步載入的資料,爬取這些資料有兩種方法:使用模擬瀏覽器(問題1中描述過了),或者分析ajax的http請求,自己生成ajax請求的url,獲取返回的資料。如果是自己生成ajax請求,使用開源爬蟲的意義在哪裡?其實是要用開源爬蟲的執行緒池和URL管理功能(比如斷點爬取)。
如果我已經可以生成我所需要的ajax請求(列表),如何用這些爬蟲來對這些請求進行爬取?
爬蟲往往都是設計成廣度遍歷或者深度遍歷的模式,去遍歷靜態或者動態頁面。爬取ajax資訊屬於deep web(深網)的範疇,雖然大多數爬蟲都不直接支援。但是也可以通過一些方法來完成。比如WebCollector使用廣度遍歷來遍歷網站。爬蟲的第一輪爬取就是爬取種子集合(seeds)中的所有url。簡單來說,就是將生成的ajax請求作為種子,放入爬蟲。用爬蟲對這些種子,進行深度為1的廣度遍歷(預設就是廣度遍歷)。
3)爬蟲怎麼爬取要登陸的網站?
這些開源爬蟲都支援在爬取時指定cookies,模擬登陸主要是靠cookies。至於cookies怎麼獲取,不是爬蟲管的事情。你可以手動獲取、用http請求模擬登陸或者用模擬瀏覽器自動登陸獲取cookie。
4)爬蟲怎麼抽取網頁的資訊?
開源爬蟲一般都會整合網頁抽取工具。主要支援兩種規範:CSS SELECTOR和XPATH。至於哪個好,這裡不評價。
5)爬蟲怎麼儲存網頁的資訊?
有一些爬蟲,自帶一個模組負責持久化。比如webmagic,有一個模組叫pipeline。通過簡單地配置,可以將爬蟲抽取到的資訊,持久化到檔案、資料庫等。還有一些爬蟲,並沒有直接給使用者提供資料持久化的模組。比如crawler4j和webcollector。讓使用者自己在網頁處理模組中新增提交資料庫的操作。至於使用pipeline這種模組好不好,就和操作資料庫使用ORM好不好這個問題類似,取決於你的業務。
6)爬蟲被網站封了怎麼辦?
爬蟲被網站封了,一般用多代理(隨機代理)就可以解決。但是這些開源爬蟲一般沒有直接支援隨機代理的切換。所以使用者往往都需要自己將獲取的代理,放到一個全域性陣列中,自己寫一個代理隨機獲取(從陣列中)的程式碼。
7)網頁可以呼叫爬蟲麼?
爬蟲的呼叫是在Web的服務端呼叫的,平時怎麼用就怎麼用,這些爬蟲都可以使用。
8)爬蟲速度怎麼樣?
單機開源爬蟲的速度,基本都可以講本機的網速用到極限。爬蟲的速度慢,往往是因為使用者把執行緒數開少了、網速慢,或者在資料持久化時,和資料庫的互動速度慢。而這些東西,往往都是使用者的機器和二次開發的程式碼決定的。這些開源爬蟲的速度,都很可以。
9)明明程式碼寫對了,爬不到資料,是不是爬蟲有問題,換個爬蟲能解決麼?
如果程式碼寫對了,又爬不到資料,換其他爬蟲也是一樣爬不到。遇到這種情況,要麼是網站把你封了,要麼是你爬的資料是javascript生成的。爬不到資料通過換爬蟲是不能解決的。
10)哪個爬蟲可以判斷網站是否爬完、那個爬蟲可以根據主題進行爬取?
爬蟲無法判斷網站是否爬完,只能儘可能覆蓋。
至於根據主題爬取,爬蟲之後把內容爬下來才知道是什麼主題。所以一般都是整個爬下來,然後再去篩選內容。如果嫌爬的太泛,可以通過限制URL正則等方式,來縮小一下範圍。
11)哪個爬蟲的設計模式和構架比較好?
設計模式純屬扯淡。說軟體設計模式好的,都是軟體開發完,然後總結出幾個設計模式。設計模式對軟體開發沒有指導性作用。用設計模式來設計爬蟲,只會使得爬蟲的設計更加臃腫。
至於構架,開源爬蟲目前主要是細節的資料結構的設計,比如爬取執行緒池、任務佇列,這些大家都能控制好。爬蟲的業務太簡單,談不上什麼構架。
所以對於JAVA開源爬蟲,我覺得,隨便找一個用的順手的就可以。如果業務複雜,拿哪個爬蟲來,都是要經過複雜的二次開發,才可以滿足需求。
第三類:非JAVA單機爬蟲
在非JAVA語言編寫的爬蟲中,有很多優秀的爬蟲。這裡單獨提取出來作為一類,並不是針對爬蟲本身的質量進行討論,而是針對larbin、scrapy這類爬蟲,對開發成本的影響。
先說python爬蟲,python可以用30行程式碼,完成JAVA 50行程式碼乾的任務。python寫程式碼的確快,但是在除錯程式碼的階段,python程式碼的除錯往往會耗費遠遠多於編碼階段省下的時間。使用python開發,要保證程式的正確性和穩定性,就需要寫更多的測試模組。當然如果爬取規模不大、爬取業務不復雜,使用scrapy這種爬蟲也是蠻不錯的,可以輕鬆完成爬取任務。
對於C++爬蟲來說,學習成本會比較大。而且不能只計算一個人的學習成本,如果軟體需要團隊開發或者交接,那就是很多人的學習成本了。軟體的除錯也不是那麼容易。
還有一些ruby、php的爬蟲,這裡不多評價。的確有一些非常小型的資料採集任務,用ruby或者php很方便。但是選擇這些語言的開源爬蟲,一方面要調研一下相關的生態圈,還有就是,這些開源爬蟲可能會出一些你搜不到的BUG(用的人少、資料也少)
文章來源:36大資料
相關推薦
開源爬蟲框架各有什麼優缺點?
作者:老夏 開發網路爬蟲應該選擇Nutch、Crawler4j、WebMagic、scrapy、WebCollector還是其他的?這裡按照我的經驗隨便扯淡一下:上面說的爬蟲,基本可以分3類: 1.分散式爬蟲:Nutch 2.JAVA單機爬蟲:Cr
開源爬蟲框架哪家強?是騾子是馬,拉出來溜溜就知道了!
ide 解決 過濾器 研究 基礎上 AS python 令行 log Project Language Star Watch Fork Nutch Java 1111 195 808 webmagic Java 4216 618 2306 WebColl
開源爬蟲框架大對比
介紹 大家好!我們從今天開始學習開源爬蟲框架Scrapy,如果你看過《手把手》系列的前兩篇,那麼今天的內容就非常容易理解了。細心的讀者也許會有疑問,為什麼不學出身名門的Apache頂級專案Nutch,或者人氣飆升的國內大神開發的Pyspider等框架呢?原因很簡單,我們
ArrayList 和 LinkedList 在效能上各有優缺點
1.對 ArrayList 和 LinkedList 而言,在列表末尾增加一個元素所花的開銷都是固定的。對 ArrayList 而言,主要是在內部陣列中增加一項,指向所新增的元素,偶 爾可能會導致對陣列重新進行分配;而對 LinkedList 而言,這個開銷是統一的,分配一個
開發一款開源爬蟲框架系列(二):設計爬蟲架構
既然是構建分散式爬蟲架構,分散式說明爬蟲能在多臺機器同時執行,所以一定是多客戶端的,客戶端主要用於下載網頁,內容會放入佇列,多客戶端就有可能執行在不同的作業系統不同的語言環境,所以我們讓它暫時支援java和scala兩種依賴jvm的語言,不用區分平臺。提到客戶端也一定意味著有服務端的存在,服務端主要用於解
開發一款開源爬蟲框架系列(一):分析nutch,scrapy的爬蟲設計
1、Scrapy Engine(Scrapy引擎) Scrapy引擎是用來控制整個系統的資料處理流程,並進行事務處理的觸發。更多的詳細內容可以看下面的資料處理流程。 2、Scheduler(排程) 排程程式從Scrapy引擎接受請求並排序列入佇列,並在Scrapy引擎發出請求後返還給他們。 3、D
開發一款開源爬蟲框架系列(六):爬蟲分散式化RPC
最近終於有部分時間繼續開發爬蟲,主要的任務是客戶端和伺服器端分離,這就涉及到遠端呼叫的問題,所以研究了RPC,主要物件是Hessian、JMI、Dubbo、Thrift。進而想用幾篇博文分享一下幾種遠端呼叫協議的一些東西,以後再接著聊爬蟲。有興趣可以訪問我的爬蟲專案:
開源JAVA單機爬蟲框架簡介,優缺點分析
網際網路營銷時代,獲取海量資料成為營銷推廣的關鍵。而獲得資料的最佳方式就是利用爬蟲去抓取。但是爬蟲的使用少不了代理ip太陽HTTP的支撐。當然網路上現在有很多開源爬蟲,大大方便了大家使用。但是開源網路爬蟲也是有優點也有缺點,清晰認知這一點才能達成自己的目標。對於爬蟲的功能來說。使用者比較關心的問題往往是:1)
使用goroutine+channel和java多線程+queue隊列的方式開發各有什麽優缺點?
多線程 nec ref 線程安全 dex ood .net 結構 使用 我感覺很多項目使用java或者c的多線程庫+線程安全的queue數據結構基本上可以實現goroutine+channel開發能達到的需求,所以請問一下為什麽說golang更適合並發服務端的開發呢?使用g
各大主流程式語言-常用爬蟲框架以及優劣分析
關注微信公眾號:(DT資料技術博文),檢視更多JAVA爬蟲、大資料、人工智慧技術. 一、前言 目前市場上爬蟲框架有很多,不同語言不同型別的爬蟲框架都有,然而在開發預研的時候對於選擇那種 框架對於很多開發者來說尤為頭疼; 本篇主要總結一下市場上主流的開
Redis 和 Memcached 各有什麼優缺點,主要的應用場景是什麼樣的?
連結:http://www.zhihu.com/question/19829601/answer/880692071. MySql+Memcached架構的問題 實際MySQL是適合進行海量資料儲存的,通過Memcached將熱點資料載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務
Angular、React、Vue.js 等 6 大主流前端框架都有什麼優缺點?
Ember.js可能是最固執己見的主流框架,這也是它最大的弱點。雖然社群是開放的並且接受投資,但是仍然需要找到一個正確的方式來擺脫下滑的趨勢,這可能是具有挑戰性的問題。擁有一個豐富的第三方社群也可能具有挑戰性。由於沒有開箱即用的UX元件,這很可能會讓你使用第三方套件。你可能會發現,雖然這些套件並不全面,你將需
為什麼要前後端分離?各有什麼優缺點?
一、前端 前後端分離已成為網際網路專案開發的業界標準使用方式,通過nginx+tomcat的方式(也可以中間加一個nodejs)有效的進行解耦,並且前後端分離會為以後的大型分散式架構、彈性計算架構、微服務架構、多端化服務(多種客戶端,例如:瀏覽器,車載終端,安
Nginx 和 Apache 各有什麼優缺點
1、作為 Web 伺服器:相比 Apache,Nginx 使用更少的資源,支援更多的併發連線,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。在高連線併發的情況下,Nginx是Apache伺服器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平臺之一. 能夠支援
I/O埠的編址方式有幾種?各有什麼優缺點?
答:有兩種: 獨立編址和統一編址。 1.獨立編址 (專用的I/O埠編址)----儲存器和I/O埠在兩個獨立的地址空間中 (1)優點:I/O埠的地址碼較短,譯碼電路簡單,儲存器同I/O埠的操作指令不同,程式比較清晰; 儲存器和I/O埠的控制結構相互獨立,可以分別設計
Express和koa各有啥優缺點?
1. Koa 雖然同它哥 Express 說的一樣,是 Web Framework。不過從架構功能設計和架構設計上看,它更像它舅舅(原諒我親戚關係懵了)── Connect。更多是一箇中間件框架,其提供的是一個架子,而幾乎所有的功能都需要由第三方中介軟體完成。 2. Express 更為貼近 Web Fram
幾大數學軟體各有什麼優缺點?
其實數學軟體之間是不太好比較的,因為面向的使用者群體完全不同,彼此並不太構成競爭。 以 Matlab 為例,一般來說它被看成是最重要的數學軟體,可是事實上 Matlab 更象是一個程式設計環境,而不是一個軟體。如果要比較,Matlab 應該和 python 之類做比較更好。
爬蟲框架分析之各語言爬蟲框架
> 看看有哪些爬蟲框架 #一、前言 目前市場上爬蟲框架有很多,不同語言不同型別的爬蟲框架都有,然而在開發預研的時候對於選擇那種 框架對於很多開發者來說尤為頭疼; 本篇主要總結一下市場上主流的開發語言中有哪些主流的爬蟲框架,以及爬蟲框架的優劣;希望在對你在選擇合適爬蟲
Python 和 Scrapy 爬蟲框架部署
python scrapy 爬蟲框架 Scrapy 是采用Python 開發的一個快速可擴展的抓取WEB 站點內容的爬蟲框架。安裝依賴 yum install gcc gcc-c++ openssl mysql mysql-server libffi* libxml* libxml2 l
Scrapy 爬蟲框架入門案例詳解
tin mon setting 爬蟲框架 finished perror project 原因 create 歡迎大家關註騰訊雲技術社區-博客園官方主頁,我們將持續在博客園為大家推薦技術精品文章哦~ 作者:崔慶才 Scrapy入門 本篇會通過介紹一