Python(爬虫篇)--- Json模块 <含高德地图实例>


Json数据

Json(JavaScript Object Notation,JS 对象标记)是一种轻量级的数据交换格式。 json 是 js 对象的字符串表达式,他使用文本形式表示一个 js 对象的信息,本质是一个字符串。

Js 中对象和数组是比较特殊并且常用的两种类型:
1.对象表示为键值对
2.数据有逗号分隔
3.花括号保存对象
4.方括号保存数组。

json 作为数据包格式传输的时候具有更高的效率,这是因为 json 不像 xml 那样具有严 格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输的压力大大减低,易于阅读,有效提升网络速度。


处理Json数据的两种方式

一、使用json模块

1.模块方法

  1. json.loads() :将json格式数据转换成python类型
json_data = '{"name":"zhangsan","age":20}'
result = json.loads(json_data)
print(result)  # {'name': 'zhangsan', 'age': 20}
  1. json.dumps() :将python类型转换成json格式数据
data = {'name':'zhangsan','age':20}
res = json.dumps(data)
print(res)  # {"name": "zhangsan", "age": 20}
print(type(res))  # <class 'str'>
  1. json.dump() :将python类型转换成json格式数据,并保存至文件
data = {'name':'zhangsan','age':20}
with open('json_test.txt','w',encoding='utf-8') as fp:
     json.dump(data,fp)
  1. 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 数据类型的响应格式数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值