閱讀891 返回首頁    go gooseeker集搜客


讓Scrapy的Spider更通用

1,引言

《Scrapy的架構初探》一文所講的Spider是整個架構中最定製化的一個部件,Spider負責把網頁內容提取出來,而不同數據采集目標的內容結構不一樣,幾乎需要為每一類網頁都做定製。我們有個設想:是否能做一個比較通用的Spider,把定製部分再進一步隔離出去?

GooSeeker有一個爬蟲群模式,從技術實現層麵來考察的話,其實就是把爬蟲軟件做成一個被動接受任務的執行單元,給他什麼任務他就做什麼任務,也就是說同一個執行單元可以爬多種不同的網站。而分配任務的是GooSeeker會員中心的爬蟲羅盤,實現集中管理分布執行。

開源Python即時網絡爬蟲項目同樣也要盡量實現通用化。主要抓取以下2個重點:

  • 網頁內容提取器從外部注入到Spider中,讓Spider變通用:參看《Python即時網絡爬蟲:API說明》,通過API從GooSeeker會員中心獲得網頁內容提取器,可以充分利用MS謀數台的直觀標注快速生成提取器的能力。
  • 抓取目標網址不再存於Spider,而是從外部獲得:GooSeeker有個基於大數據平台的網址庫係統,還有爬蟲羅盤可觀察網址的抓取狀態,也有用戶界麵添加刪除網址,把Spider進一步做成一個執行機構。

下麵我們將進一步講解實現原理,以助於讀者閱讀源碼。

2,爬蟲群模式示意圖

中間藍色部分就是GooSeeker會員中心的地址庫和爬蟲羅盤。網址和提取規則本來應該硬編碼到Spider中的,現在隔離出來,由會員中心進行管理,那麼Spider就很容易做通用了。

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,接下來的工作

  1. 按照上述設想編寫和調測Scrapy的通用Spider
  2. 研究是否可以更加通用,把GooSeeker的爬蟲群調度都引入到Spider中,也就是在通過第一個API獲得提取器之前再增加一個獲得爬蟲群調度任務的過程,這樣,把所有Spider都變成被動接受任務的工作模式,每個Spider是不固定抓取規則的。

5,相關文檔

  1. Python即時網絡爬蟲項目: 內容提取器的定義
  2. Scrapy:python3下的第一次運行測試

6,集搜客GooSeeker開源代碼下載源

  1. 開源Python即時網絡爬蟲GitHub源

7,文檔修改曆史

  • 2016-06-27:V1.0,首次發布
  • 2016-06-27:V1.1,編輯修改,補充過程描述文字
若有疑問可以或集搜客網絡爬蟲

最後更新:2017-01-09 14:08:11

  上一篇:go Python即時網絡爬蟲:API說明—下載內容提取器
  下一篇:go 1分鍾快速生成用於網頁內容提取的xslt