Python3爬蟲、數據清洗與可視化實戰之用API爬取天氣預報數據

註冊免費API和閱讀技術文檔

示例接口爲和風天氣的天氣預報,該網站爲個人開發者提供免費的預報數據(有訪問次數限制)。
註冊地址:http://console.heweather.com
註冊後在控制檯可以看到個人認證的key(密鑰),這個key是訪問API的鑰匙。
文檔地址:https://dev.heweather.com/docs/api/weather
免費版接口地址:https://free-api.heweather.net/s6/weather/{weather-type}?{parameters}
可以看出這裏有兩個參數:
(1):{weather-type}代表不同的天氣數據類型,必選,請使用以下值替代:

weather-type值 描述 授權
now 實況天氣 商業/免費
forecast 3-10天預報 商業/免費
hourly 逐小時預報 商業/免費
lifestyle 生活指數 商業/免費

(2):{parameters}代表請求參數,包括必選和可選參數。所有請求參數均使用 &進行分隔,參數值存在中文或特殊字符的情況,需要對參數進行 url encode。
請求參數:

參數 描述 選擇 示例值
location 需要查詢的城市或地區,可以輸入以下值:1.城市ID。2.經緯度格式:經度,緯度(經度在前緯度災後,英文,分隔,十進制格式,卑微東經爲正,南緯西經爲負)3.城市名稱,支持中英文和漢語拼音4.城市名稱,上級城市或省或國家,英文,分隔,此方式可以字啊重名的情況下只獲取想要的地區的天氣數據,例如 西安,陝西 5.IP 6.根據請求自動判斷,根據用戶的請求獲取IP,通過IP定位並獲取城市數據 必選 1.location=CN101010100 2.LOCATION=116.40,39.9 3.location=北京、location=北京市、location=beijing 4.location=朝陽,北京、location=chaoyang,beijing 5.location=60.194.130.1 6.location=auto_ip
lang 多語言,可以不使用該參數,默認爲簡體中文,海外城市默認爲英文 可選 lang=en
unit 單位選擇,公制(m)或英制(i),默認爲公制單位 可選 unit=i
key 用戶認證key,支持數字簽名方式進行認證 必選 key=xxxxxxxxxxxxxxxx

根據API,組合接口地址:
實況天氣:
https://free-api.heweather.net/s6/weather/now?location=chongqing&key=daea278878a9498298ce1d125a81562e
3-10天天氣預報:
https://free-api.heweather.net/s6/weather/forecast?location=chongqing&key=daea278878a9498298ce1d125a81562e
只要編寫代碼訪問接口地址,就可以返回數據。服務器返回的數據是JSON格式的數據,也就是Python中的字典。

通過預讀城市代碼內容,可以知道API提供了3240個城市的天氣預報。
城市代碼可以拷貝到本地文件,也可以通過requests.get()直接從網上獲取。https://a.hecdn.net/download/dev/china-city-list.csv

獲取API數據

從網上讀取數據的第一步是獲取城市列表,然後根據城市列表循環,代碼如下:

import requests


url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    print(item[0:11])

完成了城市編碼提取後,下一步就是調用接口獲取數據,代碼如下:

import requests
import time


url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    url = 'https://free-api.heweather.net/s6/weather/forecast?location=' + item[0:11] + '&key=daea278878a9498298ce1d125a81562e'
    strhtml = requests.get(url)
    time.sleep(1)
    print(strhtml.text)

數據以JSON格式返回,每一個城市/地區都是一個JSON
如果要將返回的JSON數據解析出來,可以使用for循環語句。

import requests
import time


url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    url = 'https://free-api.heweather.net/s6/weather/forecast?location=' + item[0:11] + '&key=daea278878a9498298ce1d125a81562e'
    strhtml = requests.get(url)
    time.sleep(1)
    dic = strhtml.json()
for item in dic["HeWeather6"][0]["daily_forecast"]:
    print(item["tmp"]["max"])

使用JSON在線結構化工具觀察數據結構,網址如下:
http://www.json.org.cn/tools/JSONEditorOnline/index.htm

通過觀察路徑,3天的預報數據是在[HeWeather6][0][daily_forecast]
下面,由[0]、[1]和[2]這3個數據節點分別存放3天的數據,而每天的最高溫度是在[HeWeather6][0][daily_forecast][n][tmp][max]路徑下,其中[n]表示分節點[0]、[1]、[2]。
requests庫返回的數據可以編碼成JSON格式的數據,只有JSON對象纔可以使用上面分析的路徑,表現方式如下:
strhtml.json()

存儲數據到MongoDB

mongoDB是一個基於分佈式文件存儲的數據庫,由C++編寫,皆在爲web應用提供可擴展的高性能數據存儲解決方案。
mongoDB是一個介於關係數據庫和非關係數據庫之間的產品,它在非關係數據庫中功能最豐富、最像關係數據庫。

