golangでスクレイピングして画像を保存する

はじめましてRIN1208です。
Qiita初投稿になります。
今回はGO言語でスクレイピングして画像を保存したいと思い書いてみました。
プログラミング自体そこまでしたことがない初心者なので間違ってることや改善できる点などがありましたらコメントしていただければ幸いです。

#まず初めに　
今回は以下のライブラリを使わせて頂きました

・[goquery](https://github.com/PuerkitoBio/goquery)

参考にさせて頂いた記事
・[golangでweb画像収集クローラーを作る](https://qiita.com/7yan00/items/1d814d9ed3fbaa4dc6fb)
#全体のコード
```go  
package main

import (
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
	"os/exec"
	"github.com/PuerkitoBio/goquery"
)

func main() {
	var alice string
	fmt.Print("site URL or image URL? :")
	fmt.Scan(&alice)
	if alice == "site" {
		savesite()
	} else if alice == "image" {
		saveimg()
	} else  {
		fmt.Println("Please enter either")
	}
}

func savesite() {
	defer fmt.Println("Save completed!!")
	var siteurl string
	var result []*url.URL
	fmt.Print("Please enter URL :")
	fmt.Scan(&siteurl)
	confirmation := confirmurl(siteurl)
	if confirmation == true {
		doc, _ := goquery.NewDocument(siteurl)
		doc.Find("img").Each(func(_ int, s *goquery.Selection) {
			abbie, _ := s.Attr("src")
			bella, _ := url.Parse(siteurl)
			adele, _ := url.Parse(abbie)
			result = append(result, bella.ResolveReference(adele))
		})
		for _, boby := range result {
			alice := boby.String()
			log.Println(alice)
			_, err := exec.Command("wget", alice).Output()
			if err != nil {
				log.Fatal("Save failed...", err)
			}
		}
	}
}

func saveimg() {
	var siteurl string
	defer fmt.Println("Save completed!!")
	fmt.Print("Please enter URL : ")
	fmt.Scan(&siteurl)
	confirmation := confirmurl(siteurl)
	if confirmation == true {
		_, err := exec.Command("wget", siteurl).Output()
		if err != nil {
			log.Fatal("Save failed...", err)
		}
	}
}

func confirmurl(url string) bool {
	_, err := http.Get(url)
	if err != nil {
		fmt.Println("URL that does not exist")
		os.Exit(0)
	}
	use := true
	return use
}
```
全体はこんな感じです。以降は処理の内容について説明したいと思います。

#func main の部分
```go 
func main() {
    var alice string
    fmt.Print("site URL or image URL? :") //サイトURLですか？それとも画像URLですか？
    fmt.Scan(&alice)
    if alice == "site" {   // サイトのとき
        savesite()         // func savesite　の処理を行う　
    } else if alice == "image" {   //画像URLのとき
        saveimg()                 //func saveimg  の処理を行う
    } else  {   //上記以外のとき
        fmt.Println("Please enter either")
    }
}
```
ここではサイトのURLか画像のURLかを聞いています。処理は多少異なるので分けてます。
ぶっちゃけ遊び心で分けました。

# func savesite の部分
```go 
func savesite() {
    defer fmt.Println("Save completed!!") //処理が終わったときに表示させるコメント
    var siteurl string
    var result []*url.URL
    fmt.Print("Please enter URL :")
    fmt.Scan(&siteurl)    //ここではURLの入力
    confirmation := confirmurl(siteurl)  //ここの関数は下で説明
    if confirmation == true {
        doc, _ := goquery.NewDocument(siteurl)  //goqueryを使ってimgタグの中の画像URLを取得
        doc.Find("img").Each(func(_ int, s *goquery.Selection) {
            abbie, _ := s.Attr("src")
            bella, _ := url.Parse(siteurl)
            adele, _ := url.Parse(abbie)
            result = append(result, bella.ResolveReference(adele))
        })
        for _, boby := range result {
            alice := boby.String()
            log.Println(alice)
            _, err := exec.Command("wget", alice).Output()  // ここでは画像の保存
            if err != nil {
                log.Fatal("Save failed...", err)
            }
        }
    }
}

```
上記の処理ではwebサイトから画像を保存する処理になります。
今回は他にも画像を保存する方法がありましたがwgetコマンドを使ってみました。
#func saveimgの部分
```go 
func saveimg() {
    var siteurl string
    defer fmt.Println("Save completed!!")
    fmt.Print("Please enter URL : ")
    fmt.Scan(&siteurl)
    confirmation := confirmurl(siteurl)
    if confirmation == true {
        _, err := exec.Command("wget", siteurl).Output()
        if err != nil {
            log.Fatal("Save failed...", err)
        }
    }
}
```
こっちもほとんどsavesiteの方と処理は変わりません。前半のURLの取得する部分がなくなり、wegtを使って保存する処理がほとんどになります。

#func confirmurl の部分
```go
func confirmurl(url string) bool {
    _, err := http.Get(url) 
    if err != nil {  //URLが存在しない場合
        fmt.Println("URL that does not exist")
        os.Exit(0) //強制終了
    }
    use := true
    return use
}
```
上記の処理はその名の通り確認です。
ここでは存在しないURLが入力された際にこのURL存在しないよと表示させる関数になります。
もし存在する場合はtrueを返します。
#終わりに
ここまで読んでいただきありがとうございます。
今回記事を書くのは自分が忘れないためだったりもします(笑)
まだまだ変数の名前が適当だったりします...すいません...
cliとして使えるようにする目的で作っているので次記事を書くとしたらそちらを書こうかと思います。
重ねてですがここまで読んでいただきありがとう御座います。