Go 爬虫解析 json 数据

GO 爬虫抓取json 怎么解析

Python
package main import ( "fmt" // 输出标准库 "github.com/levigross/grequests" // HTTP 请求库 "github.com/tidwall/gjson" // 解析 json 库 ) func main() { url := "https://www.lagou.com/lbs/getAllCitySearchLabels.json" resp,_ := grequests.Get(url,nil) // 请求目标网址 body:= resp.String() // 转换成 string 类型 if !gjson.Valid(body){ fmt.Println("Json is Erro") } datas := gjson.Get(resp.String(),"content").Get("data").Get("allCitySearchLabels") for _,v := range datas.Map(){ fmt.Println(v) for i, vData := range v.Array(){ fmt.Println(i, vData) } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main
 
import (
     "fmt"
     / / 输出标准库
     "github.com/levigross/grequests"
     / / HTTP 请求库
     "github.com/tidwall/gjson"
     / / 解析 json 库
)
 
 
func main ( ) {
     url : = "https://www.lagou.com/lbs/getAllCitySearchLabels.json"
 
     resp , _ : = grequests . Get ( url , nil )
     / / 请求目标网址
 
     body : = resp . String ( )
     / / 转换成 string 类型
 
     if ! gjson . Valid ( body ) {
         fmt . Println ( "Json is Erro" )
     }
 
     datas : = gjson . Get ( resp . String ( ) , "content" ) . Get ( "data" ) . Get ( "allCitySearchLabels" )
 
     for _ , v : = range datas . Map ( ) {
         fmt . Println ( v )
         for i , vData : = range v . Array ( ) {
             fmt . Println ( i , vData )
         }
     }
 
}
 
 

输出如下:

另外一个模块 jsonparser

Python
package main import ( "fmt" "github.com/buger/jsonparser" ) func main() { data := []byte(`{ "person": { "name":{ "first": "Leonid", "last": "Bugaev", "fullName": "Leonid Bugaev" }, "github": { "handle": "buger", "followers": 109 }, "avatars": [ { "url": "https://avatars1.githubusercontent.com/u/14009?v=3&s=460", "type": "thumbnail" } ] }, "company": { "name": "Acme" } }`) result, err := jsonparser.GetString(data, "person", "name", "fullName") if err != nil { fmt.Println(err) } fmt.Println(result) content, valueType, offset, err := jsonparser.Get(data, "person", "name", "fullName") if err != nil { fmt.Println(err) } fmt.Println(content, valueType, offset) //jsonparser提供了解析bool、string、float64以及int64类型的方法,至于其他类型,我们可以通过valueType类型来自己进行转化 result1, err := jsonparser.ParseString(content) if err != nil { fmt.Println(err) } fmt.Println(result1) err = jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error { fmt.Printf("key:%s\n value:%s\n Type:%s\n", string(key), string(value), dataType) return nil }, "person", "name") }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main
 
import (
     "fmt"
     "github.com/buger/jsonparser"
)
 
func main ( ) {
     data : = [ ] byte ( ` {
   "person" : {
     "name" : {
       "first" : "Leonid" ,
       "last" : "Bugaev" ,
       "fullName" : "Leonid Bugaev"
     } ,
     "github" : {
       "handle" : "buger" ,
       "followers" : 109
     } ,
     "avatars" : [
       { "url" : "https://avatars1.githubusercontent.com/u/14009?v=3&s=460" , "type" : "thumbnail" }
     ]
   } ,
   "company" : {
     "name" : "Acme"
   }
} ` )
 
     result , err : = jsonparser . GetString ( data , "person" , "name" , "fullName" )
     if err != nil {
         fmt . Println ( err )
     }
     fmt . Println ( result )
 
     content , valueType , offset , err : = jsonparser . Get ( data , "person" , "name" , "fullName" )
     if err != nil {
         fmt . Println ( err )
     }
     fmt . Println ( content , valueType , offset )
     / / jsonparser提供了解析 bool、 string、 float64以及 int64类型的方法,至于其他类型,我们可以通过 valueType类型来自己进行转化
     result1 , err : = jsonparser . ParseString ( content )
     if err != nil {
         fmt . Println ( err )
     }
     fmt . Println ( result1 )
 
     err = jsonparser . ObjectEach ( data , func ( key [ ] byte , value [ ] byte , dataType jsonparser . ValueType , offset int ) error {
         fmt . Printf ( "key:%s\n value:%s\n Type:%s\n" , string ( key ) , string ( value ) , dataType )
         return nil
     } , "person" , "name" )
}
 



  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值