下載並安裝MongoDB

  1. 下載MongoDB
    官網下載:https://www.mongodb.com/download-center#community

下載安裝包之後直接打開運行
在這裏插入圖片描述

一直執行Next下一步,當進入這個界面的時候,下面的√一定要去掉,不然會安裝的特別的慢,如果不去掉,可能要等幾個小時以上
在這裏插入圖片描述

環境變量配置:將MongoDB的bin目錄加入環境變量中。
2. 配置本地MongoDB
創建數據庫文件的存放位置
在你data的目錄下,創建一個db文件 如:G:\mongodb\data\db
因爲啓動mongodb服務之前需要必須創建數據庫文件的存放文件夾,否則命令不會自動創建,而且不能啓動成功
啓動MongoDB服務
打開cmd命令行,進入安裝目錄的bin目錄中,輸入如下命令啓動MongoDB,mongod --dbpath g:\mongodb\data\db
在瀏覽器輸入http://localhost:27017,如果在瀏覽器中出現下面一段英文說明成功了
在這裏插入圖片描述

輸入: mongod -dbpath “g:\mongodb\data\db” -logpath “g:\mongodb\data\log\mongo.log” -install -serviceName “MongoDB”

在PyCharm中安裝Mongo Plugin

在PyCharm中的菜單,依次選擇“File”→“settings”→“plugins”選擇marketplace,在搜索框中輸入mongo,然後選擇Monogo Plugin,選擇安裝,安裝好後重啓P有Charm,就可以在右側看到Mongo Explorer.
在這裏插入圖片描述
在Mongo Servers設置窗口中單擊左側加號按鈕(addServer)
在這裏插入圖片描述
輸入連接名,然後單擊“Test Connection”(測試連接)按鈕,提示信息爲“Connection test successful”時表示連接正常,然後單擊OK按鈕,保存設置即可。

將數據存入MongoDB

爲python安裝mongo庫支持pymongo
pip install pymongo

import requests
# 加載pymongo庫
import pymongo
import time

# 建立連接
client = pymongo.MongoClient('localhost', 27017)
# 在MongoDB中新建名爲weather的數據庫
book_weather = client['weather']
# 在weater庫中新建名爲sheet_weather_3的表
sheet_weather = book_weather['sheet_weather_3']
url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    url = 'https://free-api.heweather.net/s6/weather/forecast?location=' + item[
        0:11] + '&key=daea278878a9498298ce1d125a81562e'
    strhtml = requests.get(url)
    time.sleep(1)
    dic = strhtml.json()
    # 向表寫入一條數據
    sheet_weather.insert_one(dic)
# for item in dic["HeWeather6"][0]["daily_forecast"]:
#    print(item["tmp"]["max"])

MongoDB數據庫查詢

基於3.3節的結果,查詢重慶的天氣數據,代碼如下:

import pymongo


client = pymongo.MongoClient('localhost', 27017)
book_weather = client['weather']
sheet_weather = book_weather['sheet_weather_3']
# 查找鍵HeWeather6.basic.city值爲重慶的數據
for item in sheet_weather.find({'HeWeather6.basic.location': '重慶'}):
    print(item)

接下來查詢天氣最低氣溫大於5攝氏度的城市名,代碼如下:

import pymongo

client = pymongo.MongoClient('localhost', 27017)
book_weather = client['weather']
sheet_weather = book_weather['sheet_weather_3']
for item in sheet_weather.find():
    # 因爲數據需要3天的天氣預報,因此循環3次
    for i in range(3):
        tmp = item['HeWeather6'][0]['daily_forecast'][i]['tmp_min']
        # 使用update方法,將表中最低氣溫數據修改爲數值型
        sheet_weather.update_one({'_id': item['_id']}, {
            '$set': {
                'HeWeather6.0.daily_forecast.{}.tmp_min'.format(i): int(tmp)
            }
        })
# 提取出最低氣溫低於5攝氏度的城市
for item in sheet_weather.find(
    {'HeWeather6.daily_forecast.tmp_min': {
        '$gt': 5
    }}):
    print(item['HeWeather6'][0]['basic']['location'])

這裏第一個參數是{'_id': item['_id']},表示要更新的查詢條件,對應_id字段。
第二個參數表示要更新的信息,$set是MongoDB中的一個修改器,用於指定一個鍵並更新鍵值,若鍵不存在則創建一個鍵。
除此之外,常用修改器還有incinc、unset、$push等。

  • 修改器$i 可以對文檔的某個值爲數字型(只能爲滿足要求的數字)的鍵進行增減操作。
  • 修改器$unset 用於刪除鍵。
  • 修改器$push 向文檔的某個數組類型的鍵添加一個數組元素,不過濾重複的數據。添加時,若鍵存在,要求鍵值類型必須是數組;若鍵不存在,則創建數組類型的鍵。

代碼中ltlt、lte、gtgt和gte,分別表示符號<、<=、>和>=

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