芝麻HTTP: Python爬蟲進階之爬蟲框架概述

綜述

爬蟲入門以後,咱們有兩條路能夠走。python

一個是繼續深刻學習,以及關於設計模式的一些知識,強化Python相關知識,本身動手造輪子,繼續爲本身的爬蟲增長分佈式,多線程等功能擴展。另外一條路即是學習一些優秀的框架,先把這些框架用熟,能夠確保可以應付一些基本的爬蟲任務,也就是所謂的解決溫飽問題,而後再深刻學習它的源碼等知識,進一步強化。git

就我的而言,前一種方法其實就是本身動手造輪子,前人其實已經有了一些比較好的框架,能夠直接拿來用,可是爲了本身可以研究得更加深刻和對爬蟲有更全面的瞭解,本身動手去多作。後一種方法就是直接拿來前人已經寫好的比較優秀的框架,拿來用好,首先確保能夠完成你想要完成的任務,而後本身再深刻研究學習。第一種而言,本身探索的多,對爬蟲的知識掌握會比較透徹。第二種,拿別人的來用,本身方便了,但是可能就會沒有了深刻研究框架的心情,還有可能思路被束縛。github

不過我的而言,我本身偏向後者。造輪子是不錯,可是就算你造輪子,你這不也是在基礎類庫上造輪子麼?能拿來用的就拿來用,學了框架的做用是確保本身能夠知足一些爬蟲需求,這是最基本的溫飽問題。假若你一直在造輪子,到最後都沒造出什麼來,別人找你寫個爬蟲研究了這麼長時間了都寫不出來,豈不是有點得不償失?因此,進階爬蟲我仍是建議學習一下框架,做爲本身的幾把武器。至少,咱們能夠作到了,就像你拿了把槍上戰場了,至少,你是能夠打擊敵人的,比你一直在磨刀好的多吧?web

框架概述

博主接觸了幾個爬蟲框架,其中比較好用的是 Scrapy 和PySpider。就我的而言,pyspider上手更簡單,操做更加簡便,由於它增長了 WEB 界面,寫爬蟲迅速,集成了phantomjs,能夠用來抓取js渲染的頁面。Scrapy自定義程度高,比 PySpider更底層一些,適合學習研究,須要學習的相關知識多,不過本身拿來研究分佈式和多線程等等是很是合適的。設計模式

在這裏博主會一一把本身的學習經驗寫出來與你們分享,但願你們能夠喜歡,也但願能夠給你們一些幫助。網絡

PySpider

PySpiderbinux作的一個爬蟲架構的開源化實現。主要的功能需求是:多線程

  • 抓取、更新調度多站點的特定的頁面
  • 須要對頁面進行結構化信息提取
  • 靈活可擴展,穩定可監控

而這也是絕大多數python爬蟲的需求 —— 定向抓取,結構化化解析。可是面對結構迥異的各類網站,單一的抓取模式並不必定能知足,靈活的抓取控制是必須的。爲了達到這個目的,單純的配置文件每每不夠靈活,因而,經過腳本去控制抓取是最後的選擇。
而去重調度,隊列,抓取,異常處理,監控等功能做爲框架,提供給抓取腳本,並保證靈活性。最後加上web的編輯調試環境,以及web任務監控,即成爲了這套框架。架構

pyspider的設計基礎是:以python腳本驅動的抓取環模型爬蟲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主要包括瞭如下組件:

  • 引擎(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等待抓取

結語

對這兩個框架進行基本的介紹以後,接下來我會介紹這兩個框架的安裝以及框架的使用方法,但願對你們有幫助。

相關文章
相關標籤/搜索