ブログの名前なんて適当で良いのでは

説明を求めるな、記事を読め

Go言語 Webスクレイピング用ライブラリ Surf を使ってみる

はじめに

Surfとは、WebスクレイピングするためのGo言語用のライブラリである。イメージとしては、RubyMechanizeのGo言語版とでもいった感じだろうか。
Rubyだと導入の際にRuby環境が求められてしまうが、Go言語は単一のバイナリを吐くことができるため、そういった障壁を超えることができて、とても便利だ。
Surfは日本人があまり使っていないせいか、日本語記事が少ないので、公式のチュートリアル的なことを日本語で残しておこうと思う。 題材としては、GitHubにログインするといった処理をSurfを使って書いてみようと思う。

Surfの導入

go getするだけ。

$ go get github.com/headzoo/surf

Githubにログインするコードを書いてみる

Webスクレイピングする際は、WebページのHTMLをにらめっこしなくてはいけないので、https://github.com/loginに行き、ソースを表示してみよう。
ソースを見てみると、どうやらformタグは1つで、その中に、ユーザネームを入れるためのname="login"とパスワードを入れるためのname="password"という2つのinputタグがあることを確認できる。 では、これらの2つのinputタグに値を入れて、実際にログインボタンを押す処理を書いてみよう。と言っても、ソース自体短いので、貼っておく。

package main

import (
    "os"    
    "fmt"
    "github.com/headzoo/surf"
)

func main() {

    bow := surf.NewBrowser()

    err := bow.Open("https://github.com/login")
    if err != nil {
        fmt.Println(err.Error())
    }

    fm, err := bow.Form("form")
    if err != nil {
        fmt.Println(err.Error())
    }

    fm.Input("login", os.Getenv("GITHUB_USERNAME"))
    fm.Input("password", os.Getenv("GITHUB_PASSWORD"))

    if fm.Submit() != nil {
        fmt.Println(err.Error())
    }

    fmt.Println(bow.Body())

}

まずはじめに、surf.NeBrowser()で、ブラウザ用のインスタンスを生成する。次に開きたいURLを引数に、Openメソッドを実行する。適宜エラー処理などをしたら、formタグのインスタンスを取得する。
この処理には、Formメソッドが使えて、引数にform.class_nameのようなCSSセレクタを利用することができる。このように引っ張って来たい要素を指定できるのは、便利だろう。次に、そのformタグ用のインスタンスに対して、Inputメソッドを実行する。これは、1つ目の引数にname属性の値、2つ目の引数に、入力したい値を入れることで、入れた状況を生成できる。ログインに必要なユーザ名とパスワードを入力する。
最後に、ログインボタンを実行しなくてはいけないので、Submitメソッドを実行する。これを行うことで、現在のブラウザ用のインスタンスは、見ているページが代わる。そこで、Bodyメソッド使って、実際の内容を表示してみると、ログイン後のページが表示されていることがわかる。

おわりに

Go言語のWebスクレイピング用のライブラリSurfを使って、GitHubのログイン処理を行ってみた。ソースコードの記述量からもわかるように、長くなりがちなGolangにしてはかなりスッキリとかけている。今まで、ライブラリが便利でその言語を使ってスクレイピングしていた人も、このSurfを使ってGo言語でのWebスクレイピング生活を送ってみてはどうだろうか。