抓取网页数据(在mac上我使用Go和相应的数据库indiepic(图))

优采云 发布时间: 2021-10-03 20:21

  抓取网页数据(在mac上我使用Go和相应的数据库indiepic(图))

  上一节主要实现了使用goquery从图片网站中获取数据。它主要捕获图片的五个数据项:原创数据、宽度、高度、ALT和类型。因此,必须首先创建数据库和相应的表。在Mac上,我使用sequel Pro数据库管理软件。连接后,我创建了一个新的数据库indipic,然后创建了表gradisography:

  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 MySQL驱动程序是用于Go(golang)数据库/SQL包的轻量级快速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

}

  在上一节中,insertData(&imagedata)方法是在crawldata.go中编写的,但它是带注释的。您需要首先在该文件中实现该方法

  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目录,然后运行:

  go run indiepic.go

  然后可以看到数据存储在数据库中

  到目前为止,只实现了数据采集,但需要使用go向外部提供JSON接口。下一节将完成数据采集,并使用web框架返回JSON数据

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线