項目目標
爬取高德地圖上城市與對應所有與天氣相關的所有參數
項目分析
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
羣名:人生苦短,我學編程
歡迎大家加入我們,一起交流技術!!!