RでAPIデータを取得する

単一の関数でAPIからデータをインポートできる優れたRパッケージがたくさんあります。ただし、APIにすでに作成された関数がない場合があります。良いニュースは、独自のコーディングが簡単なことです。

これをAccuWeatherAPIで示しますが、プロセスとコードは、認証にキーを使用する他のほとんどのAPIで機能します。

APIアクセスにサインアップ

フォローしたい場合は、developer.accuweather.comにアクセスして、無料のアカウントにサインアップしてください。[パッケージと価格]で、[限定トライアル]を選択します。これにより、1日あたり50回のAPI呼び出しが可能になります。ローカルの天気予報を1日に数回確認するだけで十分ですが、一般向けのアプリケーションでは明らかに必要ありません。

アプリを作成するオプションがすぐに表示されない場合は、[マイアプリ]に移動して新しいアプリを作成してください。

シャロン・マクリス、

APIを使用する場所にはその他、作成するものには内部アプリ、プログラミング言語にはその他を選択しました(残念ながら、Rはオプションではありません)。アプリにはAPIキーを割り当てる必要があります。

そのAPIキーをAccuWeather予測スクリプトにハードコーディングしたくない場合は、R環境変数として保存します。これを行う最も簡単な方法は、usethisパッケージを使用することです。 usethis::edit_r_environ() R環境ファイルを編集用に開きます。ACCUWEATHER_KEY = 'my_key_string'そのファイルになどの行を追加 し、ファイルを保存して、Rセッションを再開します。Sys.getenv("ACCUWEATHER_KEY")値自体をハードコーディングする代わりに、を使用してキー値にアクセスできるようになりました 。

APIのURL構造を決定します

このプロジェクトでは、最初にhttr、jsonlite、およびdplyrパッケージをロードします。APIからデータを取得するためのhttr、データを解析するためのjsonlite、および最終的にパイプを使用するためのdplyrです(magrittrパッケージも使用できます)。

次に—そしてこれは重要です— APIから必要なデータを要求するために、URLを構造化する方法を知る必要があります。APIがどの程度文書化されているかによっては、クエリ構造を理解することがプロセスの最も難しい部分になる可能性があります。幸い、AccuWeatherAPIのドキュメントは非常に優れています。

すべてのAPIクエリには、リソースURL、またはURLのルートと私が考えるもの、そしてクエリの特定の部分が必要です。AccuWeatherが1日予報APIのドキュメントで述べていることは次のとおりです。 

 //dataservice.accuweather.com / forecasts / v1 / daily / 1day / {locationKey} 

予測のベースURLはほぼ一定ですが、これにはロケーションコードが必要です。1つの場所の予測を探しているだけの場合は、AccuWeather Webサイトをだまして使用し、accuweather.comで予測を検索してから、返されるURLを確認できます。郵便番号01701(マサチューセッツ州フレーミングハムにある私たちのオフィス)を検索すると、次のURLが予測とともに返されます。 

//www.accuweather.com/en/us/framingham/01701/weather-forecast/571_pc

参照/571_pc終わり?それがロケーションキーです。また、AccuWeather Locations APIを使用して、プログラムでロケーションコードを取得することもできます。これについては後で説明します。または、CitySearchやPostalCodeSearchなどのAccuWeatherのWebベースのLocationsAPIツールの1つです。 

リクエストURLを作成する

特定のデータリクエストのクエリパラメータは、ベースURLの末尾に追加されます。最初のパラメーターは疑問符で始まり、その後に名前と値が続きます。追加のキーと値のペアは、アンパサンドとそれに続く名前が値に等しいもので追加されます。したがって、APIキーを追加するには、URLは次のようになります。

//dataservice.accuweather.com/forecasts/v1/daily/1day/571_pc?apikey=MY_KEY

2番目のクエリパラメータを追加する場合(たとえば、デフォルトの詳細をfalseからtrueに変更する場合)、次のようになります。

//dataservice.accuweather.com/forecasts/v1/daily/1day/571_pc?apikey=MY_KEY&details=true

データを取得する

このhttr::GET()関数を使用してGET、次のようなそのURLのHTTPリクエストを作成できます。

my_url <-paste0( "// dataservice.accuweather.com/forecasts/"、

"v1 / daily / 1day / 571_pc?apikey ="、

Sys.getenv( "ACCUWEATHER_KEY"))

my_raw_result <-httr :: GET(my_url)

