小白学爬虫(四)-- 数据提取之json

前言

前面两篇文章介绍了如何获取一个响应,但是响应都不是我们直接需要的数据,而是一些html页面或者json字符串。这篇文章主要介绍如何从返回的响应中提取需要的内容。

json

什么是 JSON ?

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
  • JSON 具有自我描述性,更易理解

上面这个是菜鸟教程里面json的解释。其实json就是一种数据交换格式,数据交换(Data Switching)是指在多个数据终端设备(DTE)之间,为任意两个终端设备建立数据通信临时互连通路的过程。而json就是数据交换的一种格式或者说一种协议。

json格式

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组

比如:

{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" }, 
{ "name":"google" , "url":"www.google.com" }, 
{ "name":"微博" , "url":"www.weibo.com" }
]
}

利用json提取数据

以百度翻译为例

import requests

url = "http://fanyi.baidu.com/basetrans"
query_string = {"query":"一个人并不是生来就要给打败的,你尽可以消灭它,但就是打不败它",
"from":"zh",
"to":"en",}
m_headers = {
    "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36"
}
reponse = requests.post(url,data = query_string,headers = m_headers)

print(reponse)  
print(reponse.content.decode())     

运行结果如下:

{"errno":0,"from":"zh","to":"en","trans":[{"dst":"A man is not born to defeat. You can destroy it, but you can not defeat it.","prefixWrap":0,"src":"\u4e00\u4e2a\u4eba\u5e76\u4e0d\u662f\u751f\u6765\u5c31\u8981\u7ed9\u6253\u8d25\u7684\uff0c\u4f60\u5c3d\u53ef\u4ee5\u6d88\u706d\u5b83\uff0c\u4f46\u5c31\u662f\u6253\u4e0d\u8d25\u5b83","relation":[],"result":[[0,"A man is not born to defeat. You can destroy it, but you can not defeat it.",["0|90"],[],["0|90"],["0|75"]]]}],"dict":[],"keywords":[{"means":["one"],"word":"\u4e00\u4e2a\u4eba"},{"means":["isn't","fault","blame","ain't","an't"],"word":"\u4e0d\u662f"},{"means":["have an instinct for"],"word":"\u751f\u6765\u5c31"},{"means":["beat","defeat","suffer a defeat","be defeated","vanquish"],"word":"\u6253\u8d25"},{"means":["can","may","passable","pretty good","Ok"],"word":"\u53ef\u4ee5"},{"means":["eliminate","perish","die out","annihilate","cut the throat of"],"word":"\u6d88\u706d"},{"means":["quite right","exactly","even if","even","namely"],"word":"\u5c31\u662f"},{"means":["unbeaten","undefeated","invincible"],"word":"\u4e0d\u8d25"}]}

容易看出上面这个是一个json格式的数据。

现在要做的就是从这个里面提取需要的数据,就是这句:”A man is not born to defeat. You can destroy it, but you can not defeat it”。这句话在”trans”这个键对应的数组值里面。首先利用json.loads() 方法将json格式的字符串转换成python格式,然后再进行提取。最后将所得值保存在一个文件里面。完整代码如下:

import requests
# 导入json, 不需要安装
import json
url = "http://fanyi.baidu.com/basetrans"

query_string = {"query":"一个人并不是生来就要给打败的,你尽可以消灭它,但就是打不败它",
"from":"zh",
"to":"en",
}
# 使用header   
m_headers = {
    "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36"
    #"Referer": "http://fanyi.baidu.com/?aldtype=16047"
}
# 获取响应
reponse = requests.post(url,data = query_string,headers = m_headers)
# 使用json.loads将json类型的字符串转化为python类型
python_str = json.loads(reponse.content.decode())
# 获取需要的内容
string = python_str["trans"][0]["dst"]
# 保存在trans.txt里面
with open("trans.txt", "w", encoding="utf-8") as f:
    f.write(string)

最后结果就是:
这里写图片描述

另外 如果要最后保存的数据为json类型,那么可以利用 json.dumps() 方法将pyton类型转化为json类型。这个方法有两个参数,

  • ensure_ascii = False:表示最后的结果不用ascii显示出来,如果是中文还是中文
  • indent = 2:表示下一行在上一行的基础上空两格
json.dumps(json_str, ensure_ascii=False, indent=2)

什么地方会返回json数据?

一般将浏览器切换到手机版或者使用抓包app的时候返回的数据格式为 json

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值