Golangでスクレイピングする時はとりあえずgoquery使っておけば良さそうーと思って、あまり別のライブラリを使おうとしてこなかった。けれど、高機能なスクレイピング用ライブラリでCollyというのがあって、スクレイピング処理の中でgoqueryのHTMLElementを取得できるらしく、便利そうだと思って使い始めてみました。
ドキュメントにも↓の e.DOM
はgoquery.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の個人的に嬉しいところは
- 同時アクセス数の制御が簡単にできる
- ランダム遅延時間を設定できる (Bot判定されないように)
- http://go-colly.org/docs/examples/random_delay/
- そういう意味では、ユーザーエージェントを柔軟にオプションで設定できるのもいい。簡単に環境変数でも設定できる。
- http://go-colly.org/docs/introduction/configuration/
- goqueryだとhttp.NewRequestして、headerにsetとかしないといけない。(参考)
- デバッグ機能が付いている
goqueryはjqueryのようにDOMに対して豊富な操作が可能で、親子要素(Closest)/兄弟要素(SiblingsMatcher)を取得でき、取り回しが良いのが便利です。
Colly+goqueryは楽に複雑なクローリングを実現できそうなので、サンプルを参考にしながら今後色々なケースで試してみたいです。
参考
Scraping the Web in Golang with Colly and Goquery | Ben Congdon