iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Software Development

30天學會Golang系列 第 21

Day21 - Go的網路爬蟲 colly

  • 分享至 

  • xImage
  •  

colly

昨天 Day20 有介紹到關於網路爬蟲的方式,我們是透過正則法則來匹配相對應的資料,但首先我們必須查看網頁原碼,然後抓取網頁中特定 id 或是 class 等等的方式,然後再定義正則法則與網頁源碼比對符合的格式,從中獲得我們想要的資料,但其實這樣表示抓取的方式其實就是抓某一些特定物件內的資訊,這邊的物件指的是 html 中的 div 或者 class 等類型,也就是類似如昨天提到的目標畫面:

https://ithelp.ithome.com.tw/upload/images/20221002/20150797mvEGPp4V6j.png

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的正則表達式與簡易爬蟲
第21天報到,colly其實是一個很強大的網路爬蟲資料庫,裡面有很多好東西,比方說透過這這個連結連到下一個連結,以及併發抓取資料等等,需要可以看看 參考來源3,內容講得還不錯

參考來源

  1. https://ithelp.ithome.com.tw/articles/10246620
  2. https://www.readfog.com/a/1644908070754684928
  3. https://darjun.github.io/2021/06/30/godailylib/colly/

代碼連結

https://github.com/luckyuho/ithome30-golang/tree/main/day21


上一篇
Day20 - Go的正則表達式與簡易爬蟲
下一篇
Day22 - Go的文檔讀寫
系列文
30天學會Golang31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言