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