Python 爬虫进阶一之爬虫框架概述
綜述
爬蟲入門之后,我們有兩條路可以走。 一個是繼續深入學習,以及關于設計模式的一些知識,強化 Python 相關知識,自己動手造輪子,繼續為自己的爬蟲增加分布式,多線程等功能擴展。另一條路便是學習一些優秀的框架,先把這些框架用熟,可以確保能夠應付一些基本的爬蟲任務,也就是所謂的解決溫飽問題,然后再深入學習它的源碼等知識,進一步強化。 就個人而言,前一種方法其實就是自己動手造輪子,前人其實已經有了一些比較好的框架,可以直接拿來用,但是為了自己能夠研究得更加深入和對爬蟲有更全面的了解,自己動手去多做。后一種方法就是直接拿來前人已經寫好的比較優秀的框架,拿來用好,首先確??梢酝瓿赡阆胍瓿傻娜蝿?#xff0c;然后自己再深入研究學習。第一種而言,自己探索的多,對爬蟲的知識掌握會比較透徹。第二種,拿別人的來用,自己方便了,可是可能就會沒有了深入研究框架的心情,還有可能思路被束縛。 不過個人而言,我自己偏向后者。造輪子是不錯,但是就算你造輪子,你這不也是在基礎類庫上造輪子么?能拿來用的就拿來用,學了框架的作用是確保自己可以滿足一些爬蟲需求,這是最基本的溫飽問題。倘若你一直在造輪子,到最后都沒造出什么來,別人找你寫個爬蟲研究了這么長時間了都寫不出來,豈不是有點得不償失?所以,進階爬蟲我還是建議學習一下框架,作為自己的幾把武器。至少,我們可以做到了,就像你拿了把槍上戰場了,至少,你是可以打擊敵人的,比你一直在磨刀好的多吧?
框架概述
博主接觸了幾個爬蟲框架,其中比較好用的是 Scrapy 和 PySpider。就個人而言,pyspider 上手更簡單,操作更加簡便,因為它增加了 WEB 界面,寫爬蟲迅速,集成了 phantomjs,可以用來抓取 js 渲染的頁面。Scrapy 自定義程度高,比 PySpider 更底層一些,適合學習研究,需要學習的相關知識多,不過自己拿來研究分布式和多線程等等是非常合適的。 在這里博主會一一把自己的學習經驗寫出來與大家分享,希望大家可以喜歡,也希望可以給大家一些幫助。
PySpider
PySpider 是 binux 做的一個爬蟲架構的開源化實現。主要的功能需求是:
- 抓取、更新調度多站點的特定的頁面
- 需要對頁面進行結構化信息提取
- 靈活可擴展,穩定可監控
而這也是絕大多數 python 爬蟲的需求 —— 定向抓取,結構化化解析。但是面對結構迥異的各種網站,單一的抓取模式并不一定能滿足,靈活的抓取控制是必須的。為了達到這個目的,單純的配置文件往往不夠靈活,于是,通過腳本去控制抓取是最后的選擇。 而去重調度,隊列,抓取,異常處理,監控等功能作為框架,提供給抓取腳本,并保證靈活性。最后加上 web 的編輯調試環境,以及 web 任務監控,即成為了這套框架。 pyspider 的設計基礎是:以 python 腳本驅動的抓取環模型爬蟲
- 通過 python 腳本進行結構化信息的提取,follow 鏈接調度抓取控制,實現最大的靈活性
- 通過 web 化的腳本編寫、調試環境。web 展現調度狀態
- 抓取環模型成熟穩定,模塊間相互獨立,通過消息隊列連接,從單進程到多機分布式靈活拓展
 pyspider 的架構主要分為 scheduler(調度器), fetcher(抓取器), processor(腳本執行):
- 各個組件間使用消息隊列連接,除了 scheduler 是單點的,fetcher 和 processor 都是可以多實例分布式部署的。 scheduler 負責整體的調度控制
- 任務由 scheduler 發起調度,fetcher 抓取網頁內容, processor 執行預先編寫的 python 腳本,輸出結果或產生新的提鏈任務(發往 scheduler),形成閉環。
- 每個腳本可以靈活使用各種 python 庫對頁面進行解析,使用框架 API 控制下一步抓取動作,通過設置回調控制解析動作。
Scrapy
Scrapy 是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。 其最初是為了頁面抓取 (更確切來說,網絡抓取) 所設計的, 也可以應用在獲取 API 所返回的數據 (例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。Scrapy 用途廣泛,可以用于數據挖掘、監測和自動化測試
Scrapy 使用了 Twisted 異步網絡庫來處理網絡通訊。整體架構大致如下
 
 Scrapy 主要包括了以下組件:
- 引擎 (Scrapy): 用來處理整個系統的數據流處理,觸發事務 (框架核心)
- 調度器 (Scheduler): 用來接受引擎發過來的請求,壓入隊列中,并在引擎再次請求的時候返回??梢韵胂癯梢粋€ URL(抓取網頁的網址或者說是鏈接)的優先隊列,由它來決定下一個要抓取的網址是什么,同時去除重復的網址
- 下載器 (Downloader): 用于下載網頁內容,并將網頁內容返回給蜘蛛 (Scrapy 下載器是建立在 twisted 這個高效的異步模型上的)
- 爬蟲 (Spiders): 爬蟲是主要干活的,用于從特定的網頁中提取自己需要的信息,即所謂的實體 (Item)。用戶也可以從中提取出鏈接,讓 Scrapy 繼續抓取下一個頁面
- 項目管道 (Pipeline): 負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析后,將被發送到項目管道,并經過幾個特定的次序處理數據。
- 下載器中間件 (Downloader Middlewares): 位于 Scrapy 引擎和下載器之間的框架,主要是處理 Scrapy 引擎與下載器之間的請求及響應。
- 爬蟲中間件 (Spider Middlewares): 介于 Scrapy 引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
- 調度中間件 (Scheduler Middewares): 介于 Scrapy 引擎和調度之間的中間件,從 Scrapy 引擎發送到調度的請求和響應。
Scrapy 運行流程大概如下:
- 首先,引擎從調度器中取出一個鏈接 (URL) 用于接下來的抓取
- 引擎把 URL 封裝成一個請求 (Request) 傳給下載器,下載器把資源下載下來,并封裝成應答包 (Response)
- 然后,爬蟲解析 Response
- 若是解析出實體(Item), 則交給實體管道進行進一步的處理。
- 若是解析出的是鏈接(URL), 則把 URL 交給 Scheduler 等待抓取
總結
以上是生活随笔為你收集整理的Python 爬虫进阶一之爬虫框架概述的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: VC编译连接选项详解
- 下一篇: 打开文件管理器_【教程】模组管理器3.1
