[Golang]agoutiを使ってchromeを操作!

スクレイピングの際にブラウザの操作が入りますよね!そんなわけで、agoutiというGolang用のWebDriverを使って、Google検索を行い、その検索結果をスクリーンショットしてみました。

導入

まずはchromedriverなどをインストールします。

$ brew tap homebrew/cask
$ brew cask install chromedriver
$ brew install selenium-server-standalone

次にagoutigo getします。

$ go get github.com/sclevine/agouti

実装

それではChromeを立ち上げて、Google検索を行い、スクリーンショットを撮ってみましょう。まずはコードの全体から。

コード全体

package main

import (
  "github.com/sclevine/agouti"
  "log"
)

func main() {
  // chromeの起動
  driver := agouti.ChromeDriver(agouti.Browser("chrome"))
  if err := driver.Start(); err != nil {
      log.Fatalf("Failed to start driver:%v", err)
  }
  defer driver.Stop()

  page, err := driver.NewPage()
  if err != nil {
      log.Fatalf("Failed to open page:%v", err)
  }

  // google.comへ
  if err := page.Navigate("https://www.google.com/"); err != nil {
      log.Fatalf("Failed to navigate:%v", err)
  }

  // 入力
  q := page.FindByName("q")
  q.Fill("乃木坂46")

  // 検索
  if err := q.Submit(); err != nil {
    log.Fatalf("Failed to Search:%v", err)
  }

  // スクショ
  if err := page.Screenshot("screenshot.png"); err != nil {
    log.Fatalf("Failed to Screenshot:%v", err)
  }
}

解説

コードを説明していきます。

まず、使うパッケージを導入します。

import (
  "github.com/sclevine/agouti"
  "log"
)

次にChromewを起動して、開きます。

driver := agouti.ChromeDriver(agouti.Browser("chrome"))
if err := driver.Start(); err != nil {
    log.Fatalf("Failed to start driver:%v", err)
}
defer driver.Stop()

page, err := driver.NewPage()
if err != nil {
    log.Fatalf("Failed to open page:%v", err)
}

www.google.comに遷移します。

// google.comへ
if err := page.Navigate("https://www.google.com/"); err != nil {
    log.Fatalf("Failed to navigate:%v", err)
}

乃木坂46と入力して、検索します。ここで、FindByNameを使っていますが、idから取得する場合はFindByIdを使います。詳しくはGoDocをご覧ください。

// 入力
q := page.FindByName("q")
q.Fill("乃木坂46")

// 検索
if err := q.Submit(); err != nil {
  log.Fatalf("Failed to Search:%v", err)
}

最後にスクリーンショットを撮ります。無事、保存されていたら成功です。

// スクショ
if err := page.Screenshot("screenshot.png"); err != nil {
  log.Fatalf("Failed to Screenshot:%v", err)
}

感想

すごく簡単に実装できた。ドキュメントをみると、いろんな操作方法が載っていたので、試してみたい。