什么是JSON
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation),是轻量级的文本数据交换格式,且具有自我描述性,更易理解。
JSON看起来像python类型(列表,字典)的字符串。
数据处理
在之前的文章中,我们说到了怎么用response的方法,获取到网页正确解码后的字符串。如果还有不懂的,可以先阅读Python爬虫(三)Requests库。接下来以有道翻译为例子,说说怎么通过网页解码后的字符串,提取到翻译结果。
- json.loads()首先我们先来看下,通过response.content.decode()解码之后得到的是什么类型的数据。通过打印出来type可以看到,我们解码之后得到的是str类型的数据。
若想进一步提取数据,则需要将str转换成python中的字典,python的json库为我们提供了json.loads()用于将str类型的数据转成dict。其用法为:
import json
json.loads(json字符串)
再结合上述有道翻译的例子,得到字典类型的返回结果,并提取出来翻译结果。
import requests
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
data = {'i': '人生苦短,我用python',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15598805838805',
'sign': '601e9410133b355529e58d23a6c60578',
'ts': '1559880583880',
'bv': '565657d9b2f836d2c4c3a1fd81d7b3c3;',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
response = requests.post(url, data=data, headers=headers)
html_str = response.content.decode()
#将字符串转换成字典
dict_json = json.loads(html_str)
#打印转换之后的数据以及数据类型
print(dict_json)
print(type(dict_json))
#获取翻译结果
ret = dict_json['translateResult'][0][0]['src']
print('翻译结果是:',ret)
执行结果如下:
- json.dumps()
当我们对爬虫数据进行处理时,当然不希望它们仅仅是显示出来,还希望把提取到的数据保存起来。但是当我们在把字典类型的数据写入文本时,是写入不成功的。这个时候就需要将字典类型转换成字符串,再写入到文本之中,json.dumps()的作用就是实现这一功能。在上述例子中,我们将得到的dict_json直接写入文本,会出现如下报错:TypeError: write() argument must be str, not dict。为了能够将字典类型的数据,转换成str字符串,则需要用json.dumps(),其用法如下:
import json
json.dumps(字典)
将上述例子的dict_json换成str字符串,再写入文本中。
import requests
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
data = {'i': '人生苦短,我用python',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15598805838805',
'sign': '601e9410133b355529e58d23a6c60578',
'ts': '1559880583880',
'bv': '565657d9b2f836d2c4c3a1fd81d7b3c3;',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
response = requests.post(url, data=data, headers=headers)
#将字符串转换成字典
dict_json = json.loads(html_str)
#将字典转换成字符串并写入fnayi.txt文件中
fanyi_str = json.dumps(dict_json)
with open('fanyi.txt', 'w') as f:
f.write(html_str)
执行完上述的程序,会得到一个fanyi.txt的文件,其结果如下:{“type”: “ZH_CN2EN”, “errorCode”: 0, “elapsedTime”: 1, “translateResult”: [[{“src”: “\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528python”, “tgt”: “Life is too short, I use python”}]]}。这样子的一份文档,中文部分显示的是二进制,且格式非常不利于阅读,这并不是我们想要的结果。好在json.dumps()为我们提供的两个方法,以帮助我们更好阅读文档。
1.ensure_ascii,能够让中文显示成中文;
2.indent,能够让下一行在第一行的基础上空格。
其用法如下:
fanyi_str = json.dumps(dict_json, ensure_ascii=False, indent=2)
with open('fanyi.txt', 'w', encoding='utf-8') as f:
f.write(fanyi_str)
输出结果如下:
- json.loads()、json.load()、json.dump()以及json.dumps的区别
在输入json.loads()时,PyCharm自动提示中,还有另外一个json.load()。好奇之下,就整理了一下json.loads()、json.load()、json.dump()以及json.dumps的区别,感兴趣的可以通过Python爬虫之json.loads()、json.load()、json.dump()以及json.dumps的区别查看。
作者:咸甜怪
链接:https://www.jianshu.com/p/1f13e93e6ab8
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。