官方给出的api 接口:
了解结构
点击官方给出的api 接口 示例,你看,全是json 数据;那就好办了
查询天气
点击5-7 天的示例链接
你看,天气数据就出来
抓取逻辑
所以,逻辑就很清晰了,我们先找到想查看的城市,取出 weaId ,就把上面链接的weaid 换一下就可以了
"dtList": {
"1": {
"weaId": "1", # 城市id
"cityNm": "北京", # 地方名
"cityId": "101010100", # city id
"areaType": "cn",
"areaNm_1": "北京",
"areaNm_2": "城区",
"areaNm_3": "",
"mk": "1",
"upddate": "2015-07-07 11:17:39",
"remark": ""
},
python 调用
import requests # 用来发送网络请求
import json # 处理网页上的数据
url = 'http://api.k780.com' # 基础的url
# url 的参数;就是你的url 不是一大堆嘛,把他拆解开
params = {
'app': 'weather.city',
'areaType': 'cn',
'appkey': '10003',
'sign': 'b59bc3ef6191eb9f747dd4e83c99f2a4',
'format': 'json',
}
# 把服务器响应 赋值到response
response = requests.get(url, params=params)
# 200 就表示数据返回成功
if response.status_code == 200:
a_result = response.json() # 解析网页返回数据的json
if a_result:
#success: "1" 表示请求成功
if a_result['success'] != '0':
print(a_result['result'])
else:
# 否则打印错误信息
print(a_result['msgid'] + ' ' + a_result['msg'])
else:
print('Request nowapi fail.')
# 否则就是请亲失败了
else:
print(f'Request failed with status code {response.status_code}.')
你看areaId ,cityNm ,cityId 就出来了
调用地址weaId,实现查询
import requests
from datetime import datetime
your_place = input(str("请输出你想查看哪个市或县的天气: "))
# 以防出现市或县这样,要不然查不到数据
if your_place[-1] == '市' or your_place[-1] == '县':
your_place = your_place.replace(your_place[-1],"")
# 先获取地方id
url = 'http://api.k780.com' # 基础的url
# url 的参数;就是你的url 不是一大堆嘛,把他拆解开
params = {
'app': 'weather.city',
'areaType': 'cn',
'appkey': '10003',
'sign': 'b59bc3ef6191eb9f747dd4e83c99f2a4',
'format': 'json',
}
# 把服务器响应 赋值到response
resp = requests.get(url, params=params)
data = resp.json()
dt_list = data["result"]["dtList"]
#使用items()遍历字典,元组的形式返回的
# 这里就是值整体城市的字典,然后在遍历
for info in dt_list.items():
if (info[1]['cityNm'] == your_place ):
weaid = info[1]['weaId']
# 这个data 就是天气api
data = requests.get(f"https://sapi.k780.com/?app=weather.future&weaId={weaid}&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")
data= data.json()
print(f"{your_place}最近七日天气如下:")
for detail in data['result']:
# 输出格式化后的天气详情
print(f"{detail['week']},{detail['temperature']},{detail['weather']},{detail['wind']}, 今日最高温度:{detail['temp_high']}, 今日最低温度:{detail['temp_low']}")
效果:
你会发现今日最高温度,今日最低温度都不标准,没有摄氏度,今日星期也不会出,那就加个判断
import requests
from datetime import datetime
your_place = input(str("请输出你想查看哪个市或县的天气: "))
# 以防出现市或县这样,要不然查不到数据
if your_place[-1] == '市' or your_place[-1] == '县':
your_place = your_place.replace(your_place[-1],"")
url = 'http://api.k780.com' # 基础的url
# url 的参数;就是你的url 不是一大堆嘛,把他拆解开
params = {
'app': 'weather.city',
'areaType': 'cn',
'appkey': '10003',
'sign': 'b59bc3ef6191eb9f747dd4e83c99f2a4',
'format': 'json',
}
# 把服务器响应 赋值到response
resp = requests.get(url, params=params)
data = resp.json()
dt_list = data["result"]["dtList"]
today = datetime.now()
# 格式化日期为星期几
weekday_names = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
weekday_index = today.weekday() # 返回0(星期一)至6(星期日)
weekday_name = weekday_names[weekday_index]
#使用items()遍历字典,元组的形式返回的
# 这里就是值整体城市的字典,然后在遍历
for info in dt_list.items():
if (info[1]['cityNm'] == your_place ):
weaid = info[1]['weaId']
data = requests.get(f"https://sapi.k780.com/?app=weather.future&weaId={weaid}&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")
data= data.json()
print(f"{your_place}最近七日天气如下:")
for detail in data['result']:
# 如果当前项的星期与今天相同,则在其温度后面加上℃
if detail['week'] == weekday_name:
detail['temperature'] += "℃"
# 在最高温度和最低温度后面加上℃
detail['temp_high'] += "℃"
detail['temp_low'] += "℃"
# 输出格式化后的天气详情
print(f"{detail['week']},{detail['temperature']},{detail['weather']},{detail['wind']}, 今日最高温度:{detail['temp_high']}, 今日最低温度:{detail['temp_low']}")
效果:
封装成方法,函数 实现无限查询
import requests
from datetime import datetime
def seven_day():
url = 'http://api.k780.com' # 基础的url
# url 的参数;就是你的url 不是一大堆嘛,把他拆解开
params = {
'app': 'weather.city',
'areaType': 'cn',
'appkey': '10003',
'sign': 'b59bc3ef6191eb9f747dd4e83c99f2a4',
'format': 'json',
}
# 把服务器响应 赋值到response
resp = requests.get(url, params=params)
data = resp.json()
dt_list = data["result"]["dtList"]
today = datetime.now()
# 格式化日期为星期几
weekday_names = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
weekday_index = today.weekday() # 返回0(星期一)至6(星期日)
weekday_name = weekday_names[weekday_index]
#使用items()遍历字典,元组的形式返回的
# 这里就是值整体城市的字典,然后在遍历
for info in dt_list.items():
if (info[1]['cityNm'] == your_place ):
weaid = info[1]['weaId']
data = requests.get(f"https://sapi.k780.com/?app=weather.future&weaId={weaid}&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")
data= data.json()
print(f"{your_place}最近七日天气如下:")
for detail in data['result']:
# 如果当前项的星期与今天相同,则在其温度后面加上℃
if detail['week'] == weekday_name:
detail['temperature'] += "℃"
# 在最高温度和最低温度后面加上℃
detail['temp_high'] += "℃"
detail['temp_low'] += "℃"
# 输出格式化后的天气详情
print(f"{detail['week']},{detail['temperature']},{detail['weather']},{detail['wind']}, 今日最高温度:{detail['temp_high']}, 今日最低温度:{detail['temp_low']}")
def now_time():
# your_place = input(str("请输出你想查看哪个地方的天气: "))
# print(your_place)
resp = requests.get(
"https://sapi.k780.com/?app=weather.city&areaType=cn&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")
data = resp.json()
dt_list = data["result"]["dtList"]
# 使用items()遍历字典,元组的形式返回的
# 这里就是值整体城市的字典,然后在遍历
for info in dt_list.items():
if (info[1]['cityNm'] == your_place):
weaid = info[1]['weaId']
data = requests.get(
f"https://sapi.k780.com/?app=weather.today&weaId={weaid}&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")
data = data.json()
data = data['result']
print(
f"{data['citynm']},{data['days']},{data['week']},{data['weather']},当前天气:{data['weather_curr']},当前温度:{data['temperature_curr']},")
def fullday_time():
# your_place = input(str("请输出你想查看哪个地方的天气: "))
resp = requests.get(
"https://sapi.k780.com/?app=weather.city&areaType=cn&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")
data = resp.json()
dt_list = data["result"]["dtList"]
# 使用items()遍历字典,元组的形式返回的
# 这里就是值整体城市的字典,然后在遍历
for info in dt_list.items():
if (info[1]['cityNm'] == your_place):
weaid = info[1]['weaId']
data = requests.get(
f"https://sapi.k780.com/?app=weather.realtime&weaId={weaid}&ag=today,futureDay,lifeIndex,futureHour&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")
data = data.json()
data = data['result']
# 如果输入是市的话,就打印市的天气,否者就是县的天气了
if not your_place == data['area_3']:
print(data['area_2'], data['realTime']['week'], data['today']['wtNm1'], data['today']['wtWindNm1'])
print(data['area_3'], data['realTime']['week'], data['today']['wtNm1'], data['today']['wtWindNm1'],
data['today']['wtWinpNm1'])
print("今日建议如下:")
print(
f"紫外线指数: {data['today']['lifeIndex']['uv']['liAttr']},建议: {data['today']['lifeIndex']['uv']['liDese']}")
print(
f"穿衣指数: {data['today']['lifeIndex']['ct']['liAttr']}, 建议: {data['today']['lifeIndex']['ct']['liDese']}")
print(
f"洗车指数: {data['today']['lifeIndex']['xc']['liAttr']}, 建议: {data['today']['lifeIndex']['xc']['liDese']}")
print("\n")
print("\n")
data2 = data['futureHour']
print("接下来是24 小时天气情况:")
for j in data2:
print(j['dateYmdh'], j['wtNm'], j['wtWindNm'], j['wtWinpNm'])
your_place = input(str("请输出你想查看哪个市或县的天气: "))
# 以防出现市或县这样,要不然查不到数据
if your_place[-1] == '市' or your_place[-1] == '县':
your_place = your_place.replace(your_place[-1],"")
print(your_place)
# 主函数调用
def main():
print("\n")
print("=======================主菜单==========================")
print("欢迎来到牛牛 天气预报,请选择你的操作")
print("实时天气\t\t\t [输入1]")
print("最近7日预测\t\t [输入2]")
print("24天气\t\t\t [输入3]")
print("更改查询地区\t\t [输入4]")
print("退出\t\t\t\t [输入5]")
return int(input("请输入你的选择:"))
# 写一个死循环,实现无限查询
while True:
key = main()
if key == 1:
now_time()
elif key == 2:
seven_day()
elif key == 3:
fullday_time()
elif key == 4:
your_place = input(str("请输出你想更改的地区: "))
if your_place[-1] == '市' or your_place[-1] == '县':
your_place = your_place.replace(your_place[-1], "")
elif key == 5:
break
else:
print("对不起输入有误,请重试")
continue
实现无限查询
如果能力强的话,你还可以上传服务区做一个图形化,根据天气图像变化
列如