GO 爬虫抓取json 怎么解析
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
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"
)
}
|