分享
  1. 首页
  2. 文章

Go抓取网页数据并存入MySQL和返回json数据<三>

Arron_yr · · 2936 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

上一节主要实现了使用 goquery 从图片网站 http://www.gratisography.com/ 抓取数据。主要抓取图片的data-originalwidthheightalttype 五项数据。因此需要先创建数据库和相应的表,在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}, "\t-->\t"))
 }
 }
}

到此已经完成了数据抓取并存入数据库,在命令行中切换到$GOPATH/src/indiepic目录下,然后运行:

go run indiepic.go

随后就可以看到数据被存入数据库了。
到这里只实现了数据的获取,但是需要使用GO向外部提供json接口,下一节完成数据的获取和使用web框架返回json数据。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:Arron_yr

查看原文:Go抓取网页数据并存入MySQL和返回json数据<三>

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2936 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