はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。
引き続きスクレイピングのプロジェクトをつくっていきます。
バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
本日の学習内容
本日はスクレイピングしてきたURL一覧をDB保存する部分を作成しました。
- goqueryでスクレイピングしたURL一覧をDBに一括保存する ←Topics!!
goqueryでスクレイピングしたURL一覧をDBに一括保存する
昨日作成した、求人詳細へのリンクURL一覧を取得するコードに
MySQLへの一括保存をするコードを追加しました。
一括でINSERTする方法は、結論から言うと「gorm.CreateメソッドにDBモデルのstructを持つスライスを渡す」方法になります。
動画ではバルクインサートという手法が紹介されており、
私もバルクインサートになるかは分かりませんが、MySQLへのトランザクションをできるだけ少なくする構成にしました。
手順は以下のようにステップアップしました。
- goqueryで取得してきたURLを1レコードずつCreateで保存できるか確認
- 取得してきたURLをDBテーブルモデルのstructを持つスライスに追加する
- URL一覧が入ったスライスをCreateで一括INSERTする
完成したコードの実行後、MySQLを確認すると
↓ のように同じ時間でINSERTされていることが分かります。
今はレコード数が少ないので体感あまり変わらなかったですが、
レコード数が増えれば実行時間の差が出てくるのだと思います。
package main
import (
"job_offer_scraping/db"
"log"
"net/http"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main() {
dbconn := db.DbConnect()
var urllist []db.Mynavi_url
url := "https://tenshoku.mynavi.jp/list/pg2/"
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
}
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
}
doc.Find("div.cassetteRecruit").Each(func(i int, s *goquery.Selection) {
href, _ := s.Find("p.cassetteRecruit__copy > a").Attr("href")
href = string([]rune(href))
url := strings.SplitAfterN(href, "/", 3)
trimurl := strings.Join(url[0:2], "")
mynaviurl := db.Mynavi_url{URL: trimurl}
urllist = append(urllist, mynaviurl)
})
dbconn.Create(&urllist)
}
package db
import "gorm.io/gorm"
type Mynavi_url struct {
gorm.Model
URL string
}
package db
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func DbConnect() *gorm.DB {
var dsn = "USER:PASS/job_offer_scraping?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
panic("failed connecting DB")
}
db.AutoMigrate(&Mynavi_url{})
return db
}
使用している教材はこちら↓
おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。