昨天 Day20 有介紹到關於網路爬蟲的方式,我們是透過正則法則來匹配相對應的資料,但首先我們必須查看網頁原碼,然後抓取網頁中特定 id 或是 class 等等的方式,然後再定義正則法則與網頁源碼比對符合的格式,從中獲得我們想要的資料,但其實這樣表示抓取的方式其實就是抓某一些特定物件內的資訊,這邊的物件指的是 html 中的 div 或者 class 等類型,也就是類似如昨天提到的目標畫面:
day20 在定義正則表達式的時候,實際上是有點麻煩的,那 colly 的出現就是大大減少我們自己定義正則表達式的複雜過程
首先透過 go get 安裝 colly 的資料庫,其中 -u 表示 update,如果電腦原本沒有安裝過 colly,安裝 colly,如果曾安裝過則確認有沒有更新版,假設不使用 -u,電腦曾安裝過就不更新,可依個人需求決定是否使用
go get -u github.com/gocolly/colly
如果要做到與昨天效果一樣的結果,程式碼如下,與昨天程式碼相比,大幅減少:
import (
"fmt"
"strings"
"github.com/gocolly/colly"
)
func main() {
collector := colly.NewCollector()
// 抓 Class 名稱
collector.OnHTML(".qa-list__title-link", func(e *colly.HTMLElement) {
trimText := strings.TrimSpace(e.Text)
fmt.Println(trimText)
})
// 請求期間發生錯誤處理
collector.OnError(func(response *colly.Response, err error) {
fmt.Println("error :", err)
})
// 有些 url 需要有 User-Agent 的資訊,否則會出現 403 的問題,鐵人30 就需要這個東西
collector.OnRequest(func(req *colly.Request) {
req.Headers.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36")
})
collector.Visit("https://ithelp.ithome.com.tw/users/20150797/ironman/5271?page=2")
}
輸出結果為:
Day11 - Go的文檔制作
Day12 - Go的 goroutine
Day13 - Go的 channel (上)
Day14 - Go的 channel (下)
Day15 - Go的 WaitGroup
Day16 - Go的 Mutex (互斥鎖)
Day17 - Go的 Select
Day18 - Go的 package
Day19 - Go的正則表達式
Day20 - Go的正則表達式與簡易爬蟲
https://github.com/luckyuho/ithome30-golang/tree/main/day21