So-net無料ブログ作成

基礎からやらないGo言語で、画像URLスクレイピング(失敗したけど続行) [プログラミング]

基礎ができていないのになんとなくGo言語を書いてみようコーナー。wgetが思うさま動いてくれないので、Golangのライブラリの機能を借りてやってみようという感じのもの。wgetをapt source wgetで取ってきて、html-parse.cを読もうとしたら長くてうんざりしたのでやめました。手直しするよりいちから違う言語でスクラッチしたほうが早い。

最終的にはページにある画像をみんな取ってくるという、どうにもけしからん目的。wgetで非常にとりにくいパターンがあるんだよね。wgetは再帰的にサイトを探ることが出来るんだけど、画像が別サイトにあったりすると採るのが非常に面倒になる。出来ないことはないんだけど、上手くいかないサイトのほうが多い。


Golangにはhtmlの標準パッケージがある。良く分からん。とりあえず、画像のURLをスクレイピングするHTMLファイルを取得したい。んでファイルに保存は出来た。
package main
import (
  "fmt"
  "net/http"
  "io/ioutil"
  "os"
)

func main() {
  url := "http://google.com"
  resp, _ := http.Get(url)
  defer resp.Body.Close()
 
  byteArray, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(byteArray))
  ioutil.WriteFile("./test.txt", byteArray, os.ModePerm)
}

必ずしも保存する必要はないけれども、このファイルを解析すればいいわけだ。htmlパッケージを使えるのかな。あんまり探して見てないけど。


スクレイピングするのにはもっと簡単な方法があって、既存のパッケージにお任せで。
http://qiita.com/ryurock/items/b0466ad144f5e0555a95
を少し変えればimg src="ごにょごにょ"
がすぐに取れる
package main
import (
    "github.com/PuerkitoBio/goquery"
    "fmt"
    "os"
)
func main() {
    fmt.Println(os.Args[1])
    doc, err := goquery.NewDocument(os.Args[1])
    if err != nil {
        fmt.Print("url scarapping failed")
    }
    doc.Find("img").Each(func(_ int, s *goquery.Selection) {
          url, _ := s.Attr("src")
          fmt.Println(url)
    })
}


引数にURLを与えると出てくるのは出てくるのだが、きょうびimgで表示させているパターンってのは少ないらしい。何だよそれw。そんなんでブラウザから表示されている画像を指定してあげるような方法じゃないと、ソースから解析してとかかなり面倒な感じ。


ということで、他の言語でも単体での画像クローリングはやめました。それって画像だけに限ってだけどブラウザ作るのと大して変わらんやんという事なので。ちょっと視点を変えてFirefoxのプラグインとして作ってみる。どうせURLとる時にブラウザ使うわけだし。

でも、一ページでaタグで別ドメインに張ってあるような画像のページはわりと楽にできそうなので、後で少し考えてみる。まぁ二つのサンプルファイルをつなげればできそうな感じだが、テキストファイルしかまだ保存していないので画像のバイナリを扱えれば問題ないだろう。それにgoで作っているからWindowsでもOKだろうし、Bash on Windowsで動かしてもいいわけで。wget -rのような再帰的動作をさせられれば、気軽にエロ画像を得られるわけで。というか、手動でやれば済むことをいちいちコードにしたがる馬鹿がここにおるw

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0