LoginSignup
1
0

More than 1 year has passed since last update.

【#53 エンジニア転職学習】goqueryでスクレイピングした情報をDBに一括保存する

Posted at

はじめに

富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

引き続きスクレイピングのプロジェクトをつくっていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

本日の学習内容

本日はスクレイピングしてきたURL一覧をDB保存する部分を作成しました。

  • goqueryでスクレイピングしたURL一覧をDBに一括保存する ←Topics!!

goqueryでスクレイピングしたURL一覧をDBに一括保存する

昨日作成した、求人詳細へのリンクURL一覧を取得するコードに
MySQLへの一括保存をするコードを追加しました。

一括でINSERTする方法は、結論から言うと「gorm.CreateメソッドにDBモデルのstructを持つスライスを渡す」方法になります。
動画ではバルクインサートという手法が紹介されており、
私もバルクインサートになるかは分かりませんが、MySQLへのトランザクションをできるだけ少なくする構成にしました。

手順は以下のようにステップアップしました。

  1. goqueryで取得してきたURLを1レコードずつCreateで保存できるか確認
  2. 取得してきたURLをDBテーブルモデルのstructを持つスライスに追加する
  3. URL一覧が入ったスライスをCreateで一括INSERTする

完成したコードの実行後、MySQLを確認すると
↓ のように同じ時間でINSERTされていることが分かります。
今はレコード数が少ないので体感あまり変わらなかったですが、
レコード数が増えれば実行時間の差が出てくるのだと思います。

image.png

main.go
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)

}
dbmodels.go
package db

import "gorm.io/gorm"

type Mynavi_url struct {
	gorm.Model
	URL string
}
base.go
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
}

使用している教材はこちら↓

おわりに

最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0