介紹
大家好!我們從今天開始學習開源爬蟲框架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任務監控,即成為了最終的框架。
優點:
- 支援分散式部署。
- 完全視覺化,對使用者非常友好:WEB 介面編寫除錯指令碼,起停指令碼,監控執行狀態,檢視活動歷史,獲取結果產出。
- 簡單,五分鐘就能上手。指令碼規則簡單,開發效率高。
- 支援抓取JavaScript的頁面。
總之,Pyspider非常強大,強大到更像一個產品而不是一個框架。
缺點:
- URL去重使用資料庫而不是布隆過濾器,億級儲存的db io將導致效率急劇降低。
- 使用上的人性化犧牲了靈活度,定製化能力降低。
Scrapy
介紹:
Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。Scrapy 使用 Twisted這個非同步網路庫來處理網路通訊,架構清晰,並且包含了各種中介軟體介面,可以靈活的完成各種需求。Scratch,是抓取的意思,這個Python的爬蟲框架叫Scrapy,大概也是這個意思吧。
優點:
- 極其靈活的定製化爬取。
- 社群人數多、文件完善。
- URL去重採用布隆過濾器方案。
- 可以處理不完整的HTML,Scrapy已經提供了selectors(一個在lxml的基礎上提供了更高階的介面),可以高效地處理不完整的HTML程式碼。
缺點:
- 不支援分散式部署。
- 原生不支援抓取JavaScript的頁面。
- 全命令列操作,對使用者不友好,需要一定學習週期。
結論
篇幅有限,就先選擇這三個最有代表性的框架進行PK。他們都有遠超別人的優點,比如:Nutch天生的搜尋引擎解決方案、Pyspider產品級的WebUI、Scrapy最靈活的定製化爬取。也都各自致命的缺點,比如Scrapy不支援分散式部署,Pyspider不夠靈活,Nutch和搜尋繫結。究竟該怎麼選擇呢?
我們的目標是做純粹的爬蟲,不是搜尋引擎,所以先把Nutch排除掉,剩下人性化的Pyspider和高可定製的Scrapy。Scrapy的靈活性幾乎能夠讓我們完成任何苛刻的抓取需求,它的“難用”也讓我們不知不覺的研究爬蟲技術。現在還不是享受Pyspider的時候,目前的當務之急是打好基礎,應該學習最接近爬蟲本質的框架,瞭解它的原理,所以把Pyspider也排除掉。
最終,理性的從個人的需求角度對比,還是Scrapy勝出!其實Scrapy還有更多優點:
- HTML, XML源資料選擇及提取的原生支援。
- 提供了一系列在spider之間共享的可複用的過濾器(即 Item Loaders),對智慧處理爬取資料提供了內建支援。
- 通過 feed匯出 提供了多格式(JSON、CSV、XML),多儲存後端(FTP、S3、本地檔案系統)的內建支援。
- 提供了media pipeline,可以 自動下載 爬取到的資料中的圖片(或者其他資源)。
- 高擴充套件性。您可以通過使用 signals ,設計好的API(中介軟體, extensions, pipelines)來定製實現您的功能。
- 內建的中介軟體及擴充套件為下列功能提供了支援:
- cookies and session 處理
- HTTP 壓縮
- HTTP 認證
- HTTP 快取
- user-agent模擬
- robots.txt
- 爬取深度限制
- 針對非英語語系中不標準或者錯誤的編碼宣告, 提供了自動檢測以及健壯的編碼支援。
- 支援根據模板生成爬蟲。在加速爬蟲建立的同時,保持在大型專案中的程式碼更為一致。
- 針對多爬蟲下效能評估、失敗檢測,提供了可擴充套件的 狀態收集工具 。
- 提供 互動式shell終端 , 為您測試XPath表示式,編寫和除錯爬蟲提供了極大的方便。
- 提供 System service, 簡化在生產環境的部署及執行。
- 內建 Telnet終端 ,通過在Scrapy程式中鉤入Python終端,使您可以檢視並且除錯爬蟲。
- Logging 為您在爬取過程中捕捉錯誤提供了方便。
- 支援 Sitemaps 爬取。
- 具有快取的DNS解析器。
下一步
吹了半天的Scrapy,時間也到了,如果大家能夠喜歡上它,學習的效率一定會成倍提升!下次我會為大家帶來滿滿的乾貨,並完成更具挑戰性的爬蟲任務,我們下期再見!