node.jsでヘッドレスブラウザ(phantomjs+casperjs)を動かして情報を取得したりしていました(ブログ内検索)。
GOでスクレイピングも同じくらい簡単だったので使い方メモ。
単純にWebページから情報をとるだけならgoqueryを使います。
ログインや複雑な遷移が必要なもの、スクリーンショットやブラウザ的機能が必要な場合にはagoutiを使用します。
テストケースとして日経TECHから特定のリンク一覧をとってみます。
まずは前準備としてダウンロード。
1 2 |
go get github.com/sclevine/agouti go get github.com/PuerkitoBio/goquery |
ブラウザでF11を押して開発者ツールを起動して欲しい情報のセレクタを抜きます。
後は以下のように簡単にリンク抜出が可能です。
1 2 3 4 5 6 7 8 9 |
goq, err := goquery.NewDocument("https://tech.nikkeibp.co.jp") if err != nil { log.Fatal("cant get - %v",err) } goq.Find("aside section:nth-child(7) .tabContent:first-of-type li h3 a").Each(func(_ int, s *goquery.Selection) { url, _ := s.Attr("href") text := s.Text() log.Println(text,url) }) |
次にagoutiを使ってみます。
これはブラウザを動かす方法なのでphantomjsをインストールしておきます。
1 |
npm install phantomjs -g |
ブラウザをphantomjsに指定してスクショをとりgoqueryにバトンタッチします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//ブラウザ設定 driver := agouti.PhantomJS() if err := driver.Start(); err != nil { log.Fatalf("driver : %v", err) } defer driver.Stop() //ページを作る page, err := driver.NewPage(agouti.Browser("phantomjs")) if err != nil { log.Fatalf("page : %v", err) } page.Size(1280,800) //URLを開く if err := page.Navigate("https://tech.nikkeibp.co.jp"); err != nil { log.Fatalf("navigate : %v", err) } //全体のスクリーンショットをとれる page.Screenshot("./screenshot.jpg") //HTMLコードをgoqueryに渡す html,_ := page.HTML() r := strings.NewReader(html) goq, _ := goquery.NewDocumentFromReader(r) /* goqueryでスクレイピング... */ |
agoutiでもSelectionをとれるのですが基本ブラウジング用で情報取得には向かないように思います。単体で頑張らずにgoqueryを使った方が楽。
あと同時に書かない方がいいです。なまじ似ているので混乱します。