【Golangスクレイピング】 Colly と goqueryを一緒に使うには

Golangスクレイピングする時はとりあえずgoquery使っておけば良さそうーと思って、あまり別のライブラリを使おうとしてこなかった。けれど、高機能なスクレイピング用ライブラリでCollyというのがあって、スクレイピング処理の中でgoqueryのHTMLElementを取得できるらしく、便利そうだと思って使い始めてみました。

ドキュメントにも↓の e.DOMgoquery.Selectionって書いてますね。こんな感じ書けるらしい。

// コレクターの初期化
c := colly.NewCollector()

// itemNameクラスの付いたAタグを走査
c.OnHTML("a.itemName", func(e *colly.HTMLElement) {
    selectionNode:= e.DOM // ← goquery.Selection
      // 兄弟要素(Siblings)の内容を出力
    selectionNode.SiblingsFiltered(".itemDetail").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Html())
    })
})

// サイトにアクセス
c.Visit("https://www.sample-shop.com")

高機能なcollyの個人的に嬉しいところは

goqueryはjqueryのようにDOMに対して豊富な操作が可能で、親子要素(Closest)/兄弟要素(SiblingsMatcher)を取得でき、取り回しが良いのが便利です。

Colly+goqueryは楽に複雑なクローリングを実現できそうなので、サンプルを参考にしながら今後色々なケースで試してみたいです。

参考

Scraping the Web in Golang with Colly and Goquery | Ben Congdon