APIを活用したSaaSからのデータ抽出方法
みなさんの会社ではSaaSを利用していますでしょうか? 有名なところならばSalesforceやSanSanなどがありますね。
SaaSは手軽にサービスを活用できて、企業の業務に切っても切れない存在となっています。しかし自社で管理しているデータベースのように簡単にデータ抽出ができないというネックも存在します。
今回の記事ではAPIを活用したデータ抽出について解説をします。
この3年でSaaSからのデータ抽出を10件以上経験した、私のベストプラクティスです
基幹システム以外からのデータ抽出のニーズ
SaaS以前は自社ネットワークからのデータ抽出だった
クラウドサービスが出回る以前は、各社それぞれでサーバーを管理していました。自社内にサーバールームを設置するか、データセンターに置くか、物理的な場所はそれぞれでしたが、自社のセキュリティ下にデータベースがあり、それぞれの基幹システムからデータ抽出をしていました。
SaaSの誕生によりデータ抽出はハイブリッドになった
しかしSaaSが誕生し、企業のデータはパブリッククラウドの中に格納されるようになりました。
SaaS内にあるデータをデータウェアハウスに格納して、他のシステムからのデータと分析したいのですが、以前の自社ネットワークからのデータ抽出方式だと困難で、他のデータ抽出方法が必要となりました。
またこれらは自社データなのでいわゆるファーストパーティデータに分類されますが、データ分析の世界ではセカンド・サードパーティデータをあわせた分析を推奨しています。
これらのニーズから、自社ネットワーク以外からのデータ抽出方法の必要性に注目が集まっています。
SaaSからどのようにしてデータを抽出するのか
SaaSは一般的にはこちらからデータベースを直接参照することはできません。テナントごとに様々な顧客のデータがあるのでセキュリティの観点からデータベースへの接続が禁止されています。
ではどのようにデータを取得するのか、代表的なものを3つ紹介します。
データエクスポート機能をつかう(手動)
最もシンプルな手段です。SaaSの中で[エクスポート]機能をつかい、CSVなどの外部ファイルにしてデータウェアハウスに取り込みます。手動で実施することもありますし、RPAで自動化するパターンもあります。
お手軽に実施できます(RPA組むのはちょっと大変)ですが、データハンドリングが難しいです。例えば3日前のデータの取り込み直しをする場合など、設定をいろいろ変更する必要がありますね。
ETLツールを使用する
ETLツールは専用のドライバーを持っています。たとえばSalesforceやKintoneのように有名なSaaSであれば、ETLツール側で専用のドライバーを作っているので、そちらから接続することができます。技術的な難易度は大幅に下がりますので、ドライバーがあればぜひ活用しましょう。
ETLツールの詳細についてはこちらを参照してください。
データコネクタツールを使用する
世の中にはデータ接続用のさまざまなドライバーを保持しているツールがありますので、CDataからデータ取得するのも良いでしょう。
APIを使用する
今回の記事の本命はこちらです。世の中にあるSaaSはとても数が多く、ドライバー開発が追いつきません。また海外産であったり、ニッチなSaaSになるとなかなか専用ドライバーがありません。
その場合はAPIを通してデータを抽出しましょう。
APIについての詳細はこちらの記事で紹介されています。
APIが開放されているSaaSにはプログラムからデータの登録やデータの抽出ができたりします。APIはSaaSメーカー側で設定している機能のみが使用できますので、下記のようなデータを取得したいSaaSのAPIリファレンスをよく読む必要があります。
それでは以降から、具体的なAPIからのデータの抽出の仕方を解説します。
APIからデータを抽出する
素直なAPI? 意地悪なAPI?
先ほど述べた通り、APIはSaaSメーカー側が仕組みを用意します。そしてこのAPIについて正式な規格がございません。(きっと今はない)
そのため、メーカーによってデータの取得内容がバラバラです。
わかりやすいところだと、CSVファイルなのかJSONファイルなのか、選択できるのか、です。JSONだとデータベースへの取り込みに工夫が必要になります。
また、SaaSメーカー側の立場となると、自分のところの貴重なデータを無闇に抽出させて外部環境で使われることに良い気持ちを感じないでしょう。そのためAPIの開放はオプションで有料化しているところもあります。
その中でもデータが一括抽出できないなどの制限があります。
とあるeラーニングを提供してるSaaSは学習コースごとのユーザーの進捗状況を抽出できるのですが、全コースは一回で取れず、各コースを選択しなければ抽出できない仕様でした。
そのため、プログラムで全コース一覧を取得し、繰り返し条件でコースをひとつずつ選んでユーザーの進捗を取得するようにせねばなりませんでした。
このようにデータ抽出をする目線で素直なAPIか意地悪なAPIかを判定してみましょう。
APIからデータを抽出する
素直なAPIならばETLやBIツールが使える
データ抽出しやすいAPIであればツールをつかって取得ができます。下記は一例ですが、SaaS(BIツール)のAPIをETLツールで呼び出しています。
一回のコールで取りたいデータが全部CSVで取得できるのであれば、ETLツールのようにGUIで取得できるでしょう。
意地悪なAPIならばPythonが相性がいい
私は約10種類はAPI経由でデータを抽出しています。その経験から見て、8割は素直なAPIではありません。そのためPythonでデータを抽出しています。
具体的にOura Ringの取得方法の記事がありますので、興味ありましたらご覧ください。
APIからデータを抽出する場合、Pythonは必要不可欠と言えるでしょう。私は下記で紹介しているデイトラ Pythonコースで学習をして、Pythonを使えるようになりました。
ChatGPTに任せられる部分もある
ChatGPTが使える現代ではコードのすべてを記述する必要はありません。だいたいのやり方はChatGPTでつくれますので、そのコードを理解して操れれば開発工数を大幅に削減できます。
- 実際にChatGPTに依頼してみたらこんな感じ
-
Oura RingのAPIを使用してPythonでデータを抽出し、それをCSV形式で保存するプログラムの基本的な例を以下に示します。なお、Oura APIを利用するには、事前にAPIの認証トークンを取得しておく必要があります。
import requests import csv from datetime import datetime # APIエンドポイント oura_api_url = "https://api.ouraring.com/v1/userinfo" # ここにあなたのアクセストークンを入れてください access_token = "your_access_token" # APIリクエストヘッダー headers = { "Authorization": f"Bearer {access_token}" } # APIリクエストを送信 response = requests.get(oura_api_url, headers=headers) # APIからのレスポンスを確認 if response.status_code == 200: data = response.json() # データをCSVに保存 csv_filename = f"oura_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" with open(csv_filename, mode='w', newline='') as file: writer = csv.writer(file) # CSVのヘッダーを記述 writer.writerow(data.keys()) # CSVにデータを書き込み writer.writerow(data.values()) print(f"Data successfully saved to {csv_filename}") else: print(f"Failed to retrieve data: {response.status_code}")
プログラムの説明
- APIエンドポイントとアクセストークン:
oura_api_url
はOura APIのエンドポイントで、access_token
にはOura APIから取得したアクセストークンを入力します。 - APIリクエストの送信:
requests.get()
メソッドを使って、Oura APIにリクエストを送信します。アクセストークンはヘッダーに追加して認証を行います。 - レスポンスの確認: レスポンスが成功(ステータスコード200)した場合、
json()
メソッドを使ってデータを取得します。 - CSVファイルへの保存:
csv.writer
を使って、データをCSVファイルに書き込みます。ファイル名には現在の日時が含まれ、保存先ファイル名が一意になるようにします。 - エラーハンドリング: レスポンスが失敗した場合、エラーメッセージを表示します。
注意点
- Oura APIから取得できるデータには、
userinfo
以外にも、睡眠データや活動データなどがあります。APIエンドポイントを変更することで、異なるデータを取得できます。 - プログラムを実行するには、事前にOura Ring APIからアクセストークンを取得しておく必要があります。
- 詳細なAPIの使用方法やデータ形式については、Oura APIのドキュメントを参照してください。
- APIエンドポイントとアクセストークン:
Pythonでデータを抽出する手順
実際にAPIからデータを抽出する手順を紹介します
手順は大きく4ステップになります。
ドキュメントを用意する
まずは情報収集です。データを抽出したいSaaSのAPIのドキュメントを探しましょう。ここに取得手順が記載されています。
ドキュメントは英語が多いです。頑張って読み込むか、翻訳をしましょう。
最近では公式がPythonのライブラリを用意してくれている場合もあります。それ以外はHTTPリクエストで取得することが多いです。
Talend API Testerを使ってAPIに接続する
いきなり重要ポイントです。HTTPリクエストの難しいところはHTTPに指定のパラメータを入れてもすぐに動かない、なんらかの間違いがありエラーになります。この検証をプログラムの中で実装すると、プログラムが悪いのか接続の仕方が悪いのかわからなくなります。
そのため、まずはこのように設定すれば必ずつながるよねと理解する必要があります。
ETLツールのTalendさんは無料でAPI Testerを開放しています。こちらを使用するとサクッと検証ができて大変オトクです。
まずはTalend API Testerをつかって、APIとの接続の検証をしましょう。
Pythonを書く
APIによって難易度が変わるのがこの部分です。またここでデータ分析しやすい形にデータを加工することが重要です。もちろんデータベースに入れてから加工をしてもいいのですが、PythonのPandas DataFrameの加工技術は優秀なのでここで任せてしまっても良いです。
またPandasライブラリにはJSON→CSVの変換も用意しているので、やりたいことのほとんどができてしまいます。すごいぞPython。
各種APIのPythonの書き方については、いずれ別記事で紹介させていただきます。
データ連携スクリプトに乗せる
もちろんPythonで抽出したデータを直接データベースに入れても構いません。私の場合は取得するデータの数が多いので、ETLツールで一本のデータ取り込みスクリプトを作成しているので、そこに完成したプログラムを乗せます。
ETLのスクリプトについては下記の記事を参考にしてください。
少し遠回りな手法になりますが、基幹システムのデータ抽出も併せて、「すべてのデータ抽出はETLツールから取得する」という思想を持っておくと、引き継ぎ時の管理コストを下げることができます。
データ連携の仕組みは「誰かに引き継ぐ前提」を強くもっておかないと24時間365日あなたが見守ることになりますので、そこは避けていきましょう。
さいごに
現代では自社ネットワーク内のデータベース以外にもSaaSのデータを抽出する必要性が出てきました。ファーストパーティデータが変わりつつあること、そしてセカンド・サードのデータもとれるようになっている今はデータ抽出の方式について議論・検証をしておく必要があります。
今回のデータ抽出方法が完全に正解とは限りませんが、効率的な方法であると思います。日々技術や知識をアップデートして、あらゆるデータを溜められる環境を構築できるようにしましょう。