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

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

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
    评论
### 回答1: 这道题可以使用递归的方式来解决。 当 n = 时,返回 1。 当 n 为偶数时,将问题转化为计算 x^(n/2) * x^(n/2)。 当 n 为奇数时,将问题转化为计算 x^(n-1) * x。 具体实现如下: ``` def power(x, n): if n == : return 1 elif n % 2 == : temp = power(x, n/2) return temp * temp else: temp = power(x, (n-1)/2) return temp * temp * x n = int(input("请输入整数 n:")) result = power(2, n) print("2 的", n, "次方为:", result) ``` 当输入 n = 10 时,输出结果为: ``` 请输入整数 n:10 2 的 10 次方为: 1024 ``` ### 回答2: 题目要求编写一个程序,输入一个整数n,然后使用快速计算的方法计算表达式2^1 + 2^2 + 2^3 + ... + 2^n。 快速计算这个表达式,可以使用循环来累加每个2的幂。具体的实现方法如下: 1. 首先,定义一个变量sum来保存累加的结果,并初始化为0。 2. 然后,使用一个循环从1到n,每次循环中对2进行指数运算,将结果累加到sum中。 3. 循环结束后,输出sum的值。 下面是该问题的程序实现: ```python n = int(input("请输入一个整数n:")) # 输入整数n sum = 0 # 初始化累加的结果为0 for i in range(1, n+1): sum += 2 ** i print("计算结果为:", sum) ``` 当我们输入n为3时,程序会输出结果14,这是因为2^1 + 2^2 + 2^3 = 2 + 4 + 8 = 14。 该程序使用循环从1到n,每次循环中计算2的幂,然后将结果累加到sum中。最后输出sum的值作为计算结果。该方法的时间复杂度为O(n),我们称之为快速计算是因为使用了指数运算符,进而减少了运算次数。 ### 回答3: 要计算n的阶乘的结果,可以使用递归的方法来编写程序。 例如,当输入n为5时,我们需要计算5! = 5 × 4 × 3 × 2 × 1的结果。 下面是一个使用递归程序来计算阶乘的示例: ```python def factorial(n): if n == 0: # 当n为0时,返回1 return 1 else: return n * factorial(n-1) # 在程序中获取用户输入的整数n n = int(input("请输入一个整数:")) # 调用factorial函数计算n的阶乘,并将结果存储在变量result中 result = factorial(n) # 打印计算结果 print(f"{n}的阶乘为:{result}") ``` 以上程序会通过递归的方式计算n的阶乘,并打印出计算结果。 例如,当用户输入整数5时,程序会计算5的阶乘并输出结果120。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一条小海龟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值