分享一下怎麼用 Go 爬網頁:

先 import 之後步驟會用到的 package:

import(
  "code.google.com/p/cascadia"
  "code.google.com/p/go.net/html"
  "code.google.com/p/go.text/encoding/traditionalchinese"
  "code.google.com/p/go.text/transform"
)

第一步當然是用 http.Get 把網頁抓回來:

resp, err := http.Get(url)
if err != nil {
  log.Println("Failed to download:", err.Error())
  return
}
defer resp.Body.Close()

第二步: 如果網頁內容不是 UTF-8 encoding 要做一下轉換,go.text 包有提供編碼轉換及 Big 的支援,然後用 go.net/html 包提供的 HTML parser 來輸出(非標準) DOM tree:

big5Reader := transform.NewReader(resp.Body, traditionalchinese.Big5.NewDecoder())
doc, err := html.Parse(big5Reader)
if err != nil {
  log.Println("Failed to parse:", err.Error())
  return
}

再來要從 doc 中撈出資訊則可以使用 cascadia 包提供的 CSS selector 來做:

rowSel := cascadia.MustCompile("table table tr")
colSel := cascadia.MustCompile("td")

for _, row := range rowSel.MatchAll(doc) {
  for _, col := range colSel.MatchAll(row) {
    // ...
  }
}

花費的時間比我想像中的少,本來以為找不到好的 package 可以幫忙處理這些事,沒想到三兩下就搞定了。