Json数据
Json(JavaScript Object Notation,JS 对象标记)是一种轻量级的数据交换格式。 json 是 js 对象的字符串表达式,他使用文本形式表示一个 js 对象的信息,本质是一个字符串。
Js 中对象和数组是比较特殊并且常用的两种类型:
1.对象表示为键值对
2.数据有逗号分隔
3.花括号保存对象
4.方括号保存数组。
json 作为数据包格式传输的时候具有更高的效率,这是因为 json 不像 xml 那样具有严 格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输的压力大大减低,易于阅读,有效提升网络速度。
处理Json数据的两种方式
一、使用json模块
1.模块方法
- json.loads() :将json格式数据转换成python类型
json_data = '{"name":"zhangsan","age":20}'
result = json.loads(json_data)
print(result) # {'name': 'zhangsan', 'age': 20}
- json.dumps() :将python类型转换成json格式数据
data = {'name':'zhangsan','age':20}
res = json.dumps(data)
print(res) # {"name": "zhangsan", "age": 20}
print(type(res)) # <class 'str'>
- json.dump() :将python类型转换成json格式数据,并保存至文件
data = {'name':'zhangsan','age':20}
with open('json_test.txt','w',encoding='utf-8') as fp:
json.dump(data,fp)
- json.load() :将json格式数据转换成python类型,并读取文件内容
# 基于3案例生成的文件
with open('json_test.txt','r',encoding='utf-8') as fp:
content = json.load(fp)
print(content) # {'name': 'zhangsan', 'age': 20}
print(type(content)) # <class 'dict'>
注意:定义json格式数据时,字符串里面的内容是单引号包裹的(必须是单引号)
2.实例
需求:在高德地图官网完成全部城市的天气情况获取,并保存本地
通过对比,发现每个城市的adcode不同
没有规律,所以,只能找出所有城市的adcode即可
发现问题:在页面的城市列表,出现304错误
304 Not Modified(未更改):代表使用了缓存技术
如果客户端请求的状态码是304 Not Modified,代表发送了一个带有条件的请求
并且此请求被允许,但是文档没有修改。
请求头:If-None-Match: W/“1d-EsWsfsKVGf8K0KwA/CYp0TR0yk8”
响应头:ETag: W/“1d-EsWsfsKVGf8K0KwA/CYp0TR0yk8”
此时需要清理缓存
获得清理之后的url:https://www.amap.com/service/cityList?version=
完整代码:
# 导包
import requests,json
from openpyxl import Workbook
# 1. 实例化Workbook对象
wb = Workbook()
# 2. 激活工作表
ws = wb.active
# 3. 添加表头
ws.append(['城市名','天气','最低气温','最高气温'])
# 定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
}
# 2.发起请求,接收响应
response = requests.get(url='https://www.amap.com/service/cityList?version=',headers=headers)
# 获取cityByLetter
cityByLetter = response.json()['data']['cityByLetter']
# 定义获取天气的URL
weather_url = 'https://www.amap.com/service/weather?adcode={}'
# 获取所有城市
for city_list in cityByLetter.values():
for city in city_list:
lst = []
# 获取城市名
name = city['name']
# 获取adcode
adcode = city['adcode']
# 拼接URL,请求完整的URL
weather_response = requests.get(url=weather_url.format(adcode),headers=headers)
# 3. 使用json.loads()将json格式字符串转换成字典
data_dic = json.loads(weather_response.text)['data']['data'][0]['forecast_data'][0]
# 获取最高气温
max_temp = data_dic['max_temp']
# 获取最低气温
min_temp = data_dic['min_temp']
# 获取天气
weather_name = data_dic['weather_name']
lst.append(name)
lst.append(weather_name)
lst.append(min_temp)
lst.append(max_temp)
ws.append(lst)
print(name,max_temp,min_temp,weather_name)
# 保存数据
wb.save('全国天气.xlsx')
先获取数据,再使用此数据拼接成新的url发送请求,是爬虫的一种基本思想。
二、使用Resquests方法
如果使用 requests 模块来获取数据,也可以使用 response.json()直接获取 json 数据所对 应的 python 数据类型的响应格式数据。