上一節主要實現了使用 goquery 從圖片網站 http://www.gratisography.com/ 抓取資料。主要抓取圖片的data-original
、width
、height
、alt
、type
五項資料。因此需要先建立資料庫和相應的表,在mac上我使用 Sequel Pro
資料庫管理軟體,連線之後建立新的資料庫indiepic
,然後建立表gratisography
:
CREATE TABLE `gratisography` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`img_url` varchar(255) DEFAULT NULL,
`type_name` varchar(50) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`width` int(11) DEFAULT NULL,
`height` int(11) DEFAULT NULL,
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=388 DEFAULT CHARSET=utf8;
建立完資料庫之後,就開始使用GO來實現連線資料庫等操作了。在GO中使用Go-MySQL-Driver is a lightweight and fast MySQL-Driver for Go`s (golang) database/sql package
文件:http://godoc.org/github.com/go-sql-driver/mysql
在使用之前需要先使用以下命令獲取該包:
go get github.com/go-sql-driver/mysql
然後在database.go
中引入:
package crawldata
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
然後寫一個開啟資料庫的方法OpenDatabase
:
package crawldata
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func OpenDatabase() (*sql.DB, error) {
// 連線資料庫
db, err := sql.Open("mysql", "root:mysql@tcp(xxx.xx.xx.xxx:3306)/databaseName?charset=utf8")
if err != nil {
return nil, err
}
return db, nil
}
上一節已在crawldata.go
中寫了InsertData(&imageDatas)
方法,但是是註釋的,先在就需要在該檔案中實現該方法。
package crawldata
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"strconv"
s "strings"
)
func OpenDatabase() (*sql.DB, error) {
// 連線資料庫
db, err := sql.Open("mysql", "root:mysql@tcp(xxx.xx.xx.xxx:3306)/databaseName?charset=utf8")
if err != nil {
return nil, err
}
return db, nil
}
/*
該函式將獲取的資料儲存到資料庫
*/
func InsertData(datas *ImageDatas) {
imageDatas := *datas
// 連線資料庫
db, err := OpenDatabase()
if err != nil {
fmt.Printf(s.Join([]string{"連線資料庫失敗", err.Error()}, "-->"))
}
defer db.Close()
for i := 0; i < len(imageDatas); i++ {
imageData := imageDatas[i]
// Prepare statement for inserting data
imgIns, err := db.Prepare("INSERT INTO gratisography (img_url, type_name, title, width, height) VALUES( ?, ?, ?, ?, ? )") // ? = placeholder
if err != nil {
fmt.Println(s.Join([]string{"拼裝資料格式", err.Error()}, "-->"))
}
defer imgIns.Close() // Close the statement when we leave main()
img, err := imgIns.Exec(s.Join([]string{"http://www.gratisography.com", imageData.Src}, "/"), imageData.Tp, imageData.Title, imageData.Width, imageData.Height)
if err != nil {
fmt.Println(s.Join([]string{"插入資料失敗", err.Error()}, "-->"))
} else {
success, _ := img.LastInsertId()
// 數字變成字串,success是int64型的值,需要轉為int,網上說的Itoa64()在strconv包裡不存在
insertId := strconv.Itoa(int(success))
fmt.Println(s.Join([]string{"成功插入資料:", insertId}, " --> "))
}
}
}
到此已經完成了資料抓取並存入資料庫,在命令列中切換到$GOPATH/src/indiepic
目錄下,然後執行:
go run indiepic.go
隨後就可以看到資料被存入資料庫了。
到這裡只實現了資料的獲取,但是需要使用GO向外部提供json
介面,下一節完成資料的獲取和使用web框架返回json資料。