[Golang]goqueryスクレイピングのTip集

以前、goquery入門記事を書きました。今回は公式ドキュメントを参考にgoqueryでのスクレイピングを色々と試してみましょう!

Each

まずは繰り返しで要素にヒットするタイトルを入手しましょう。今回もこのブログからスクレイピングを行います。

doc.Find("article").Each(func(i int, s *goquery.Selection) {
  // ブログのタイトルを取得
  title := s.Find("a.post-link").Text()

  fmt.Printf("Blog %d: %s\n", i, title)
})

結果はこんな感じに!

Blog 0: [Nuxt]vue-lazyloadを使って画像の遅延読み込みを実現する
Blog 1: [Golang]Herokuにデプロイする!
Blog 2: [Django]認証・ログイン・ログアウト
Blog 3: [Golang]GORMでデータベースを操作する
Blog 4: [Golang]GORMを使って、MySQLに接続してデータを保存してみる
Blog 5: [Geth]導入からマイニング、送金まで
Blog 6: [Golang]goqueryを使ってスクレイピング!

EachWithBreak

お次はこちら!ループの途中に抜けたいときはEachWithBreakを使います。

doc.Find("article").EachWithBreak(func(i int, s *goquery.Selection) bool {
  // ブログのタイトルを取得
  title := s.Find("a.post-link").Text()

  fmt.Printf("Blog %d: %s\n", i, title)

  if i == 3 {
    return false
  }
  return true
})

結果はこちら!i == 3falseとなり、処理を抜けることができました!

Blog 0: [Nuxt]vue-lazyloadを使って画像の遅延読み込みを実現する
Blog 1: [Golang]Herokuにデプロイする!
Blog 2: [Django]認証・ログイン・ログアウト
Blog 3: [Golang]GORMでデータベースを操作する

First

ヒットした最初の要素の最初のものだけ取り出してみましょう。

title := doc.Find("a.post-link").First().Text()
fmt.Printf("hahaha %s\n", title)

こうなります!

hahaha [Nuxt]vue-lazyloadを使って画像の遅延読み込みを実現する

Attr

URLを取り出してみましょう。属性値を取得します。

doc.Find("article").Each(func(i int, s *goquery.Selection) {
  // ブログのタイトルとURLを取得
  title := s.Find("a.post-link").Text()
  url, _ := s.Find("a.post-link").Attr("href")
  correctUrl := "https://youj.work" + url

  fmt.Printf("Blog %d: %s\n URL: %s\n", i, title, correctUrl)
})

Attr()を使います。結果を見てみましょう。

Blog 0: [Nuxt]vue-lazyloadを使って画像の遅延読み込みを実現する
 URL: https://youj.work/post/nuxt0320/
Blog 1: [Golang]Herokuにデプロイする!
 URL: https://youj.work/post/go0317/
Blog 2: [Django]認証・ログイン・ログアウト
 URL: https://youj.work/post/python0315/
Blog 3: [Golang]GORMでデータベースを操作する
 URL: https://youj.work/post/go0311/
Blog 4: [Golang]GORMを使って、MySQLに接続してデータを保存してみる
 URL: https://youj.work/post/go0310/
Blog 5: [Geth]導入からマイニング、送金まで
 URL: https://youj.work/post/geth0308/
Blog 6: [Golang]goqueryを使ってスクレイピング!
 URL: https://youj.work/post/go0307/

Last

最後にマッチしたものを取り出してみましょう。

title := doc.Find("a.post-link").Last().Text()
fmt.Printf("Last: %s\n", title)

Last()を使います。結果をみてみましょう。

Last: [Golang]goqueryを使ってスクレイピング!

Length

取得した要素の数をLength()を使って表示してみましょう。

number := doc.Find("a.post-link").Length()
fmt.Println(number)

ちゃんと要素数が出力されてます。

7

随時更新するかもしれないし、しないかもしれない