今天我们来通过爬取高德地图来制作简易的天气预报系统(后面有完整代码,大佬可以逆向观看哦)
下面是结果图:
开干!!!
目标网站:高德地图官网
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"]))