爬取高德题图数据,制作简易天气预报系统

今天我们来通过爬取高德地图来制作简易的天气预报系统(后面有完整代码,大佬可以逆向观看哦)
下面是结果图:
在这里插入图片描述
开干!!!
目标网站:高德地图官网

https://www.amap.com/

老规矩按F12打开开发测试页面如下:
在这里插入图片描述
找到图中网络菜单:
在这里插入图片描述通过XHR栏我们找到天气列表的json请求:weather?adcode = 441400
在这里插入图片描述
假如你是直接百度搜高德地图,进去之后直接按F12的话,可能是没有这个请求的,这时你要返回高德地图那里点一下定位,让高德地图获取到你的定位:
在这里插入图片描述
接下来我们分析我们上面得到天气列表json url,找到该url:
在这里插入图片描述

https://www.amap.com/service/weather?adcode=441400

浏览器打开上面的url后就是城市的天气json:
在这里插入图片描述

“adcode = ”后面的 “441400”,就是我们要变的城市编号,每个天气列表json url对应一个编号,因此我们要爬取到不同的天气json url就只需要改adcode后面的数字就可

但是,其他城市的这个编号我们怎么知道呢,总不能随便写吧?

不急,我们可以重新回到网络请求那里,那里有我们想要的城市列表,这个列表里有城市名字跟城市编号
在这里插入图片描述
该url如下:
在这里插入图片描述

https://www.amap.com/service/cityList?version=202111320

该url后面的数字每天都不同,这个随时间变化的

好了,现在基本的数据准备我们有了,我们开始分析:
看到天气json的解析如下:
在这里插入图片描述
我们要的数据获取代码如下:
今天在前,明天在后,0和1的区别,具体看下面两张图
在这里插入图片描述
在这里插入图片描述
城市列表json如下:
在这里插入图片描述
很明显可以看到adcode跟name在一起的,我们可以用
列表把里面的json获取下来,之后再通过循环这个列表,解析json获取到里面的数据
在这里插入图片描述
结束!!
最后附上完整代码,因为该代码简单易懂,大家有兴趣琢磨琢磨,感谢大家的观看,有问题欢迎评论!!

# -*- coding: utf-8 -*-
# @Time : 2021/1/31 20:46
# @Author : 海龟
# @Site : 
# @File : 高德地图各城市天气.py
# @Software: PyCharm

import requests

urlCity = "https://www.amap.com/service/cityList?version=202111320"
urlWeather = "https://www.amap.com/service/weather?adcode={}"

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"
}

def getCity():
    """
    查询所有城市和编号
    :return:
    """

    city = []
    response = requests.get(url=urlCity, headers=headers)
    content = response.json()

    if "data" in content:
        cityByLetter = content["data"]["cityByLetter"]
        for k, v in cityByLetter.items():
            city.extend(v)
    return city

def getTodayWeather(adcode, name):
    """
    根据编号查天气
    :return:
    """
    info = {}
    # 获取url(adcode)结尾
    info["adcode"] = str(adcode)
    info["name"] = name

    response = requests.get(url=urlWeather.format(adcode), headers=headers)
    content = response.json()
    info["weather"] = content["data"]["data"][0]["forecast_data"][0]["weather_name"]
    info["max_temp"] = content["data"]["data"][0]["forecast_data"][0]["max_temp"]
    info["min_temp"] = content["data"]["data"][0]["forecast_data"][0]["min_temp"]
    return info

def getTomorrowWeather(adcode, name):
    """
    根据编号查天气
    :return:
    """
    info = {}
    # 获取url(adcode)结尾
    info["adcode"] = str(adcode)
    info["name"] = name

    response = requests.get(url=urlWeather.format(adcode), headers=headers)
    content = response.json()
    info["weather"] = content["data"]["data"][1]["forecast_data"][0]["weather_name"]
    info["max_temp"] = content["data"]["data"][1]["forecast_data"][0]["max_temp"]
    info["min_temp"] = content["data"]["data"][1]["forecast_data"][0]["min_temp"]
    return info


if __name__ == '__main__':
    cityName = input("请输入你要查询哪个城市的天气:")
    accode = 0
    cityList = getCity()
    for city in cityList:
        if cityName == city["name"]:
            accode = city["adcode"]
            print("该城市的编号为:{}".format(accode))
            todayinfo = getTodayWeather(accode, cityName)
            print("{}今天的天气为{},最高温度为{},最低温度为{}".format(cityName, todayinfo["weather"], todayinfo["max_temp"], todayinfo["min_temp"]))
            tomorrowinfo = getTomorrowWeather(accode,cityName)
            print("{}明天的天气为{},最高温度为{},最低温度为{}".format(cityName,tomorrowinfo["weather"], tomorrowinfo["max_temp"], tomorrowinfo["min_temp"]))

   
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条小海龟

谢谢你的打赏,微臣会好好努力达

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值