1.用requests包和json包处理 import json(json包:用于实现Python数据类型与json字符串之间的转换)可取响应正文体的任意字段的value;适用于进行数据交互的场景,比如网站前台与后台之间的数据交互;
扩展:序列化和反序列化
序列化:給服务器发送一个请求的时候, 把Python对象转换成JSON字符串发給服务器的过程; 反序列化:拿到服务器的响应时候,把JSON字符串转换成python对象;
import requests
import json
res = requests.post(url='http://123.56.99.53:5000/event/weather/getWeather/',
headers={"Content-Type": "application/json"},
json={"theCityCode": "1001"})
print(res.text)
print(res.json()['date'])
requests -----自带功能,序列化 将字典转换成字符串
res.json() -----反序列化 将字符串转为字典,可通过字典取值
2. 用python自带的函数处理
# ~~ json.dumps()函数 序列化;是将字典转化为字符串; 即dict--->strimport json
a = {"name": "admin"}
print(json.dumps(a))
print(type(json.dumps(a)))
# ~~ json.loads()函数 反序列化;是将字符串转化为字典; str--->dict
import json
a1 = '{"name": "admin"}'
print(json.loads(a1))
print(type(json.loads(a1)))
练习:登录后取类型为户外
import json
session = requests.session()
res1 = session.post(url='http://....../event/api/admin/',
headers={"Content-Type": "application/x-www-form-urlencoded"},
data={"username": "admin", "password": "MTIzYWRtaW4="})
key = res1.json()['token']
uid = res1.json()['uid'] # uid = json.loads(res1.text)['uid']
# print(key)
# print(uid)
res2 = session.get(url='http://123.56.99.53:9000/event/api/get_eventlist/',
params={"type": "户外"},
headers={"key": key, "uid": uid})
# print(json.loads(res2.text))
for d in res2.json()['event_list']:
print(d['type'])
注:resqusts.json()['key'] 等同于 json.loads(resqusts.text)['key'],都是反序列化,用法不一样
二. 使用 jsonpath 解析 jsonpath. jsonpath(字典)JsonPath是一个数据提取工具,用于多层嵌套 json格式的 解析;
安装jsonpath 包的3种方法 ①pip install jsonpath ② 在pycharm setting 中找到项目解释器,搜索该包并安装 ③在控制台点击Terminal输入命令并安装
注:安装后输入 import jsonpath 看是否可成功引用; 可用json.loads()or res.json将字符串转成字典;
/A/B A下面一级子节点B /A//B A下面的所有递归路径下的B $A.B A下面一级子节点B $A..B A下面的所有递归路径下的B $..B 所有递归路径下的B json 必须用双引号 字典单双都可
import jsonpath r = jsonpath.jsonpath(data, expr='$.store.book[0].title') print(r) # #找到一个元素 返回一个列表,里面只有一项; r = jsonpath.jsonpath(data, expr='$.store.book[?(@.isbn)].title') print(r) # 找到多个元素,返回列表(多项) #没找到元素,返回 False
1.测接口,2.拿响应,3.响应转字典,4.用jsonpath解析,拿字段
res = requests.get(url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5')
data = res.json()['data']
data = json.loads(data)
childrens = jsonpath.jsonpath(data, '$.areaTree[0].children')
for ch in childrens[0]:
name = ch['name']
confirm = ch['today']['/confirm/i']
if confirm > 0:
print(f"{name}: {/confirm/i}")
for ch2 in ch['children']:
if ch2['today']['/confirm/i']>0:
print(f" {ch2['name']}:{ch2['today']['/confirm/i']}")
三. 爬虫 多个json爬取
url = 'http://123.56....et_data/'
res = requests.get(url=url, params={"page": 1, "limit": 10})
count = res.json().get("count",0)
limit = 10
if count % limit ==0:
max_page = count / limit
else:
max_page = int(count/limit)+1
for i in range(1, max_page+1):
res = requests.get(url=url, params={"page": i, "limit": 10})
# print(res.json()['data'])
for d in res.json()['data']:
if d['username'] == 'test':
print(d['oid'])
注:可用此网站辅助查看json正文的层级结构&校验json格式: JSON在线解析及格式化验证 - JSON.cn



