Python3 爬虫(六):Json 和 JsonPath 应用
JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使的人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。
Json 简单说就是 javascript 中的 对象和 数组,所以这两种结构就是对象和数据两种结构,通过这两种结构可以表示各种复杂的结构。
对象:对象在js中表示为{}括起来的内容,数据结构为{key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。
数组:数组在js中是中括号[]括起来的内容,数据结构为[“Python”, “javascript”, “C++”,..],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。
Python3 当中自带了 Python 模块,官网:https://docs.python.org/3/library/json.html
Python3 使用 Json
json 模块是 python3 中自带的一个库,使用的时候只需直接导入便可:
import json
json模块提供了四个功能:dumps、dump、loads、load
json.loads()
把 Json 格式字符串解码转换成 Python 对象,从 Json 到 Python 的类型转化对照如下:
import json
strList = '[1, 2, 3, 4, 5, 6, 7, 8, 9]'
strDict = '{"city": "西安", "name": "wangxin"}'
print(json.loads(strList))
print(json.loads(strDict))
json.dumps()
实现 Python 类型转化为 Json 字符串,返回一个 str 对象把一个 Python 对象编码转换成 Json 字符串。
从 Python 原始类型向 Json 类型转化的对照表如下:
import json
# chardet是一个编码识别模块,可通过pip3安装
import chardet
listStr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
tupleStr = (1, 2, 3, 4, 5, 6, 7, 8, 9)
dictStr = {"city":"西安", "name":"wangxin"}
print(type(json.dumps(listStr)))
print(type(json.dumps(tupleStr)))
#注意,json.dumps()序列化时默认使用ascii编码
#添加参数 ensure_ascii = False,禁用ascii编码,按utf-8编码
print(json.dumps(dictStr))
print(chardet.detect(json.dumps(dictStr)))
print(json.dumps(dictStr, ensure_ascii=False))
print(chardet.detect(json.dumps(dictStr, ensure_ascii=False)))
json.load()
读取文件中 Json 形式的字符串元素 转化成 Python 类型
import json
strList = json.load(open("listStr.json"))
print(strList)
strDict = json.load(open("dictStr.json"))
print(strDict)
json.dump()
将 Python 内置类型序列化为 Json 对象后写入文件
import json
listStr = [{"city": "北京"}, {"name": "大刘"}]
json.dump(listStr, open("listStr.json","w"), ensure_ascii=False)
dictStr = {"city": "北京", "name": "大刘"}
json.dump(dictStr, open("dictStr.json","w"), ensure_ascii=False)
JsonPath
JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,类似于 XPath 在 xml 文档中的定位,JsonPath 表达式通常是用来路径检索或设置 Json 的。
安装 JsonPath
JsonPath 可以使用 pip3 来进行安装:
$ pip3 install jsonpath
JsonPath 与 Xpath 语法对比
son结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法:
示例
从https://www.lagou.com/lbs/getAllCitySearchLabels.json中获取所有的城市信息
import json
import jsonpath
import urllib.request
def get_city():
url = 'https://www.lagou.com/lbs/getAllCitySearchLabels.json'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko'
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
# print(html)
# 将 json 内容转换为 python 对象
jsonobj = json.loads(html)
# 进行json内容的解析
city_list = jsonpath.jsonpath(jsonobj, '$..name')
for item in city_list:
print(item)
# 将 python 数组转换为 json 对象
array = json.dumps(city_list, ensure_ascii=False)
# 写入文件
with open('lagoucity.txt', 'w') as file:
file.write(array)
if __name__ == '__main__':
get_city()