使用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 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
羣名:人生苦短,我學編程
歡迎大家加入我們,一起交流技術!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章