文章目录
项目目标项目分析基础较好可直接看代码项目目标
爬取高德地图上城市与对应所有与天气相关的所有参数
项目分析
1.打开谷歌游览器,输入网址:高德地图 2.键盘按F12进入开发者调试模式,点击Network,选择XHR也就是js发起的异步加载请求获取的网页数据。这样有利于我们快速找到城市天气接口。
3.如上图所示,我们找到了这个叫weather?adcode=610900的文件,这个weather就是天气,那么这个后面这个adcode这个参数我们还不得而知。我们先看看这个文件里面的内容把!
4.这不就是我们要找的吗,但是发现这个文件只有一个城市,那么是不是跟adcode有关呢,我们再去翻翻别的文件查看一下。
5.找到这个文件发现,这个adocde是一个参数,并且就代表了安康市,那刚才的天气是如何请求到的呢?让我们一探究竟!
6.如图可知:这个Qurery String Parametes就是需要构造的参数,我们又发现这个url后面跟着adcode参数,那么是不是有个文件是所有城市的adcode呢?
7.这里有个叫cityList…的文件,但是怎么里面就这一行没用的代码呢?这是因为获取当前版本号的数据可能没有更新,所以我们试着将版本号向前提,或者删除版本号参数。我们把url粘贴到网址上去。
8.这个图中的url版本号已经减了,所以已经看到了所有城市,但是这么杂乱无章怎么查看adcode的数据到底在哪呢,为了方便我是使用json解析器
9.可以看到我们解析成功,那么我们来看一下里面的结构:
10,这个键为hotCitys对应的值,里面就有我们要找的数据,已经发现找到了,并且是按全国来的,但是我们再继续找一下,将找到的这折叠起来。找了一圈,我们发现是按照不同分类的,按全国的,按省的,按字母排序的等等,但是最后我们发现这个叫cityByLetter里面的adcode的数据是最容易获取
11.那么我们写代码的思路是什么呢?
首先使用requests获取全国城市adcode的源码,并且转为json,方便取出adcode数据,再将城市名字对应adcode的数据进行url的拼接,进行二次requests请求,获取对应城市的天气情况。
基础较好可直接看代码
代码进行示例: (1)首先看第一种,小白能看懂的。
import requestsimport json# 定义爬取adcode的urlbase_url = "/service/cityList?version=21713"# 发起请求r = requests.get(base_url)# 接受json数据adcode_data = r.json()# 经过分析,获取所有城市名称与adcodeadcode__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)# 进行遍历获取adcodefor count, i in enumerate(adcode_list):# 获取每个城市的adcode数据adcode = i.get("adcode")# 拼接完整的获取天气的urlbase_url = "/service/weather?adcode=" + adcoderesponse = requests.get(base_url)# 将数据转换为jsondata_json = response.json()weather = data_json.get('data').get('data')if weather == None:continueelse:# 输出天气与城市print("{}{}:{}".format(count, i.get("name"), weather[0].get('live').get("weather_name")))
(2)第二种,代码清新脱俗,需要较强的基础。
import requests,json,refor j, k in requests.get("/service/cityList?").json()['data']['cityByLetter'].items():for m in k:response = requests.get("/service/weather?adcode=" + m['adcode']).json().get("data").get('data')if response == None:continueelse:print(m["name"], pile(r'[|{|}|[]|]').sub("", str(response[0])))
由于运行结果太长就不写了。 来一波,推送吧! 群号:781121386 群名:人生苦短,我学编程 欢迎大家加入我们,一起交流技术!!!