分享一下怎麼用 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 可以幫忙處理這些事,沒想到三兩下就搞定了。