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元素。
安裝使用
架構特點
瞭解爬蟲的都知道一個爬蟲請求的生命週期
- 構建請求
- 傳送請求
- 獲取文件或資料
- 解析文件或清洗資料
- 資料處理或持久化
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種,一種是相同邏輯的頁面,比如下一頁
,另一種,就是不同邏輯的,比如子頁面
- 在
html
,xml
,解析出來以後,構建新的請求,我們看一下,相同頁面
上面是 HTML的回撥函式,解析頁面,獲取了url
,使用 e.Request.Visit(link)
, 其實就是 e.Request.collector.Visit(link)
我解釋一下
這種方法在實際開發中經常會用到。
- 子頁面的處理邏輯 colly中主要是以
Collector
為中心, 然後各種回撥函式進行處理,子頁面需要不同的回撥函式,所以就需要新的Collector
持久化
Collector
物件有一個屬性 store storage.Storage
是儲存的,這個是將資料直接儲存下來,沒有清洗。 比如, 我需要將資料持久化到資料庫中,其實很簡單, 在回撥函式中處理。
給個例子
總結
好了,介紹完了,我沒有介紹如何使用,我自己也沒有寫任何的程式碼, 我只想分享給你這種軟體架構的特點以及設計模式, 希望你可以借鑑應用到工作中,一般寫框架都是採用這種思維。 下面這張圖很形象,爬蟲框架就這些東西。
通用爬蟲框架架構