エンジニア採用担当がプログラミング頑張る話【9日目/2ヶ月間】
こんにちは、@hiroki_maekawaです。
昨日は「もっとたくさんスクレイピングしたい」と思い方法を調べていたところで完全に詰まってしまい、人生初「分からないことをどうやって調べればいいのかわからない」という極限の状態になってしまいました。
そのため、引き続き@Sueken51さんに質問をしながらGoogleニュースから複数のタイトルとURLを取ってこれるように頑張っていきたいと思います。
今日の目標
・スクレイピングでより多くのデータを取ってくる
- Each関数を使えるようにする
- Text関数を使えるようにする
- Attr関数を使えるようにする
- Find関数を使えるようにする
・スクレイピングしてきたデータをCSVファイルに入れる
1. スクレイピングでより多くのデータを取ってくる
Googleニュースから複数のタイトルとURLを取ってくるには、少なくとも上記の関数を使う必要があります。ただ自分自身、今だに関数の書き方のルールが分かってなかったので、まずはドットインストールの「はじめてのGo言語」と「Go言語入門」の#9をやることにしました。
これで関数の宣言や代入の方法、複数の変数を宣言する方法、宣言と値の紐付けを一緒にやる方法など、基本的なことを理解することができ、下記のコードを書くことができました。。!
//タイトル名と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)
})
2. スクレイピングしてきたデータをCSVファイルに入れる
まずはCSVファイルの作成から
//CSVファイル作成
file, err := os.Create("firstgo.csv")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
実行したらCSVファイル(firstgo.csvファイル)ができました!
その後、書き込みを行うためにCSVファイルを開くコードを書きました。(これだけでも問題ないのか?)
//CSVファイル開く(なかったら作成する)
file2, err := os.OpenFile("firstgo.csv", os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer file2.Close()
次はスクレイピングしてきたデータを、今作ったCSVファイルに入れたいと思いやり方を調べました。まずCSVファイルにデータを書き出すことを「出力」と言い、CSVファイルのデータを読み込むことを「入力」というらしい。今回やりたいのはデータの書き出し「出力」。
また、encoding/csvパッケージを使えば、GoでCSV形式を扱うことができると分かったので、"encoding/csv"をインポート。
その後、書き出しについて調べていたのですが、書き出しは一行づつ書き込む方法(Write)と、一気に全部書き込む方法(WriteAll)とあるらしい。データが少ないとWriteAllでやったら簡単らしいが、書き出したいデータは多い?ためとりあえずWriteで実行することにしました。(この違いの意味は後程理解します。)
今回スクレイピングしてきたtitleとURLをCSVファイルに入れることが目標なのですが、Write関数は変数を1つしか入れられないことが分かったため、変数を1つにする=配列する必要があるのでは?と考え、この理解が正しいか@Sueken51さんに質問したところで今日が終わってしまいました。
今日できるようになったこと
・スクレイピングでより多くのデータを取ってくる
- Each関数で繰り返し処理をすること
- Text関数でテキスト文字を取得すること
- Attr関数で属性を指定すること
- Find関数で要素を指定すること
・CSVファイルの作成
・CSVファイルを開く作業
さいごに
まだまだ分からないところが多くて手探りな状態ですが、いつか色々繋がってくる時がでてくるまで根気強く頑張っていきたいと思います。
それではまた!