上一節主要實現了使用 goquery 從圖片網站 http://www.gratisography.com/ 抓取數據。主要抓取圖片的data-original
、width
、height
、alt
、type
五項數據。所以須要先建立數據庫和相應的表,在mac上我使用 Sequel Pro
數據庫管理軟件,鏈接以後建立新的數據庫indiepic
,而後建立表gratisography
:mysql
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 packagegit
文檔:http://godoc.org/github.com/go-sql-driver/mysqlgithub
在使用以前須要先使用如下命令獲取該包:golang
go get github.com/go-sql-driver/mysql
而後在database.go
中引入:web
package crawldata import ( "database/sql" _ "github.com/go-sql-driver/mysql" )
而後寫一個打開數據庫的方法OpenDatabase
:sql
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}, "\t-->\t")) } } }
到此已經完成了數據抓取並存入數據庫,在命令行中切換到$GOPATH/src/indiepic
目錄下,而後運行:json
go run indiepic.go
隨後就能夠看到數據被存入數據庫了。
到這裏只實現了數據的獲取,可是須要使用GO向外部提供json
接口,下一節完成數據的獲取和使用web框架返回json數據。框架