phoenix-powergoqueryを使った時に、少しハマった話。

Web Scrapingをするとき、Golangを使ってみようと思い、いつもと同じように少しハマった話です。Golangで何かやろうとすると割と動かない事多い。

実は、Web Scrapingは、Perlで書いたり、Rubyで書いたりすることがあるんですが、結局のところ、Shell Scriptで書いたやつしか動作しなくなってる事が多いので、どうしようか迷ったんですが、今回も性懲りもなく、一般的な言語を使ってみることに。

goqueryをインストールするのは以下の様なコマンドを叩けばいいです。

1
$ CGO_ENABLED=0;gvm install go1.1;gvm use go1.1;go get github.com/PuerkitoBio/goquery

解説としては、gvmを使って、go1.1をインストールして使います。

1
2
3
4
5
6
7
8
9
10
11
12
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

$ echo '[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"' >> ~/.zshrc

$ source ~/.zshrc

#clang: warning: argument unused during compilation: '-pthread'
$ CGO_ENABLED=0

$ gvm list
$ gvm install go1.1
$ gvm use 1.1

以下の様なコードを実行できます。

t.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

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

func main() {
    doc, _ := goquery.NewDocument("http://syui.github.io/")
    doc.Find(".post h1 a").Each(func(_ int, s *goquery.Selection) {
        if articleUrl, ok := s.Attr("href"); ok {
            fmt.Println(articleUrl)
        }
    })
}
1
$ go run t.go
te.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
      "fmt"
      "flag"
      "github.com/PuerkitoBio/goquery"
)

func main() {
  var (
      stringFlag string
  )
  flag.StringVar(&stringFlag, "string", "blank", "string flag")
  flag.StringVar(&stringFlag, "s"     , "blank", "string flag")
  flag.Parse()

  doc, _ := goquery.NewDocument(stringFlag)
      doc.Find(".post h1 a").Each(func(_ int, s *goquery.Selection) {
          if articleUrl, ok := s.Attr("href"); ok {
              fmt.Println(articleUrl)
          }
      })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# SSLには対応してません
$ go run te.go -s http://syui.github.io/
https://syui.github.io/blog/2015/11/22/google-authenticator-yahoo/
https://syui.github.io/blog/2015/11/17/comic-walker-screenshot/
https://syui.github.io/blog/2015/11/13/mmm-make-video-01/
https://syui.github.io/blog/2015/11/12/mmm-mikumikumoving-appearance-miku/
https://syui.github.io/blog/2015/11/07/factory-unlock-sim/
https://syui.github.io/blog/2015/11/03/iij-sim-free/
https://syui.github.io/blog/2015/10/31/amazon-bag-grandstone/
https://syui.github.io/blog/2015/10/24/android-mount-exfat-cli/
https://syui.github.io/blog/2015/10/23/powershell-openssh-install/
https://syui.github.io/blog/2015/10/22/android-stick-mount-exfat/
https://syui.github.io/blog/2015/10/17/archlinux-on-android-am33x-lattest-2/
https://syui.github.io/blog/2015/10/16/archlinux-on-android-am33x-latest/
https://syui.github.io/blog/2015/10/16/archlinux-on-android-6-dot-0-customize/
https://syui.github.io/blog/2015/10/15/archlinux-on-android6/
https://syui.github.io/blog/2015/10/11/android-6-root-nexus7/
https://syui.github.io/blog/2015/10/04/electron-sample-app/
https://syui.github.io/blog/2015/09/29/sudo-pacman-syu/
https://syui.github.io/blog/2015/09/20/mt4-ea-tester/
https://syui.github.io/blog/2015/09/19/mt4-ea-origin/
https://syui.github.io/blog/2015/09/19/macbook-items-dock/

これでWeb Scrapingの仕組み作っても、バージョン管理使ってる時点で結局のところすぐに動作しなくなりそうな気がする…。