实战:
前言:
解析JSON格式的数据对于爬虫来说非常重要,网页中大部分的接口基本返回的都是这个格式,如果只是想要小部分的数据可以使用字符串的分割,但是一般爬取内容基本不会小部分…如果一直使用字符串分割非常的消耗时间和内存
什么是JSON格式?
先看看长什么样子
这是一个对象格式的数据
{ "name": "生产队的驴", "age": "17", "state": "在线", "id": "dpc5201314", "phone": "18888888888", }
这就是一个简单的JSON格式的数据,当然爬虫一般数据没那么点…
JSON分为两种格式 一种是对象(Objtect),另一种是数组(Array) 不同的格式解析的方法不一样 但大同小异
分辨格式:
分辨格式特别简单
这是看他前面的符号 { } 是对象 ,[ ] 是数组
对象格式:
数组格式:
{ "employees": [ { "firstName": "Bill", "lastName": "Gates" }, { "firstName": "George", "lastName": "Bush" }, { "firstName": "Thomas", "lastName": "Carter" } ] }
{ 这是对象 }
[ 这是数组 ]
数组是可以通过下标访问的
JSON结构:
可以看到他是一个 数型 结构
访问里面的元素结需要 先拿下 树根(employees)然后这得到 树叶(firstName)
上面说到 数组是可以通过下标访问对应的内容
C#解析
简单的介绍了一下他的格式 接下来就是这么使用C#解析他了
需要使用到 Newtonsoft.Json 类库
安装即可
命名空间:
using Newtonsoft.Json.Linq;
记得导入命名空间
对象 和 数组所以的函数不一样
对象:JObject
数组:JArray
JS整理工具:
正常爬虫 返回的数据非常的乱 所以需要搭配JS工具来整理
无从下手
整理后一目了然
对象解析:
首先需要有JSON数据,这里方便演示直接从本地导入…当然正常爬虫是从服务器上获取的…只是为了演示
StreamReader read = new StreamReader(@"C:\Users\Acer\Desktop\1.txt", Encoding.UTF8); //读取文本 string str =read.ReadToEnd();
文本内容
{ } 是对象 使用对象的函数解析,
JObject arr = JObject.Parse(str); Console.WriteLine("名字:"+arr["name"]); Console.WriteLine("年龄:" + arr["age"]); Console.WriteLine("状态:" + arr["state"]); Console.WriteLine("账号:" + arr["id"]); Console.WriteLine("手机号:" + arr["phone"]);
通过对象 获取他的节点 arr[“age”]
因为不是实战…没难度
数组解析:
这个其实还是一个 对象 里面包含了一个数组 所以需要强制转换
读取JSON:
StreamReader read = new StreamReader(@"C:\Users\Acer\Desktop\2.txt", Encoding.UTF8); string str =read.ReadToEnd();
强制转格式:
JObject j = JObject.Parse(str); JArray r = (JArray)j["employees"]; //强制转成数组 因为要获取employees
转换成功后就可以 使用下标去获取 需要的数据了
显示数据:
Console.WriteLine(r[1]["firstName"]);
第一个[ ]为下标 第二个为 获取哪个节点
如果需要显示全部数据那就可以 使用循环访问下标 获取
for (int i = 0; i < r.Count; i++) { Console.WriteLine(r[i]["firstName"]); }
其他节点也是一样的
for (int i = 0; i < r.Count; i++) { Console.WriteLine(r[i]["firstName"]); Console.WriteLine(r[i]["lastName"]+"\n"); }
说那么多 直接加入实战…
某评论区:
数据太乱 去整理
因为JSON是可以嵌套的 当每次想访问哪个节点时 就必须先获取上一个节点
所有的数据都包含 data (树根)上 里还嵌套着 visionCommentList 和 rootComments 其中rootComments 就是他的评论数据 他是一个数组
authorName:用户名
content:评论内容
headurl:用户头像
这是一个对象 先用对象的方式获取他
JObject j = JObject.Parse(str);
获取嵌套的节点:
string js = j["data"]["visionCommentList"]["rootComments"].ToString(); JArray r = JArray.Parse(js); //剩下的就是 数组 然后使用数组的方式解析
循环下标 显示评论
for (int i = 0; i < r.Count; i++) { Console.WriteLine("\n"+r[i]["authorName"]+": "+r[i]["content"]); }
总结:
好像都没什么难度,在真正做爬虫的时候 找接口 和 传递的参数才是难点…
纯手打,点个赞呗~