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

文章目录

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

项目目标

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

项目分析

1.打开谷歌游览器,输入网址:高德地图
2.键盘按F12进入开发者调试模式,点击Network,选择XHR也就是js发起的异步加载请求获取的网页数据。这样有利于我们快速找到城市天气接口。

使用requests爬取高德地图国内所有城市的天气情况_第1张图片
3.如上图所示,我们找到了这个叫weather?adcode=610900的文件,这个weather就是天气,那么这个后面这个adcode这个参数我们还不得而知。我们先看看这个文件里面的内容把!
使用requests爬取高德地图国内所有城市的天气情况_第2张图片
4.这不就是我们要找的吗,但是发现这个文件只有一个城市,那么是不是跟adcode有关呢,我们再去翻翻别的文件查看一下。
使用requests爬取高德地图国内所有城市的天气情况_第3张图片
5.找到这个文件发现,这个adocde是一个参数,并且就代表了安康市,那刚才的天气是如何请求到的呢?让我们一探究竟!

使用requests爬取高德地图国内所有城市的天气情况_第4张图片
使用requests爬取高德地图国内所有城市的天气情况_第5张图片
6.如图可知:这个Qurery String Parametes就是需要构造的参数,我们又发现这个url后面跟着adcode参数,那么是不是有个文件是所有城市的adcode呢?
使用requests爬取高德地图国内所有城市的天气情况_第6张图片
7.这里有个叫cityList…的文件,但是怎么里面就这一行没用的代码呢?这是因为获取当前版本号的数据可能没有更新,所以我们试着将版本号向前提,或者删除版本号参数。我们把url粘贴到网址上去。
使用requests爬取高德地图国内所有城市的天气情况_第7张图片
8.这个图中的url版本号已经减了,所以已经看到了所有城市,但是这么杂乱无章怎么查看adcode的数据到底在哪呢,为了方便我是使用json解析器
使用requests爬取高德地图国内所有城市的天气情况_第8张图片
9.可以看到我们解析成功,那么我们来看一下里面的结构:
使用requests爬取高德地图国内所有城市的天气情况_第9张图片
10,这个键为hotCitys对应的值,里面就有我们要找的数据,已经发现找到了,并且是按全国来的,但是我们再继续找一下,将找到的这折叠起来。找了一圈,我们发现是按照不同分类的,按全国的,按省的,按字母排序的等等,但是最后我们发现这个叫cityByLetter里面的adcode的数据是最容易获取
使用requests爬取高德地图国内所有城市的天气情况_第10张图片
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 = 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
群名:人生苦短,我学编程
欢迎大家加入我们,一起交流技术!!!

你可能感兴趣的:(pathon爬虫)