kobadbadbadbadbad

モチベ維持

欅坂のブログから画像スクレイピング Golang

動機

癒しが欲しかったんや!(Golang使って見たかった)

仕様

goqueryを使ってスクレイピング

メンバーの名前を指定して、そのメンバーの最新の画像を取って来て癒される

go run main.go berisa

コード -> GitHub - kobad/keyakiGo

コマンドライン引数となるメンバーを設定しとく

べりさのページURLが

http://www.keyakizaka46.com/mob/news/diarKiji.php?site=k46o&ima=0000&cd=member&ct=21

で、最後のct=21がメンバーを表してるのでそれを設定

var memberList = map[string]string{
    "ishimori":  "01",
    "zu-min":    "02",
    "uemu-":     "03",
    "ozeki":     "04",
    "odanana":   "05",
    "koike":     "06",
    "kobayashi": "07",
    "fu-chan":   "08",
    "si-chan":   "09",
    "mona":      "10",
    "yukka":     "11",
    "kuritarou": "12",
    "na-ko":     "13",
    "habu":      "14",
    "aoi":       "15",
    "techi":     "17",
    "moriya":    "18",
    "yonesan":   "19",
    "berika":    "20",
    "berisa":    "21",
    "neru":      "22"}

引数を取得してURL生成

flag パッケージを使う

flag.String() -> フラグを定義

flag.Parse() -> 引数解析してフラグにセット

flag.Args() -> 全取得

flag.Arg(0) -> 1つ目取得

memberList から該当する番号を取って来てURLにセットする

画像取得

goquery.NewDocument(targetURL) で指定したサイトを解析してくれる

article以下の -> img 内の srcからURLを取得

 doc.Find("article").Each(func(i int, s *goquery.Selection) {
        s.Children().Find("img").Each(func(_ int, arg1 *goquery.Selection) {
            url, _ := arg1.Attr("src")
            imgURL := baseURL + url
            fmt.Println("Get: " + imgURL)
            saveIMG(imgURL, i)
        })
    })

楽。

画像保存

  1. ディレクトリ作成

os.Mkdir(dirName, permission) で作る

 if err := os.Mkdir(targetName+t.Format(layout), 0777); err != nil {
        fmt.Println(err)
    }
  1. 画像保存

os.Create(name) でファイルを作って、io.Copy(file, target) でtargetをfileにコピーして保存する

func saveIMG(url string, i int) {
    response, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()

    file, err := os.Create(fmt.Sprintf(targetName+t.Format(layout)+"/%s%d.jpg", targetName, i))
    if err != nil {
        panic(err)
    }
    defer file.Close()
    io.Copy(file, response.Body)
}

保存に結構時間がかかる。仕方ないのかなー

結論

べりさ可愛い。

f:id:kobadlve:20161103212815j:plain

参考

goでスクレイピングするのにgoquery + bluemonday が最強な件 - Qiita

golang で URLの画像データを取得して、ローカルのファイルに保存する術 - kitak.blog