こんにちは、blueです。
前回は取得したJSON形式のデータに対するJSONパースの方法について説明しました。
前回の記事はこちら
今回はまとめとしてOpenWeatherMapのWeb APIを使った天気情報取得の全コードを紹介します。
コードは長いですが、これまでの内容も振り返っていますので一通り読んでいただいて理解していただければと思います。
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。
実コード
コードは以下になります。
Public Sub 現在天気取得_緯度経度()
Call CurrentWeatherData
End Sub
Private Sub CurrentWeatherData()
Const key As String = "API key" 'OpenWeatherMapから取得したものを入れること
Const lat As String = "35.6809704" '東京駅の緯度 GoogleMapから取得
Const lon As String = "139.7678007" '東京駅の経度 GoogleMapから取得
Dim http As MSXML2.XMLHTTP60
Set http = New MSXML2.XMLHTTP60
With http
Call .Open("GET", "https://api.openweathermap.org/data/2.5/weather?lat=" & lat & "&lon=" & lon & "&units=metric&lang=ja&APPID=" & key)
Call .send
Do
If .readyState = 4 Then
Exit Do
End If
DoEvents
Loop
'JSONを一行で出力
Debug.Print .responseText
'JSONパース
Dim jsonObj As Object
Set jsonObj = JsonConverter.ParseJson(.responseText)
'JSON整形
Debug.Print JsonConverter.ConvertToJson(jsonObj, " ")
'JSON出力
Debug.Print "都市=" & jsonObj("name")
Debug.Print "天気=" & jsonObj("weather")(1)("main")
Debug.Print "天気詳細=" & jsonObj("weather")(1)("description")
Debug.Print "平均気温=" & jsonObj("main")("temp")
Debug.Print "最低気温=" & jsonObj("main")("temp_min")
Debug.Print "最高気温=" & jsonObj("main")("temp_max")
Debug.Print "風速=" & jsonObj("wind")("speed")
End With
End Sub
各コードの説明
コードのサブルーチン化
Public Sub 現在天気取得_緯度経度()
Call CurrentWeatherData
End Sub
今回のコードは汎用性を考慮してCurrentWeatherDataとしてサブルーチン化しています。
不要な方は以降のPrivate~のコードのみでもOKです。
Const key As String = "API key" 'OpenWeatherMapから取得したものを入れること
Const lat As String = "35.6809704" '東京駅の緯度 GoogleMapから取得
Const lon As String = "139.7678007" '東京駅の経度 GoogleMapから取得
まず今回の定数をセットします。
keyはOpenWeatherMapのアカウントから取得したもの、緯度(lat),経度(lon)はGoogleMapから取得したものを入れるようにします。
詳しい記事はこちら。
HTTPリクエストとレスポンス
Dim http As MSXML2.XMLHTTP60
Set http = New MSXML2.XMLHTTP60
With http
Call .Open("GET", "https://api.openweathermap.org/data/2.5/weather?lat=" & lat & "&lon=" & lon & "&units=metric&lang=ja&APPID=" & key)
Call .send
Do
If .readyState = 4 Then
Exit Do
End If
DoEvents
Loop
'JSONを一行で出力
Debug.Print .responseText
HTTPリクエストして得られたデータをイミディエイトウィンドウに出力しています。
HTTPリクエストする際のURLはOpenWeatherMapのAPIを指定しています。
詳しい記事はこちら
VBAでのHTTPリクエストはIXMLHTTPRequestオブジェクトを生成することから始めます。
手順としては
- Microsoft XML, v6.0の参照設定
- IXMLHTTPRequestオブジェクトの生成
- Open,Sendメソッドを使いリクエストを行う
- responseTextプロパティでレスポンスを受け取る
になります。
詳しい記事はこちら
得られたデータはJSON形式の1行テキストになっています。
{}や[]が多くて難しそうに思えますが、Excelの表で考えればすぐに理解できると思います。
詳しい記事はこちら
JSONパースとJSON出力
'JSONパース
Dim jsonObj As Object
Set jsonObj = JsonConverter.ParseJson(.responseText)
'JSON整形
Debug.Print JsonConverter.ConvertToJson(jsonObj, " ")
'JSON出力
Debug.Print "都市=" & jsonObj("name")
Debug.Print "天気=" & jsonObj("weather")(1)("main")
Debug.Print "天気詳細=" & jsonObj("weather")(1)("description")
Debug.Print "平均気温=" & jsonObj("main")("temp")
Debug.Print "最低気温=" & jsonObj("main")("temp_min")
Debug.Print "最高気温=" & jsonObj("main")("temp_max")
Debug.Print "風速=" & jsonObj("wind")("speed")
responseTextプロパティで受け取ったJSONデータをJSONパースし、イミディエイトウィンドウに出力しています。
出力データはJSON整形したものと特定のデータ両方になります。
JSONパースに関する記事はこちら
出力結果
今回はイミディエイトウィンドウに出力しましたが、ここには199行までしか出力できません。JSONパースすると多くのデータが改行されますのでそれ以上を出力する場合はエクセルに出力するなど考慮ください。
{"coord":{"lon":139.6917,"lat":35.6895},"weather":[{"id":802,"main":"Clouds","description":"雲","icon":"03n"}],"base":"stations","main":{"temp":20.82,"feels_like":21.07,"temp_min":18.7,"temp_max":23.08,"pressure":1012,"humidity":81},"visibility":10000,"wind":{"speed":3.6,"deg":180},"clouds":{"all":40},"dt":1649854241,"sys":{"type":2,"id":2038398,"country":"JP","sunrise":1649794302,"sunset":1649841098},"timezone":32400,"id":1850144,"name":"東京都","cod":200}
{
"coord": {
"lon": 139.6917,
"lat": 35.6895
},
"weather": [
{
"id": 802,
"main": "Clouds",
"description": "\u96F2",
"icon": "03n"
}
],
"base": "stations",
"main": {
"temp": 20.82,
"feels_like": 21.07,
"temp_min": 18.7,
"temp_max": 23.08,
"pressure": 1012,
"humidity": 81
},
"visibility": 10000,
"wind": {
"speed": 3.6,
"deg": 180
},
"clouds": {
"all": 40
},
"dt": 1649854241,
"sys": {
"type": 2,
"id": 2038398,
"country": "JP",
"sunrise": 1649794302,
"sunset": 1649841098
},
"timezone": 32400,
"id": 1850144,
"name": "\u6771\u4EAC\u90FD",
"cod": 200
}
都市=東京都
天気=Clouds
天気詳細=雲
平均気温=20.82
最低気温=18.7
最高気温=23.08
風速=3.6
まとめ
今回までの記事でOpenWeatherMapのWeb APIを使ったVBAでのHTTPリクエストについて説明しました。
Web APIはAPI keyの取得に始まりHTTPリクエストやJSONパースなど難しいものが多かったと思います。
ただこれらの記事を通して少しでも内容を理解していただければ嬉しく思います。
また別でWeb APIの記事も上げますのでまたみていってください。
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。
Selenium-VBAでのWebスクレイピングに関する記事はこちらをどうぞ
【ExcelVBA‐Selenium】【永久保存版】スクレイピングに必要なSeleniumのインストール方法教えます
【Selenium-VBA】Yahooメールへのログイン方法をわかりやすく説明する
ChromeでのWebスレイピングをできる限りわかりやすく説明する(Excel VBA)
【ExcelVBA‐Selenium】Chrome driverのバージョンエラーが出た時の対処法(2021/10/7更新)
【Selenium-VBA】Seleniumを用いたスクレイピングでテーブル情報を取得する1
【Selenium-VBA】スクレイピングをするのに必要なHTMLについて説明します1
【Selenim-VBA】起動済みのChromeを用いてSeleniumによるスクレイピングを行う
【Selenium-VBA】JavaScriptを使ってスクレイピングをしてみる1
【VBA】SeleniumBasicにおけるクラス、メソッド、プロパティ一覧(日本語版)
Web-APIを用いたデータ取得に関する記事はこちらをどうぞ
【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1
コメント