エンジニア採用担当がプログラミング頑張る話【5日目/2ヶ月間】
こんにちは、@hiroki_maekawaです。
昨日初めてコード書けた!反映された!という感動から一夜明けて、まずは@Sueken51さんから頂いたコメント、フィードバックの解読から1日が始まりました。
今日スクレイピングまでやって、明日明後日でMySQL勉強して取ってきたデータをつっこむところまでいくのが今週の目標です。
今日の目標
1. コメント、フィードバックの内容を理解する
2. スクレイピングする
1. コメント、フィードバックの内容を理解する
response, _ := http.Get("")
resp, err := http.Get("") ///Package httpにこっちは書いてあったけど”_”の記載はなし
一行目のコードの"_"の意味が分からず質問したところ、
関数、返り値など馴染みのない単語のオンパレードだったので(A Tour of Goちゃんとやってないからやな。)、下記のページで関数の理解、というよりGo言語の理解、というよりプログラミング言語の理解(?)を試みました。
これもまた複数のサイトを参考にしながら、関数、変数、引数、型、戻り値(返り値)、For(ループ)、If, Switch(条件分岐)、Defer(遅延実行)の概念を何とか理解しました。
また、下記のサイトから、「引値や戻り値の個数によって関数の書き方も色々あるのか。」ということを学びました。
ここまで理解したところで、ようやく頂いたコメントの意味を解釈することができました。
お次は昨日書いたコードのレビューについて
エラーハンドリングとは、エラーが起きたことに気づけるようなコードを書いとけ!ということで理解。
エラーハンドリングについて調べたところ、print系関数を変えることでエラーの出し方を変えることができることが分かりました。とりあえずそのままの書体で出力してくれるやつを使って書いてみました。
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://www.crunchbase.com/organization/zoom-video-communications#section-overview"
resp, err := http.Get(url) //①HTTPリクエスト行を入れる
if err != nil { //③万が一のエラーのためのコードを入れる
fmt.Printf("%s\n", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) //②ReadAll入れる
if err != nil {
fmt.Printf("%s\n", err)
}
println(string(body)) //④HTMLをStringで取得するコードを入れる
}
合ってることを願い、ようやく今日の本題であるスクレイピングへ(本題の前に今日のHPが半分以下。)
2. スクレイピングする
スクレイピングは、3日目のブログで調べた通り、「データや情報から余分な物を削り取って抽出することを言う。」という意味なので、恐らくhttpリクエストで取れたHTMLテキストから、いらないところを捨てて、必要な情報だけ持ってきますという作業をするのだろうと理解。
早速"Go スクレイピング"で検索し、皆さん何をやっているのか調べました。
抜き出しとかしてるので、必要な情報を取ってきたりできるんですね。
また、皆さんgoqueryというライブラリを使っていて「これは直感的に使えて簡単だ!」と感動されていたので、自分もgoqueryでスクレイピングすることにしました。
それでは早速インストール。
$ go get github.com/PuerkitoBio/goquery
と、ここまできたところで、昨日GETリクエストできたと思われていたWebサイトから拒否られていることに気づき、、これは何が原因なんだと考えていてるうちにHPと時間が食われました。。リクエストするサイトを変更することで解決し(させ)ました。
Access to this page has been denied because we believe you are using automation tools to browse the website.
そして、タイトルを取得して表示させようと思い、昨日Goで書いたコードの上からgoqueryで書いてたら2点事件発生。
①コード書いて保存したら、importしてた”github.com/PuerkitoBio/goquery”や"io/ioutil”が自動で消えてしまうという。。Goとgoqueryは共存できないのかなと思い、一旦全部消して、初めからgoqueryで書きました。
② title, err := doc.Find("title").Text()でエラーが出てしまう。。 今日の朝「エラーハンドリングして下さい。」と言われたので全部にエラーハンドリングつけてやろうと上のような感じで打ったのですができない。。errなしだとrunできるんですが。。
さいごに
とりあえず今日は下のコードをrunすることができました。
もう深夜なので、明日の朝一で上記2点を質問してみたいと思います。
もっと色々スクレイピングして表示できるようになりたい。。!!
それではまた!