使用requests爬取高德地图国内所有城市的天气情况


文章目录

  • 项目目标
  • 项目分析
  • 基础较好可直接看代码

项目目标 爬取高德地图上城市与对应所有与天气相关的所有参数
项目分析 1.打开谷歌游览器,输入网址:高德地图
2.键盘按F12进入开发者调试模式,点击Network,选择XHR也就是js发起的异步加载请求获取的网页数据。这样有利于我们快速找到城市天气接口。
使用requests爬取高德地图国内所有城市的天气情况
文章图片

3.如上图所示,我们找到了这个叫weather?adcode=610900的文件,这个weather就是天气,那么这个后面这个adcode这个参数我们还不得而知。我们先看看这个文件里面的内容把!
使用requests爬取高德地图国内所有城市的天气情况
文章图片

4.这不就是我们要找的吗,但是发现这个文件只有一个城市,那么是不是跟adcode有关呢,我们再去翻翻别的文件查看一下。
使用requests爬取高德地图国内所有城市的天气情况
文章图片

5.找到这个文件发现,这个adocde是一个参数,并且就代表了安康市,那刚才的天气是如何请求到的呢?让我们一探究竟!
【使用requests爬取高德地图国内所有城市的天气情况】使用requests爬取高德地图国内所有城市的天气情况
文章图片

使用requests爬取高德地图国内所有城市的天气情况
文章图片

6.如图可知:这个Qurery String Parametes就是需要构造的参数,我们又发现这个url后面跟着adcode参数,那么是不是有个文件是所有城市的adcode呢?
使用requests爬取高德地图国内所有城市的天气情况
文章图片

7.这里有个叫cityList…的文件,但是怎么里面就这一行没用的代码呢?这是因为获取当前版本号的数据可能没有更新,所以我们试着将版本号向前提,或者删除版本号参数。我们把url粘贴到网址上去。
使用requests爬取高德地图国内所有城市的天气情况
文章图片

8.这个图中的url版本号已经减了,所以已经看到了所有城市,但是这么杂乱无章怎么查看adcode的数据到底在哪呢,为了方便我是使用json解析器
使用requests爬取高德地图国内所有城市的天气情况
文章图片

9.可以看到我们解析成功,那么我们来看一下里面的结构:
使用requests爬取高德地图国内所有城市的天气情况
文章图片

10,这个键为hotCitys对应的值,里面就有我们要找的数据,已经发现找到了,并且是按全国来的,但是我们再继续找一下,将找到的这折叠起来。找了一圈,我们发现是按照不同分类的,按全国的,按省的,按字母排序的等等,但是最后我们发现这个叫cityByLetter里面的adcode的数据是最容易获取
使用requests爬取高德地图国内所有城市的天气情况
文章图片

11.那么我们写代码的思路是什么呢?
首先使用requests获取全国城市adcode的源码,并且转为json,方便取出adcode数据,再将城市名字对应adcode的数据进行url的拼接,进行二次requests请求,获取对应城市的天气情况。
基础较好可直接看代码 代码进行示例:
(1)首先看第一种,小白能看懂的。
import requests import json# 定义爬取adcode的url base_url = "https://www.amap.com/service/cityList?version=202021713" # 发起请求 r = requests.get(base_url) # 接受json数据 adcode_data = https://www.it610.com/article/r.json() # 经过分析,获取所有城市名称与adcode adcode__data2 = adcode_data.get("data") # print(adcode__data2) adcode__data3 = adcode__data2.get("cityByLetter") # print(adcode__data3)# 定义一个装多个带有adcode的字典的列表 adcode_list = [] for i, j in adcode__data3.items(): for m in j: adcode_list.append(m) # print(adcode_list) # 进行遍历获取adcode for count, i in enumerate(adcode_list): # 获取每个城市的adcode数据 adcode = i.get("adcode") # 拼接完整的获取天气的url base_url = "https://www.amap.com/service/weather?adcode=" + adcode response = requests.get(base_url) # 将数据转换为json data_json = response.json() weather = data_json.get('data').get('data') if weather == None: continue else: # 输出天气与城市 print("{}{}:{}".format(count, i.get("name"), weather[0].get('live').get("weather_name")))

(2)第二种,代码清新脱俗,需要较强的基础。
import requests,json,re for j, k in requests.get("https://www.amap.com/service/cityList?").json()['data']['cityByLetter'].items(): for m in k: response = requests.get("https://www.amap.com/service/weather?adcode=" + m['adcode']).json().get("data").get( 'data') if response == None: continue else: print(m["name"], re.compile(r'[|{|}|[]|]').sub("", str(response[0])))

由于运行结果太长就不写了。
来一波,推送吧!
群号:781121386
群名:人生苦短,我学编程
欢迎大家加入我们,一起交流技术!!!

    推荐阅读