利用github.com/bitly/go-simplejson解析复杂的json,同步插入数据库
package main
import (
//"os"
"strconv"
"io/ioutil"
"log"
"net/http"
"github.com/bitly/go-simplejson"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
type Info struct {
name interface{} `json:"name"`
answer_count interface{} `json:"answer_count"`
is_vip interface{} `json:"is_vip"`
}
func Init() *sqlx.DB {
db,err := sqlx.Open(`mysql`,"root:xutao@tcp(172.17.0.3:3306)/test")
if err != nil{
log.Print(err.Error())
}
return db
}
func InsertData(allData []Info)(){
Db := Init()
for _,value := range allData{
Db.Exec("insert into zh set name = ?,count = ?,vip = ?",value.name,value.answer_count,value.is_vip)
}
defer Db.Close()
}
//获取页面数据返回解析
func getHrefData(href string) []byte {
client := &http.Client{}
req, err := http.NewRequest("GET", href, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
return bodyText
}
func getData(chs chan []Info) {
offset := 0
for {
var allData []Info
href := "https://www.zhihu.com/api/v4/members/haoos/followers?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset="+strconv.Itoa(offset)+"&limit=20"
bodyText := getHrefData(href)
js, err := simplejson.NewJson([]byte(bodyText))
if err != nil {
panic(err.Error())
}
datas,_ := js.Get("data").Array()
for _,v := range datas{
var tempInfo Info
v1 := v.(map[string]interface {})
vip_info1 := v1["vip_info"].(map[string]interface {})
tempInfo.name = v1["name"]
tempInfo.answer_count = v1["answer_count"]
tempInfo.is_vip = vip_info1["is_vip"]
allData = append(allData,tempInfo)
}
chs <- allData
offset += 20
if len(datas) == 0{
break
}
}
close(chs)
log.Print("获取数据结束")
}
func insert(chs chan []Info,flag chan int) {
for v := range chs{
InsertData(v)
}
flag <- 1
log.Print("插入数据结束")
}
func main() {
chs := make(chan []Info,10)
flag := make(chan int) //防止提前退出
go getData(chs) //获取数据
go insert(chs,flag) //同步插入数据库
<- flag
log.Print("结束")
}