エンジニア採用担当がプログラミング頑張る話【10日目/2ヶ月間】
こんにちは、@hiroki_maekawaです。
今日でプログラミングを始めてから10日が経ちました。あっという間です。
昨日作成したCSVファイルにスクレイピングしてきたデータを入れることができそうなところまできたので、今日はCSVファイルにデータを入れて、その後CSVファイルをデータベースにインポートするところまでいくのが目標です。
今日の目標
・配列についての理解
・CSVファイルにデータを入れる
・CSVファイルをデータベースにインポートする
1. 配置についての理解
ドットインストールで「配列を使ってみよう」「構造体を使ってみよう」「メソッドを使ってみよう」を学習し、複数の値にまとまりを持たせたり、構造体に関数を紐付けさせたりすることができるという概念があることを学びました。
その後、配列してみたらtitle, urlのところにエラーが、、
//配列
content := []string{title, url}
原因は、下記コードだと、Each関数に渡しているFind関数の中で、:=を使ってtitle変数が宣言(定義)→代入されているので、その外ではtitle変数が宣言(定義)されていない状態である。スコープへの理解がないことを理解しました。
doc.Find(".ipQwMb a").Each(func(_ int, s *goquery.Selection) {
url, _ := s.Attr("href")
title := s.Text()
fmt.Println(title)
fmt.Println(url)
})
スコープとは、ある場所で定義した変数や関数を使える範囲のことであると知り、「上記コードの前にtitle変数を宣言しておかないといけない」と理解しました。
2. CSVファイルにデータを入れる
その後、下記の通りtitle変数の宣言、また値の代入部分を書き直しました。
package main
import (
"encoding/csv"
"fmt"
"os"
"github.com/PuerkitoBio/goquery"
_ "github.com/go-sql-driver/mysql"
)
func main() {
_url := "https://news.google.com/topstories?hl=ja&gl=JP&ceid=JP:ja"
//構造体の作成
type titlelist struct {
title string
url string
}
//httpアクセス
doc, err := goquery.NewDocument(_url)
if err != nil {
fmt.Printf("%s\n", err)
}
//title変数とurl変数を先に宣言しておく
var title string
var url string
//タイトル名とURLを取得。Eachを使いたい。
doc.Find(".ipQwMb a").Each(func(_ int, s *goquery.Selection) {
url, _ = s.Attr("href")
title = s.Text()
fmt.Println(title)
fmt.Println(url)
})
//Goでスクレイピングしてきたデータをcsvファイルに保存
//CSVファイルを開く(なかったら作成する)
file, err := os.OpenFile("firstgo.csv", os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
//配列
content := []string{title, url}
//書き出す
writer := csv.NewWriter(file)
writer.Write(content)
//ファイル出力
writer.Flush()
}
CSVファイルにはこれしか反映されなかったので、「ループ処理をしなきゃいけないのか?」と考えたところで今日は終了してしまいました。
「アジの干物」が宇宙へ…“宇宙日本食”に初めて選ばれた干物はどうすごい?担当者に聞いた,./articles/CAIiEId1tsiuZD1lsiOlcb6MWokqMwgEKioIACIQaZH_NrMpwhXYITEnAZ-WeioUCAoiEGmR_zazKcIV2CExJwGflnowrabAAw?hl=ja&gl=JP&ceid=JP%3Aja
今日できるようになったこと
・CSVファイルへのデータの書き出し
・スコープを考慮した変数の宣言、値の代入
さいごに
今日はしょっぱなエラーが出てつまずきましたが、つまずいたことで自分に足りなかった知識について理解することができました。エラーが出るごとに自分の知らなかった知識について理解していくプロセスは、プログラミング上達の一番の近道なのかなと思います。
ただ、今は@Sueken51さんにひとつひとつ自分の分からないとこを指摘を頂いている状態なので、これからもっと自分で解決できるようにしていきたいとも思いました。
それではまた!