####1,引言python
《Scrapy的架構初探》一文所講的Spider是整個架構中最定製化的一個部件,Spider負責把網頁內容提取出來,而不一樣數據採集目標的內容結構不同,幾乎須要爲每一類網頁都作定製。咱們有個設想:是否能作一個比較通用的Spider,把定製部分再進一步隔離出去?git
GooSeeker有一個爬蟲羣模式,從技術實現層面來考察的話,其實就是把爬蟲軟件作成一個被動接受任務的執行單元,給他什麼任務他就作什麼任務,也就是說同一個執行單元能夠爬多種不一樣的網站。而分配任務的是GooSeeker會員中心的爬蟲羅盤,實現集中管理分佈執行。github
開源Python即時網絡爬蟲項目一樣也要儘可能實現通用化。主要抓取如下2個重點:網絡
- 網頁內容提取器從外部注入到Spider中,讓Spider變通用:參看《Python即時網絡爬蟲:API說明》,經過API從GooSeeker會員中心得到網頁內容提取器,能夠充分利用MS謀數臺的直觀標註快速生成提取器的能力。
- 抓取目標網址再也不存於Spider,而是從外部得到:GooSeeker有個基於大數據平臺的網址庫系統,還有爬蟲羅盤可觀察網址的抓取狀態,也有用戶界面添加刪除網址,把Spider進一步作成一個執行機構。
下面咱們將進一步講解實現原理,以助於讀者閱讀源碼。架構
####2,爬蟲羣模式示意圖
中間藍色部分就是GooSeeker會員中心的地址庫和爬蟲羅盤。網址和提取規則原本應該硬編碼到Spider中的,如今隔離出來,由會員中心進行管理,那麼Spider就很容易作通用了。ide
####3,通用Spider的主要功能測試
地址庫和提取規則隔離出來之後,Scrapy的Spider能夠專一於如下流程:大數據
- 經過API從GooSeeker會員中心獲取內容提取器:這個API的url能夠硬編碼到Spider中,放在start_urls列表的位置, 這裏原本是放目標網頁地址的,如今換成一個固定的API地址,在這一點上,Spider變通用了
- 在第一個parse()過程,不是解析目標網頁內容,而是把API中得到內容提取器注入到gsExtractor中。
- 在第一個parse()過程,爲第二個API構造一個Request,目的是從GooSeeker會員中心獲取要爬取的網址
- 在第二個parse()過程,用目標網址構造一個Request,這纔是真正的交給Loader去下載目標網頁
- 在第三個parse()過程,利用gsExtractor提取網頁內容
- 在第三個parse()過程,再次爲第二個API構造一個Request,得到下一個目標網址
- 跳到4,一直循環,直到GooSeeker會員中心的地址庫都用完了。
####4,接下來的工做網站
- 按照上述設想編寫和調測Scrapy的通用Spider
- 研究是否能夠更加通用,把GooSeeker的爬蟲羣調度都引入到Spider中,也就是在經過第一個API得到提取器以前再增長一個得到爬蟲羣調度任務的過程,這樣,把全部Spider都變成被動接受任務的工做模式,每一個Spider是不固定抓取規則的。
####5,相關文檔編碼
- Python即時網絡爬蟲項目: 內容提取器的定義
- Scrapy:python3下的第一次運行測試
####6,集搜客GooSeeker開源代碼下載源
- 開源Python即時網絡爬蟲GitHub源
####7,文檔修改歷史
- 2016-07-01:V1.0,首次發佈
- 2016-07-01:V1.1,編輯修改,補充過程描述文字