你的將來有我導航----教你如何爬取高德地圖



 簡單一文教你如何爬取高德地圖


目錄

  • 推薦python

  • 1、 分析網頁結構數據庫

  • 2、拿到相關網址json

  • 3、代碼實現後端

    • 3.1 查詢全部城市名稱和編號瀏覽器

    • 3.2 根據編號查詢天氣服務器

  • 4、完整代碼微信

  • 5、保存結果markdown


1、 分析網頁結構

以往幾篇都是介紹的傳統的靜態界面的爬取,此次博主介紹一個爬取動態網頁的超簡單的一個小demo

說到動態網頁,你對它瞭解多少呢?網絡

若是對動態網頁不認識的童鞋,博主在此給出連接,能夠看百度百科的詳細解析動態網頁_百度百科以及小馬伕的靜態頁面和動態頁面的區別app



簡單來講,要獲取靜態網頁的網頁數據只須要給服務器發送該網頁url地址就行,而動態網頁的數據由於是存儲在後端的數據庫裏。因此要獲取動態網頁的網頁數據,咱們須要向服務器發送請求文件的url地址,而不是該網頁的url地址。

🆗,下面開始進入正題。

本篇博文就以高德地圖展開:https://www.amap.com/

在打開後,咱們發現有一堆div標籤,可是並無咱們須要的數據,這個時候就能夠斷定其爲動態網頁,這個時候,咱們就須要找接口


點擊網絡標籤,咱們能夠看到網頁向服務器發送了不少請求,數據不少,找起來太費時間

咱們點擊XHR分類,能夠減小不少沒必要要的文件,省下不少時間。

XHR類型即經過XMLHttpRequest方法發送的請求,它能夠在後臺與服務器交換數據,這意味着能夠在不加載整個網頁的狀況下,對網頁某部分的內容進行更新。也就是說,向數據庫請求而後獲得響應的數據是XHR類型的

而後咱們就能夠在XHR類型下開始一個個找,找到了以下的數據

經過查看Headers得到URL

打開以後,咱們發現其爲近兩天的天氣狀況。

打開後咱們能夠看到上面的狀況,這是個json格式的文件。而後,它的數據信息是以字典的形式來保存的,而數據是都保存在「data」這個鍵值裏面。

🆗,找到了json數據,咱們來對比下看是不是咱們找的東西

經過對比,數據正好對應,那就說明我們已經拿到數據了。

2、拿到相關網址

'''查詢當前地點天氣的url:https://www.amap.com/service/cityList?version=2020101417各城市對應code的url:https://www.amap.com/service/weather?adcode=410700
備註:這兩個url能夠從Network中查看到'''



🆗,相關網址咱們已經拿到了,下面就是具體的代碼實現了。至於怎麼實現,

咱們知道json數據可使用response.json()轉字典,而後操做字典。

3、代碼實現

知道了數據的位置後,咱們開始來寫代碼。

3.1 查詢全部城市名稱和編號

先抓取網頁,經過添加headers來假裝成瀏覽器來對數據庫地址進行訪問,防止被識別後攔截。

url_city = "https://www.amap.com/service/cityList?version=202092419"
headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",}
city = []response = requests.get(url=url_city, headers=headers)content = response.json()print(content)



獲得咱們想要的數據以後,咱們經過查找能夠發現cityByLetter裏的編號和名稱是咱們須要的,那麼咱們就能夠盤它了。

  
  
   
   
            
   
   
  • 1

  • 2

  • 3

  • 4

  • 5

if "data" in content:
cityByLetter = content["data"]["cityByLetter"]
for k,v in cityByLetter.items():
city.extend(v)
return city

3.2 根據編號查詢天氣

獲得了編號和名稱,下面確定就是查詢天氣呀!

先來看接口

經過上圖,能夠肯定最高溫度,最低溫度等內容。那麼就以此來進行數據爬取。

url_weather = "https://www.amap.com/service/weather?adcode={}"
response = requests.get(url=url_weather.format(adcode), headers=headers)content = response.json()item["weather_name"] = content["data"]["data"][0]["forecast_data"][0]["weather_name"]item["min_temp"] = content["data"]["data"][0]["forecast_data"][0]["min_temp"]item["max_temp"] = content["data"]["data"][0]["forecast_data"][0]["max_temp"]print(item)


🆗,咱們的設想已經實現了。

4、完整代碼

# encoding: utf-8''' @software: Pycharm @file: 高德地圖_每一個城市的天氣.py @Version:1.0
'''import requests

url_city = "https://www.amap.com/service/cityList?version=202092419"url_weather = "https://www.amap.com/service/weather?adcode={}"
headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",}

def get_city(): """查詢全部城市名稱和編號""" city = [] response = requests.get(url=url_city, headers=headers) content = response.json()
if "data" in content: cityByLetter = content["data"]["cityByLetter"] for k, v in cityByLetter.items(): city.extend(v) return city

def get_weather(adcode, name): """根據編號查詢天氣""" item = {} item["adcode"] = str(adcode) item["name"] = name
response = requests.get(url=url_weather.format(adcode), headers=headers) content = response.json() item["weather_name"] = content["data"]["data"][0]["forecast_data"][0]["weather_name"] item["min_temp"] = content["data"]["data"][0]["forecast_data"][0]["min_temp"] item["max_temp"] = content["data"]["data"][0]["forecast_data"][0]["max_temp"]
return item

def save(item): """保存""" print(item) with open("./weather.txt","a",encoding="utf-8") as file: file.write(",".join(item.values())) file.write("\n")

if __name__ == '__main__': city_list = get_city() for city in city_list: item = get_weather(city["adcode"],city["name"]) save(item)


5、保存結果


正文結束!!!



歡迎關注公衆號:Python爬蟲數據分析挖掘

記錄學習python的點點滴滴;

回覆【開源源碼】免費獲取更多開源項目源碼;

公衆號每日更新python知識和【免費】工具;

本文已同步到【開源中國】、【騰訊雲社區】、【CSDN】;

文章源:buwenbuhuo.blog.csdn.net/



本文分享自微信公衆號 - Python爬蟲數據分析挖掘(zyzx3344)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索