[golang]遅れながらgoqueryを使ってみた

簡単に並列処理が実装できることやコンパイル時のチェック、シンプルで統一された記述スタイルなどに魅力を感じて、遅れながらGoに触れてみました（マスコットもかわいい） :grin: 
Goで何しようか模索していたら**goquery**なる物を発見したので、これを使った簡単なプログラムを作成してみます。

始めに**goquery**とは、[GitHub](https://github.com/PuerkitoBio/goquery)から引用。
>goquery brings a syntax and a set of features similar to jQuery to the Go language

つまりJQueryライクな記述でデータ処理できるGoのライブラリで、スクレイピングなどで重宝されます。
しかし**goquery**は2年以上も前からあるんっすね。。
今更感が拭えませんが、せっかくなのでメモしておきます！
## 環境
MAC OS X (10.9.5)
Go version 1.5
VMなどの仮想環境は利用してません。


## 処理内容

1. wikipediaの「おまかせ表示」のリンクに10秒間隔でアクセスする
2. レスポンスのHTMLを取得してそれをスクレイピングする
3. スクレイピング結果から、タイトルと説明文をコンソールに出力する（それだけ）。
4. 実行すると延々と出力し続けるので、終了は CTRL + C で。

**補足**
本来、wikipediaが提供しているAPIを利用した方が効率よくデータを取得できますが、
サンプルとしてあえてスクレイピングしています。

## **goquery**のインストール
Goの**get**コマンドで簡単インストール。
Goと一緒に、この辺のコマンドが標準インストールされるのも便利ですね。

```bash:ターミナル
$ go get github.com/PuerkitoBio/goquery
```

最初にこのコマンドでインストールしておかないと駄目です。

## メイン処理

```go:hello.go
package main

import (
	"fmt"
	"github.com/PuerkitoBio/goquery"
	"strings"
	"time"
)

func main() {
	//メイン処理のループ間隔(秒)
	const sleepInterval = 10
	//wikipediaのおまかせ表示URL
	const wikipediaRandomUrl = "https://ja.wikipedia.org/wiki/特別:おまかせ表示"

	c := time.Tick(sleepInterval * time.Second)
	for now := range c {
		doc, err := goquery.NewDocument(wikipediaRandomUrl)
		if err != nil {
			fmt.Println(err)
		}

		//ランダムに取得したwikipediaのタイトルと取得日時を表示する
		doc.Find("head").Each(func(i int, s *goquery.Selection) {
			title := s.Find("title").Text()
			//取得したタイトルから"- Wikipedia"という文字列を削除
			replacedTitle := strings.Replace(title, "- Wikipedia", "", -1)

			fmt.Println(strings.Repeat("☆", 50))
			fmt.Println(now.Format("2006-01-02 15:4:5"), replacedTitle)
			fmt.Println(strings.Repeat("☆", 50))
		})

		//divのidを目印に説明文を取得して表示する
		doc.Find("#bodyContent #mw-content-text").Each(func(i int, s *goquery.Selection) {
			s.Find("p").Each(func(i int, s *goquery.Selection) {
				fmt.Println(s.Text())
			})

			fmt.Println()
		})
	}
}
```

## フォーマットの確認

**gofmt**コマンドで構文チェック。

```bash:ターミナル
$ gofmt -w hello.go
```
不要なインポートや参照されていない変数などを事前にチェックしてくれます（-wは上書保存するオプ）。
インデントや{}()など、カッコ類の構文修正も自動でしてくれてとっても便利でありがたいです。
もはやチーム開発では必須の作業ですね。

## プログラムの実行

```bash:ターミナル
$ go run hello.go
```
**run**コマンドでいよいよ実行です！
実行すると以下のようにスクレイピングした内容がターミナルに出力されます。

出力結果
<pre>
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
2015-11-29 00:16:16 今治港 
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
今治港（いまばりこう）は、愛媛県今治市にある港湾。港湾管理者は今治市。港湾法上の重要港湾、港則法上の特定港に指定されている。四国の高縄半島の突端近くやや東に位置し、阪神と九州とを結ぶ瀬戸内海の本航路に接しており、海上交通の要衝として重要な役割を果たしてきた。
今治という街そのものが、古くから港町として栄え、港とともに発展してきた街である。港湾機能の充実は、行政の重要課題であり、阪神、九州と結ぶ航路に加え、山陽筋の（三原港、尾道港、広島港、呉港）や芸予諸島向けのフェリー・高速船の航路を多数擁していたが、瀬戸内しまなみ海道の開通により、しまなみ海道利用に振り変わったことから、国内定期航路は次第に縮小されている。また、阪神との長距離航路も次第に明石海峡大橋経由ルートなどに振り変わったこと、東予港などとの競合により低迷しており、利用は減少しつつある。これら航路は、片原町の地区に位置し、港湾ビルが港の象徴となっている。
一方、国際定期コンテナ航路の振興にも力を入れており、釜山（韓国）との定期航路は富田地区に寄航している。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
2015-11-29 00:16:26 鳥飼玖美子 
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
鳥飼 玖美子（とりかい くみこ、本名：町田玖美子、1946年 - ）は、日本の通訳者。順天堂大学教授。

東京都生まれ。アポロ11号の月面着陸や大阪万博など数々の国際舞台で活躍し、同時通訳者の草分けの一人と言われる。東洋英和女学院高等部在学中に1年間、ニュージャージー州に留学。1969年3月、上智大学外国語学部イスパニア語学科卒業。1990年10月、コロンビア大学大学院修士課程（英語教授法）修了。2007年6月、サウサンプトン大学でPh.D.（専攻は通訳学）取得。
1989年東洋英和女学院大学人文学部専任講師、1993年同助教授、1995年同社会学部助教授、1997年同教授に昇格。
1997年立教大学大学教育部英語科教授、1998年立教大学観光学部観光学科教授、2006年立教大学経営学部国際経営学科教授、2008年立教大学異文化コミュニケーション学部異文化コミュニケーション学科教授、2011年立教大学大学院独立研究科異文化コミュニケーション研究科特任教授。
2015年順天堂大学国際教養学部国際教養学科教授。専門分野は通訳論、翻訳論、異文化コミュニケーション論、英語科教育法。
1971年4月から1992年9月までの約20年間、ラジオ番組「百万人の英語」の講師を務めた。
著書『TOEFL・TOEICと日本人の英語力』では日本の英語業界の現状を厳しく批判している。『危うし！ 小学校英語』では日本における早期英語教育に強い懸念を表明している。
日本コングレス・コンベンション・ビューロー元会長。現在、日本通訳翻訳学会会長、国立国語研究所評議員ほか。日本学術会議会員。

〜 以下、省略 〜
〜 強制終了(CTRL + C) 〜
</pre>

wikipediaのページはランダムに表示されるので、実行するたびに出力内容は異なります。

## 最後に

因に、こちらのドキュメントに**goquery**の機能が纏まってます。
[GoDoc](https://godoc.org/github.com/PuerkitoBio/goquery)

思ったより機能が豊富で戸惑いを隠せません。
ですが、JQueryに慣れた人であれば容易に使いこなせると思います。
今回は簡単な処理しか試してませんが、複雑なスクレイピングも容易に実現できそうです。

今後も進化を続けるGoに期待しつつ、継続して学習していこうと思います。
それにしてもFormatメソッドの引数には慣れない。。

## 参考サイト
この記事を書くにあたり、以下のサイトを参考にさせて頂きました。
[Go言語で jQuery ライクな操作が出来る goquery を試した。](http://mattn.kaoriya.net/software/lang/go/20120914184828.htm)