強大高效而精簡易用的Golang爬蟲框架Colly,能否取代 Scrapy?(下)-33

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第34天,點選檢視活動詳情

Colly

之前也介紹了, Colly 是一個由 Golang 編寫的爬蟲框架。Colly 其實是 Collector 或 Collecting 的暱稱。它精簡易用而強大高效,正在逐漸成為 Scrapy 以外的爬蟲框架選擇。

咱們下面用一個例子來看一下它是如何做到的。(本文不是 Colly 的參考文件,僅希望通過一些例子來介紹 Colly 的優勢和特性,要看所有 API 請參考 [Colly 官網文件]

在任意目錄建立 baidu_spider.go 檔案,並輸入下列程式碼。

``` package main

import ( "fmt" "github.com/crawlab-team/crawlab-go-sdk/entity" "github.com/gocolly/colly/v2" )

func main() { // 生成 colly 採集器 c := colly.NewCollector( colly.AllowedDomains("www.baidu.com"), colly.Async(true), colly.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"), )

// 抓取結果資料鉤子函式
c.OnHTML(".result.c-container", func(e *colly.HTMLElement) {
    // 抓取結果例項
    item := entity.Item{
        "title": e.ChildText("h3.t > a"),
        "url":   e.ChildAttr("h3.t > a", "href"),
    }

    // 列印抓取結果
    fmt.Println(item)

    // 取消註釋呼叫 Crawlab Go SDK 存入資料庫
    //_ = crawlab.SaveItem(item)
})

// 分頁鉤子函式
c.OnHTML("a.n", func(e *colly.HTMLElement) {
    _ = c.Visit("https://www.baidu.com" + e.Attr("href"))
})

// 訪問初始 URL
startUrl := "https://www.baidu.com/s?wd=crawlab"
_ = c.Visit(startUrl)

// 等待爬蟲結束
c.Wait()

} ```

上面這個爬蟲指令碼,僅有 40 行程式碼。如果要用 Scrapy 來完成同樣的功能,可能需要更多程式碼和檔案目錄。

可以從程式碼中看到,Colly 的爬蟲程式編寫非常簡單,主要包含四個部分:

  1. 生成 Colly 採集器(Collector)c,並傳入一些配置資訊;
  2. OnHTML 鉤子函式,包含 colly.HTMLElement 元素例項,這裡主要是處理抓取結果的邏輯;
  3. c.Visit 訪問函式,類似 Scrapy 中的 yield scrapy.Request
  4. c.Wait 等待函式,等待 Colly 爬蟲程式執行完畢。

建立好之後,在所在目錄執行 go run baidu_spider.go,即可執行百度搜索 “crawlab” 關鍵詞爬蟲。執行結果類似如下。

... map[title:docker安裝爬蟲管理工具crawlab - kindvampire - 部落格園 url:http://www.baidu.com/link?url=ueCY-MwzzGwaVqXw3Q18Fz8rEodI1P_mv60lRd8H0UZdFC4xVnVwWtsh-HpiwaOFI1zVjZFeVca] map[title:crawlab python指令碼關聯mongodb結果集,例項_kai4024589..._CSDN部落格 url:http://www.baidu.com/link?url=2wFQZaLoEk7OOTHrf1LOJcPiBAZEFETQYbjrqnrJi_Wfqdx-gPFIyjt2q3f7lTC-8A6SWz_l8zE6D8SBs1j0c4DOIwbdAw8i] map[title:手把手教你如何用Crawlab構建技術文章聚合平臺(一)_wei..._CSDN部落格 url:http://www.baidu.com/link?url=nr9NOz2dqYFuaU5E1Zjz0OIfeeixSADNBNcHwj4dw9zypIky-9dVxd4RdzdS8-JMP7_X-LYpo0ydWmB8VNBmqq] map[title:tikazyq-crawlab-master crawlab爬蟲平臺 適合scrapy分散式部署... url:http://www.baidu.com/link?url=VibsGu0BinYAUR_96pWCmcELObAXIPn7rKprlc9HR_607_cuEbxlcShUHqXjOoV6dnc4pND5F0K] map[title:手把手教你如何用Crawlab構建技術文章聚合平臺(一) - 個人文章... url:http://www.baidu.com/link?url=SG6dJcLc20xIuiesjRIXu2XzGSR0N674BEnUTveJhYe5mRc9SFtggk-NL0pmAAa] map[title:爬蟲管理平臺Crawlab v0.3.0釋出(Golang版本) - 個人文章... url:http://www.baidu.com/link?url=TItw3zWB4jHCoGmoQMm01E7oP2WlwfX7BRMsA9WDhaxHeQZZDi3I8bZh_kgTfpNx4fhtf42_] map[title:Crawlab 單節點服務叢集搭建部署簡明教程 - 個人文章 - Segment... url:http://www.baidu.com/link?url=cuYEFA1zjqK1GiEmDCjwRMLDGFVKDsz6u4ljYjQol-VwDdr_cBS9Y3UlgChkyCuO7A_] ...

你可能會納悶,Pipeline 和 Middleware 等 Scrapy 中定義的模組去哪裡了?其實,你需要注意的是,這些模組並不是必須的,只是大佬們在開發爬蟲過程中總結出來的一些實用的邏輯,抽象出來了而已。如果要在 Colly 中實現 Pipeline,直接在 c.OnHTML 鉤子函式中的回撥函式中呼叫一下後續處理函式即可,例如下面程式碼。

``` ... c.OnHTML(".result.c-container", func(e *colly.HTMLElement) { item := entity.Item{ "title": e.ChildText("h3.t > a"), "url": e.ChildAttr("h3.t > a", "href"), }

    // 後續處理抓取結果
    PostProcess(item)
})

... ```

從這個例子中,你可以看到 Colly 的 API 非常簡單、清爽,而正是這種簡單賦予了其極高的靈活性(Flexibility) ,讓開發者可以在框架內做很多複雜的事情。

當然,Colly 也是有缺點的。從目前的開發進度來看,Colly 似乎還無法支援動態渲染內容的抓取,例如 Ajax 資料渲染,而這個在 Scrapy 中是有現成的不少解決方案的。

不過,我們有理由相信,隨著今後不斷迭代,Colly 會變得越來越全面和強大的。

與 Crawlab 整合

~/projects/tikazyq/colly-crawlers/baidu(master*) » crawlab upload go.mod go.sum baidu_spider.go uploaded successfully

然後在 Crawlab 的爬蟲詳情介面中輸入執行命令 go run baidu_spider.go,點選 “執行” 開啟爬蟲。然後爬蟲就會開始執行。

image.png

等待一段時間,爬蟲執行結束。我們可以在日誌中看到打印出來的結果。

image.png

並且,我們還可以在 “結果” 中檢視抓取到的結果資料。這些結果是預設儲存在 MongoDB 資料庫裡的。

image.png

因此,用 Crawlab 來管理 Colly 爬蟲是非常方便的。

總結

本文從介紹知名爬蟲框架 Scrapy 的優缺點開始,引入了基於 Golang 的高效而簡單的爬蟲框架 Colly。然後我們用一個百度搜索引擎抓取的例子,闡述了 Colly 的優勢,也就是它精簡而清爽的 API 以及靜態語言的健壯性,還有很多其他實用特性。Colly 的出現,或許象徵著爬蟲開發者對簡潔的追求,所謂 “大道至簡”,就是用簡單而純粹的東西創造巨大的價值。爬蟲技術的發展,是一個開發流程由複雜變簡單、而程式功能由簡單變複雜的過程。爬蟲技術經歷了 urllib/requests+BeautifulSoup 原始技術,到 Scrapy 的全能框架,再到如今的 Colly 的輕量級框架。而如今已經有不少所謂的 “低程式碼” 甚至 “無程式碼” 爬蟲平臺了,例如  Crawlab 可配置爬蟲、八爪魚/后羿採集器。而智慧化的爬蟲抓取也在逐漸變得流行。從這個角度來看,Colly 相對於 Scrapy 應該是進步了。不過現在要說 Colly 能否取代 Scrapy 還為時過早,因為 Scrapy 還有很多優秀的特性和生態是 Colly 暫時無法替代的。但是,Colly 目前正在高速發展,逐漸被開發者所瞭解,隨著不斷的反饋迭代,Colly 非常有潛力成為另一個爬蟲界的必備技術