使用requests爬取高德地图国内所有城市的天气情况
文章目录
- 项目目标
- 项目分析
- 基础较好可直接看代码
项目目标 爬取高德地图上城市与对应所有与天气相关的所有参数
项目分析 1.打开谷歌游览器,输入网址:高德地图
2.键盘按F12进入开发者调试模式,点击Network,选择XHR也就是js发起的异步加载请求获取的网页数据。这样有利于我们快速找到城市天气接口。
文章图片
3.如上图所示,我们找到了这个叫weather?adcode=610900的文件,这个weather就是天气,那么这个后面这个adcode这个参数我们还不得而知。我们先看看这个文件里面的内容把!
文章图片
4.这不就是我们要找的吗,但是发现这个文件只有一个城市,那么是不是跟adcode有关呢,我们再去翻翻别的文件查看一下。
文章图片
5.找到这个文件发现,这个adocde是一个参数,并且就代表了安康市,那刚才的天气是如何请求到的呢?让我们一探究竟!
【使用requests爬取高德地图国内所有城市的天气情况】
文章图片
文章图片
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 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
群名:人生苦短,我学编程
欢迎大家加入我们,一起交流技术!!!
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小