はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。
引き続きスクレイピングのプロジェクトをつくっていきます。
バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
本日の学習内容
本日はMySQLのテーブルリセットとスクレイピングのループを追加しました。
- DBテーブルのリセットとスクレイピングのループ処理追加 ←Topics!!
DBテーブルのリセットとスクレイピングのループ処理追加
URL一覧のスクレイピングコードを調整しました。
①スクレイピングの開始時に毎回DBテーブルをリセットする機能
②複数ページをスクレイピングできるようにループ処理
の2点を追加しました。
ついでにmain.go
にまとめて書いていたスクレピング実行文をscrape
パッケージに移動しました。
①については、毎回リセットでいいのでgorm.Migrator().DropTable()
を使用してテーブル毎削除 → 直後にマイグレーションの流れにしました。
②は通常のfor
文を使用しているだけですが、アクセスの間隔をあけるためのtime.Sleepを入れてます。
また、ページをすべてスクレピングしたあとにまとめてINSERTしてほしいので、gorm.Create()
はループの外に出してあります。
package main
import (
"job_offer_scraping/db"
"job_offer_scraping/scrape"
)
func main() {
dbconn := db.DbConnect()
scrape.SaveURLs(dbconn)
}
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.Migrator().DropTable(&Mynavi_url{})
db.AutoMigrate(&Mynavi_url{})
return db
}
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)
}
使用している教材はこちら↓
おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。