Scrapy 爬蟲框架介紹
今天我們開始學習一門新的 Python 框架:Scrapy。Scrapy 是一個爬蟲框架,能幫助我們簡化網絡爬蟲開發,用最少的代碼完成爬蟲項目,同時具備完整爬蟲功能。
1. 爬蟲簡介
網絡爬蟲是一段具有特殊含義的代碼,其功能是模擬用戶在瀏覽器上的操作,發送 HTTP 請求,接收數據,然后解析并保存數據,方便其他應用程序使用和分析。
這個過程中間包含了許多自動化的操作,若使用得當,可以產生大量的經濟價值以及幫助我們減少繁雜的工作。
互聯網上每天都會有無數的爬蟲在網絡上游走,獲取相應網站的數據。這些爬蟲和人一樣,有好有壞,有正義的,也有邪惡的。比如百度 Spider 等搜索引擎爬蟲,為我們提供了信息檢索的最新數據,我們能通過搜索關鍵字找到相應的網站,正是得益于百度 Spider 每天孜孜不倦的工作。搬運相應網站的地址和更新相應的信息數據,這也是必要的爬蟲,許多網站也樂于被百度爬蟲抓取最新數據。
但是也存在許多惡意爬蟲,長時間、大規模的請求特定網站數據,給網站服務器造成了巨大的壓力,影響正常用戶請求,這也是許多網站討厭爬蟲并積極設置反爬蟲策略的原因。
對于個人開發者而言,學好爬蟲技術,對于個人成長方面有著極大的好處:
- 鍛煉個人技能,及時體驗技術帶來的好處:使用簡單的幾行 Python 代碼就能獲取網站數據,這樣的學習曲線遠勝于使用 C/C++ 進行爬蟲開發。這也是很多人選擇 Python 開發爬蟲的原因;
- 在工作和生活上有時候能帶來極大的好處:比如收集數據,完成畢業論文;比如開-發一款 12306 搶票助手,解決回家搶票困難的問題;又或者抓取股票交易數據,幫助我們分析股票走勢等等。事實上,已經有很多人做了這些工作并在 Github 上進行了開源。
事實上,爬蟲的應用還有很多,就不在此逐一說明了。接下來我們介紹 Python 的爬蟲框架以及使用爬蟲框架進行開發的好處。
2. 各種爬蟲框架優缺點對比
下面我們介紹開源界中幾個關注度比較高的 Python 爬蟲框架。所謂關注度高包括 Github 上的點贊數以及文檔的豐富程度。
2.1 Scrapy
Scrapy 框架大概是最火的 Python 爬蟲框架了,這一點可以從它的 Github 點贊數看出來:38k !單純從這個數字就可以看出這是一個超級熱門的框架了。
在 Scrapy 的官方文檔中,對該框架是這么介紹的:
Scrapy is an application framework for crawling web sites and extracting structured data which can be used for a wide range of useful applications, like data mining, information processing or historical archival.
簡單翻譯下就是:
Scrapy 是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。盡管如此,它也可以作為一個通用的 Web 爬蟲框架來開發爬蟲項目。它基于 Twisted 這個流行的異步處理框架,因此具有較高的性能。開發者只需要定制開發幾個模塊就可以輕松的實現一個高性能爬蟲,用來抓取網頁內容,非常方便。下面我總結了一下 Scrapy 框架的幾個優點:
- Scrapy 是異步的,且可以靈活調節并發量;
- 采取可讀性更強的 Xpath,解析網頁速度快;
- 有統一的 Middleware 過濾器;
- 支持 Shell 方式,方便獨立調試;
- 通過管道的方式存入數據庫,靈活方便且可保存為多種形式。
當然,Scrapy 框架也是有不少缺點的,比較明顯的有如下幾點:
-
本身無法實現分布式爬蟲;
-
自身去重效果差,消耗內存,且不能持久化;
-
無法獲取需要執行 js 才能獲取數據的網頁;
-
基于 twisted 框架,如果執行出錯是不會停掉其他任務的,這回導致 Scrapy 在爬取數據出錯后難以察覺。
基于 Scrapy 的這些缺點產生了許多框架的插件來解決。比如 scrapy-redis 解決了 Scrapy 框架的分布式爬取問題; scrapy-splash 插件可以抓取 js 動態渲染內容等等。后面我們也會基于這些插件開發一個完整的分布式爬蟲項目來幫助我們體驗爬蟲的魅力。
2.2 Pyspider
pyspider 是一款國人編寫的功能強大的網絡爬蟲系統,能在瀏覽器界面上進行腳本的編寫,功能的調度和爬取結果的實時查看,后端使用常用的數據庫進行爬取結果的存儲,還能定時設置任務與任務優先級等。總的來說,它的特點如下:
-
具有強大的 webui 界面,并且支持腳本編輯,任務監控,項目管理和結果查看;
-
數據后臺支持 MySQL、MongoDB、Reids、SQLite、Elasticsearch 和 PostgreSQL 等主流關系型和非關系型數據庫;
-
消息隊列支持 RabbitMQ、Redis 等;
-
支持任務優先級,定時,失敗重試等調度方案;
-
支持分布式架構,抓取 js 頁面。
Pyspider 也存在一些明顯的問題:豐富的文檔、成熟的社區,這些都是 pyspider 欠缺的,也造成了 Pyspider 不如 Scrapy 流行的重要原因之一。但 Pyspider 在簡潔易用性上卻是勝過 Scrapy 的,很多初學者也會非常喜歡它提供的 webui 頁面,這也是該框架得以流行的原因之一。
2.3 Cola
Cola 是一個分布式的爬蟲框架,對于用戶來說,只需編寫幾個特定的函數,而無需關注分布式運行的細節。任務會自動分配到多臺機器上,整個過程對用戶是透明的。
但是從 Github 上的用戶的關注度來看,相比上面兩個框架而言,差了不少。整個項目的主要貢獻者只有2個人,且上次一發布 release 版本還是2015年的上古時代。這些都已經充分說明了 Cola 框架正在逐漸走向衰退,不建議在生產環境中使用,其潛在的 Bug 和相關安全風險無法得到及時的更新和修復,但是作為學習爬蟲框架的參考資料還是不錯的,深入研究這樣一個框架的源碼能收獲不少知識。
3. 為什么要學習 Scrapy?
Scrapy 是一款性能強大爬蟲框架,基于 Scrapy 我們可以快速開發出高性能的爬蟲。此外,由于 Scrapy 框架的高度可擴展性,我們可以在該框架簡單改造就能實現自己的業務需求。例如 Scrapy-Redis 插件,短短幾千行代碼就實現 Scrapy 框架的分布式功能。
如果能熟練掌握 Scrapy 框架,我們會具備如下的優勢:
- 基于 Scrapy 框架快速開發出高性能爬蟲,不用擔心爬蟲性能問題;
- 豐富的 Scrapy 文檔、良好的社區以及龐大的用戶群體。這些都是我們選擇 Scrapy 框架的理由;
- 熟練掌握 Scrapy 框架后,可以深入學習 Scrapy 框架源碼,了解一個完整爬蟲框架的組成;在架構設計和代碼風格上,Scrapy 都是極為優秀的。作為初學者的我們可以從中收獲不少,特別是關于 Twisted 框架的運用;
- 高度可定制化。這是 Scrapy 框架的一個極大優勢,通過簡單改造 Scrapy,我們就能實現特點功能的爬蟲。如 Scrapy-Redis 插件,不過數千行代碼,就將 Scrapy 框架擴展成分布式,而且是即插即用型,不用改動 Scrapy 源碼。
看到這些特點后,你還有什么理由不學習 Scrapy 框架呢?
4. 學習基礎
為了學好該框架以及熟練使用 Scrapy 開發爬蟲項目,我們需要具備以下基礎:
- 簡單的網頁基礎,HTML/CSS等;
- Python 基礎;
- 簡單的計算機網絡基礎,比如了解 HTTP 協議、TCP/IP 協議等;
本課程會假定你已經了解或者熟悉上述基礎知識,并在后面不會對一些簡單的問題作出解釋,重點放到剖析這個框架并熟練掌握。
5. 小結
本小節簡單介紹了爬蟲知識以及在 Python 中比較流行的爬蟲框架,重點介紹了 Python 中大火的 Scrapy 框架,這也是我們接下來學習的重點。緊接著描述了學習 Scrapy 框架必備的一些基礎知識 。從下一節起,將開始我們正式的剖析 Scrapy 框架之旅,祝大家旅途愉快。