php是最好的语言

golang爬取知乎粉丝数据

利用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("结束")

}


作者:xTao 分类:LNMP 浏览:2358 评论:0