LoginSignup
1
0

More than 1 year has passed since last update.

【#54 エンジニア転職学習】GORMでテーブルリセット/goqueryをループ処理

Posted at

はじめに

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

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

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

本日の学習内容

本日はMySQLのテーブルリセットとスクレイピングのループを追加しました。

  • DBテーブルのリセットとスクレイピングのループ処理追加 ←Topics!!

DBテーブルのリセットとスクレイピングのループ処理追加

URL一覧のスクレイピングコードを調整しました。
①スクレイピングの開始時に毎回DBテーブルをリセットする機能
②複数ページをスクレイピングできるようにループ処理

の2点を追加しました。
ついでにmain.goにまとめて書いていたスクレピング実行文をscrapeパッケージに移動しました。

①については、毎回リセットでいいのでgorm.Migrator().DropTable()を使用してテーブル毎削除 → 直後にマイグレーションの流れにしました。

②は通常のfor文を使用しているだけですが、アクセスの間隔をあけるためのtime.Sleepを入れてます。
また、ページをすべてスクレピングしたあとにまとめてINSERTしてほしいので、gorm.Create()はループの外に出してあります。

main.go
package main

import (
	"job_offer_scraping/db"
	"job_offer_scraping/scrape"
)

func main() {
	dbconn := db.DbConnect()
	scrape.SaveURLs(dbconn)
}
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.Migrator().DropTable(&Mynavi_url{})
	db.AutoMigrate(&Mynavi_url{})
	return db
}
scrape.go
package scrape

import (
	"job_offer_scraping/db"
	"log"
	"net/http"
	"strconv"
	"strings"
	"time"

	"github.com/PuerkitoBio/goquery"
	"gorm.io/gorm"
)

func SaveURLs(dbconn *gorm.DB) {

	var urllist []db.Mynavi_url

	for i := 1; i < 2; i++ {
		url := "https://tenshoku.mynavi.jp/list/pg"
		url += strconv.Itoa(i)
		url += "/"

		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)
		})
		time.Sleep(30 * time.Second)
	}
	dbconn.Create(&urllist)
}

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

おわりに

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

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