paste0()URLを作成するこのコマンドは、読みやすくするためにURLルートを2行に分割し、ACCUWEATHER_KEYR環境変数に格納されているAPIキーを追加しました。 

my_raw_resultやや複雑なリストです。実際に必要なデータはほとんどがコンテンツですが、その構造を見ると、バイナリデータのように見える「生の」形式であることがわかります。

シャロン・マクリス、

幸い、httrパッケージを使用すると、content()関数を使用してrawから使用可能な形式に簡単に変換できます。 

結果を解析する

content()3つの変換オプションがあります。生として(この場合は間違いなく役に立ちません)。解析済み。通常、ある種のリストを返すようです。とテキスト。JSON(特にネストされたJSON)の場合、テキストが最も扱いやすいと思います。コードは次のとおりです。

my_content <-httr :: content(my_raw_result、as = 'text')

これがjsonliteパッケージのfromJSON()出番です。この関数はJSONテキスト文字列をcontent()より使いやすいRオブジェクトに変換します。

構造を確認するためにdplyrのglimpse()関数を実行した結果の一部を次に示しますmy_content

シャロン・マクリス、

2項目のリストです。最初のアイテムには、メタデータと必要なテキストフィールドがあります。2番目の項目は、予測に確実に必要なデータポイントが多数あるデータフレームです。 

glimpse()一部の列は実際には独自のデータフレームであるため、そのデータフレームのみで実行すると、ネストされたJSONであることが示されます。しかしfromJSON()、それはすべてかなりシームレスになりました。

観測値:1変数:8 $日付 "2019-08-29T07:00:00-04:00" $ EpochDate 1567076400 $気温$日$夜$ソース["AccuWeather"]

したがって、APIからデータをプルするための基本的な手順は次のとおりです。

  1. APIのベースURLとクエリパラメータを把握し、リクエストURLを作成します。
  2. httr::GET()URLで実行します。 
  3. 結果をcontent()。で解析します。で試すことができas = 'parsed'ますが、複雑なリストが返される場合は、を試してくださいas = 'text'
  4. 必要に応じて、jsonlite::fromJSON()その解析されたオブジェクトで実行します。

まとめる前に、さらにいくつかのポイントがあります。まず、(my_raw_result から返された最初のオブジェクト)をもう一度GET見ると、ステータスコードが表示されます。200は、すべてがOKであることを意味します。しかし、400年代のコードは、何かがうまくいかなかったことを意味します。関数またはスクリプトを作成している場合は、追加のコードを実行する前に、ステータスコードが200秒にあるかどうかを確認できます。

次に、複数のクエリパラメータがある場合、paste0()コマンドでそれらすべてを文字列化するのは少し面倒になる可能性があります。GET()次のようなクエリ引数の名前付きリストを作成する別のオプションがあります。 

my_raw_result2 <-GET(url、

クエリ=リスト(

apikey = Sys.getenv( "ACCUWEATHER_KEY")、

詳細= 'true'

構造がわかりますか?このGET()関数は、最初の引数としてベースURLを取り、2番目のクエリ引数として名前と値のリストを取ります。それぞれがで、名前引用符で囲まれていません。残りのコードは同じです。name = value

これは、AccuWeather LocationsAPIでも機能します。

APIが探しているものは次のとおりです。

シャロン・マクリス、

予測APIと同様のコードを使用できますが、今回はクエリパラメーターapikeyq、AccuWeatherキー、および検索している場所のテキストをそれぞれ使用します。

base_url <-"// dataservice.accuweather.com/locations/v1/cities/search"

ny_location_raw <-GET(base_url、

query = list(apikey = Sys.getenv( "ACCUWEATHER_KEY")、

q = "ニューヨーク州ニューヨーク"

))

ny_parsed%

fromJSON()

ロケーションコードは[キー]列にあります。

> glimpse(ny_parsed)観測値:1変数:15 $バージョン1 $キー "349727" $タイプ "City" $ランク15 $ LocalizedName "New York" $ EnglishName "New York" $ PrimaryPostalCode "10007" $ Region $ Country $ AdministrativeArea $ TimeZone $ GeoPosition $ IsAlias FALSE $ SupplementalAdminAreas []

これで必要なのは、APIから取得したデータを使用するためのコードだけです。

その他のRのヒントについては、記事とビデオの検索可能な表がある「Do MoreWithR」ページにアクセスしてください。