1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 使用requests爬取高德地图国内所有城市的天气情况

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

时间:2019-10-14 02:44:30

相关推荐

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

文章目录

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

项目目标

爬取高德地图上城市与对应所有与天气相关的所有参数

项目分析

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

群名:人生苦短,我学编程

欢迎大家加入我们,一起交流技术!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。