1. 程式人生 > 實用技巧 >go爬蟲框架colly原始碼以及軟體架構分析

go爬蟲框架colly原始碼以及軟體架構分析

colly介紹

Lightning Fast and Elegant Scraping Framework for Gophers

Colly provides a clean interface to write any kind of crawler/scraper/spider. 官方的介紹,gocolly快速優雅,在單核上每秒可以發起1K以上請求;以回撥函式的形式提供了一組介面,可以實現任意型別的爬蟲;依賴goquery庫可以像jquery一樣選擇web元素。

安裝使用

colly 官網



架構特點

瞭解爬蟲的都知道一個爬蟲請求的生命週期

  1. 構建請求
  2. 傳送請求
  3. 獲取文件或資料
  4. 解析文件或清洗資料
  5. 資料處理或持久化

scrapy的設計理念是將上面的每一個步驟抽離出來,然後做出元件的形式, 最後通過排程組成流水線的工作形式。 我們看一下scrapy的架構圖, 這裡只是簡單的介紹下, 後面有時間,我深入介紹scrapy

如圖,downloader負責請求獲取頁面,spiders中寫具體解析文件的邏輯,item PipeLine資料最後處理, 中間有一些中介軟體,可以一些功能的裝飾。比如,代理,請求頻率等。

我們介紹一下colly的架構特點 colly的邏輯更像是面向過程程式設計的, colly的邏輯就是按上面生命週期的順序管道處理, 只是在不同階段,加上回調函式進行過濾的時候進行處理。

下面也按照這個邏輯進行介紹

原始碼分析

先給一個?


這是官方給的示例, 可以看到colly.NewCollector建立一個收集器, colly的所有處理邏輯都是以Collector為核心進行操作的。

我們看一下 Collector結構體的定義


上面的具體屬性我就不介紹了, 看看註釋也就懂了。 我就先按上面的示例解釋原始碼


回撥函式如何用? 什麼作用? 先賣個關子, c.Visit("https://hackerspaces.org/")是入口, 那就先分析它,


?又出來一個新的method,


上面很大篇幅都是檢查, 現在還在 request的階段, 還沒有response,看c.fetch

fetch就是colly的核心內容


看到了, 這就是一個完整的流程。 好, 我們看一下回調函式做了什麼?


核心就 for _, f := range c.requestCallbacks { f(r) }這句,下面我每個回撥函式都介紹一下

回撥函式

這裡介紹按生命週期的順序來介紹

1. OnRequest


2. OnResponse & handleOnResponse


3. OnHTML & handleOnHTML


4. OnXML & handleOnXML

4. OnXML & handleOnXML


5. OnError & handleOnError

這個會多次呼叫, 如果 err != nil情況下呼叫比較多, 爬蟲異常的情況下,會呼叫


6. OnScraped & handleOnScraped

最後一步的回撥函式處理


註冊回撥函式的method還有幾個沒有列出來,感興趣的,自己看一下,


一般文件解析放在html, xml 中

頁面跳轉爬取

一般處理就2種,一種是相同邏輯的頁面,比如下一頁,另一種,就是不同邏輯的,比如子頁面

  1. html,xml,解析出來以後,構建新的請求,我們看一下,相同頁面

上面是 HTML的回撥函式,解析頁面,獲取了url,使用 e.Request.Visit(link), 其實就是 e.Request.collector.Visit(link) 我解釋一下


這種方法在實際開發中經常會用到。

  1. 子頁面的處理邏輯 colly中主要是以Collector為中心, 然後各種回撥函式進行處理,子頁面需要不同的回撥函式,所以就需要新的 Collector

持久化

Collector物件有一個屬性 store storage.Storage是儲存的,這個是將資料直接儲存下來,沒有清洗。 比如, 我需要將資料持久化到資料庫中,其實很簡單, 在回撥函式中處理。

給個例子


總結

好了,介紹完了,我沒有介紹如何使用,我自己也沒有寫任何的程式碼, 我只想分享給你這種軟體架構的特點以及設計模式, 希望你可以借鑑應用到工作中,一般寫框架都是採用這種思維。 下面這張圖很形象,爬蟲框架就這些東西。

通用爬蟲框架架構