python 实现 天气查询,做一个“夜观天象”的Man

官方给出的api 接口:

天气预报所有城市 - 数据接口 - NowAPI

了解结构

点击官方给出的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




实现无限查询

如果能力强的话,你还可以上传服务区做一个图形化,根据天气图像变化

列如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值