
SNS データ可視化
以前のブログでTwitter APIを使ってデータを取得する方法や、Googleデータポータルを使ってダッシュボードを作る方法などを解説しました。
今回は、自社商品や特定のキーワードでどのようにInstagram上で投稿されているのか、いち早く把握・共有するために、 上記のような画像付きダッシュボード を作るところまでを解説していきます。
Instagram APIとは

TwitterだけでなくInstagramにも無料のAPI機能が提供されています。こちらもTwitter APIと同じく下記のような問題を感じました。
- 運営元のFacebookのオフィシャル解説が分かりづらい
- 日本語で解説されたサイトはアカウント取得方法がほとんどでTwitterAPIに比べて記事数が少ない
- 最近APIの仕様変更があったようで用語や解説が乱立していて、もう何がなんだか分からない
あえて難しくしているのではないかと思われるInstagram APIですが、広報PR活動においてもチェックはかかせないでしょう。
APIはWEBページに投稿写真を表示させたり、アプリと連携させたりと様々な機能があるようですが、今回はハッシュタグや投稿内容を検索抽出する方法などを中心に解説していきたいと思います。
Instagram APIを使うための2つのポイント
①アカウントの取得
Instagram APIを使うには運営元のFacebookからアプリ登録や各種アカウント登録する必要があります。
解説サイトはTwitter APIほどではないですが乱立しており、恐らくここでかなりの方が離脱されているのではないかと思います。
※流れに関しては下記動画が比較的分かりやすいと思います。
アカウントの取得方法に関しては当ブログではあまり深く触れませんが、下記2つをFacebookの機能から取得する必要があります。
| 取得項目 | 例 | 内容 |
| InstagramビジネスアカウントID | 134895793791914 | Facebookページに紐付けられている整数で構成されたID |
| アクセストークン | u6xOaUb(中略)53jl6oFyZ | 英数字で構成された長い文字列 ※有効期限別に3種類存在する |
※アクセストークンに関しては「取得した短時間有効トークンを使って申請し、更に新たな長時間有効トークンを取得する」という少し複雑な流れになります。
②投稿データの取得
ここからはInstagramビジネスアカウントIDとアクセストークンを取得した前提で進めていきます。
基本的には下記流れの繰り返しとなります。
- ビジネスアカウントIDとアクセストークンを使い、検索したいハッシュタグのIDをリクエストする
- ビジネスアカウントIDとアクセストークンとハッシュタグIDを使い、検索タイプを設定したURLをリクエストする
- JSONデータでレスポンスが返ってくる
APIの種類
InstagramのAPIには大きく下記2種類に分かれるようです。
| APIの種類 | 対象データ(引用) |
| Instagram基本(Basic)API | InstagramユーザーからInstagramユーザーアクセストークンおよびアクセス許可を取得する Instagramユーザーのプロフィールを取得する Instagramユーザーの画像、動画、アルバムを取得する (つまりユーザーに紐づく画像やプロフィールのみ取得できる) |
| Instagramグラフ(Graph)API | 公開された写真、動画、ストーリーズの取得と管理 他のInstagramビジネスユーザーとInstagramクリエイターに関する基本データの取得 コメントとそれに対する返信のモデレーション メディアおよびプロフィールのインタラクションの測定 ハッシュタグの付いたメディアの発見 @mentionの発見 写真と動画の公開 (つまり色々取得できる) |
上記分類から、ある特定のハッシュタグを抽出するためには、InstagramグラフAPIが必要になります。
Instagramグラフ(Graph)APIで取れるデータ
InstagramグラフAPIでは、現在下記2種類のデータと各種項目を取得することができるようです。
▼利用可能な検索方法
| 種別 | 対象 | 検索制限 |
| recent_media | 24時間以内に投稿されたデータ | 7日間で30件のハッシュタグ |
| top_media | 人気の投稿に上がったデータ | 7日間で30件のハッシュタグ |
▼取得できるデータ
| 取得できる項目 | 内容 |
| id | 投稿ごとのユニークID |
| media_type | IMAGE(投稿写真1枚)かCAROUSEL_ALBUM(投稿写真2枚以上) |
| like_count | いいね数 |
| comments_count | コメント数 |
| permalink | 投稿URL |
| media_url | 画像タイプがIMAGEだった場合の画像URL |
| children | 画像が2枚以上だった際の画像データ |
| timestamp | 投稿日時 |
ハッシュタグデータの取得方法
ここからはPythonでの実際のデータ取得方法を解説していきます。
※スプレッドシートに出力するために最初からGoogle Apps Scriptを利用してしまうのが一番効率的かと思います。
1.検索したいハッシュタグのIDを探す
import requests
# あらかじめID等は取得しておく
instragramID = "xxxxxx"
ACCESS_TOKEN = "xxxxxx"
# 検索したいワード
query = "マキアート"
id_search_url = "https://graph.facebook.com/ig_hashtag_search?user_id=" + instragramID + "&q=" + query + "&access_token=" + ACCESS_TOKEN
response = requests.get(id_search_url)
hash_id = response.json()
print(hash_id)
# ハッシュタグIDを確認
# {'data': [{'id': '17843767135051777'}]}
上記「#マキアート」の例では、ハッシュタグIDが「17843767135051777」だということが分かります。
2.検索タイプと取得したい項目を設定
取得したハッシュタグIDをURLに入れ、取得したい項目をカンマで繋いで記載します。
# 検索タイプを選択
serch_type = "top_media"
url = "https://graph.facebook.com/" + hash_id + "/" + serch_type + "?user_id=" + instragramID + "&q=" + query + "&access_token=" + ACCESS_TOKEN + "&fields=id,media_type,media_url,permalink,like_count,comments_count,caption,timestamp,children{id,media_url}&limit=50
3.データをリクエスト
response = requests.get(url)
json_data = response.json()
print(json_data["data"][0])
"""
{'id': '18088737829004273', 'media_type': 'IMAGE', 'media_url': 'https://scontent-nrt1-1.cdninstagram.com/v/t51.2885-15/66848248_553399355194722_8335201075156652396_n.jpg?_nc_cat=107&ccb=1-3&_nc_sid=8ae9d6&_nc_ohc=neq5Y0Zrgb4AX-hl1I4&_nc_ht=scontent-nrt1-1.cdninstagram.com&oh=964ba86029363c627de15ed0cdf0a06c&oe=607E7526', 'permalink': 'https://www.instagram.com/p/B0gLfyjF5vv/', 'like_count': 357, 'comments_count': 1, 'caption': '.\nブラックマキアート美味しすぎ\n.\n.\n#新宿 #新宿カフェ #東京カフェ #カフェ #おしゃカフェ #オシャカフェ #カフェ巡り #マキアート #ブラックマキアート #こぼれるフルーツサンド #いいね返し #インスタカフェ #インスタカフェ部 \n#bookandbed #instagood #instalike #instafood #instacafe #likeforlikes #like4likes #likelike #lfl #strowberry #blackmacchiato #koborerufruitsand #black #cafe #mytokyo #tokyo #shinjuk', 'timestamp': '2019-07-29T13:44:54+0000'}
"""
データはMAX50件
Twitter APIは1回のリクエストで100~500件を取得できましたが、Instagramのハッシュタグ検索ではMAX50件となります。
50件を超えるものに関しては、取得したJSONに出現する「paging」というキーの中にある「next」の値に記載されているURLを読み込むことで取得が可能です。
# 下記のようなJSONでデータが返ってくる
{
"data": [\
{\
"id": "投稿ID",\
"media_type": "IMAGE",\
"media_url": "画像URL",\
"permalink": "投稿リンク",\
"like_count": いいね数,\
"comments_count": コメント数,\
"caption": "本文",\
"timestamp": "投稿日時"\
}\
],
"paging": {
"cursors": {
"after": "1ページ目のURL"
},
"next": "2ページ目のURL"
}
}
この方法はTwitterと似ていますが、Twitter APIが毎回異なるユニークなnextURLが生成されるのに対して、Instagramでは2ページ目以降全てのURLが同一となるのが大きな特徴のようです。
つまり2ページ目以降(51件以降)は同じURLを叩き続ける(返ってくるデータは更新される)必要があるということです。
Instagramはちと不安定!?
このAPIでは、2ページ目以降同じURLを叩き付けないとならないため、Twitterの方式よりはかなり不安定なようです。
取得済みのページが再度現れたりとデータが重複するケースが多く見られました。やり方が間違っているだけかもしれませんが、データ取得後に念の為重複確認・削除をしたほうが良いかもしれません。
ダッシュボードを作る
ここからは取得したデータでダッシュボードを作っていきます。以前解説した 広報活動ダッシュボード と同様、今回もGoogleデータポータルを活用していきます。
流れ
- InstagramグラフAPIからデータを取得する
- 取得データをスプレッドシートに出力する
- データポータルへ連携させる
本来はGASでデータの定期取得&スプレッドシート書き込みまで一貫して行えると理想だと思われますが、今回はPythonからデータ取得しているので、DataFrameなどにまとめてから、スプレッドシートに出力します。
Pythonからスプレッドシートへは「gspread」「gspread_dataframe」というライブラリを使うと出力ができます。
スプレッドシートに出力
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from gspread_dataframe import get_as_dataframe, set_with_dataframe
SCOPES = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
SERVICE_ACCOUNT_FILE = "xxx"
credentials = ServiceAccountCredentials.from_json_keyfile_name(SERVICE_ACCOUNT_FILE, SCOPES)
gs = gspread.authorize(credentials)
# スプレッドシートのURLから取得
SPREADSHEET_KEY = "xxx"
# ブックとシートを選択
workbook = gs.open_by_key(SPREADSHEET_KEY)
worksheet = workbook.worksheet("シート名")
df = pd.DataFrame()
df["id"] = ids
df["media_type"] = media_types
df["media_url"] = media_urls
df["permalink"] = permalinks
# df["like_count"] = like_counts #途中で取れなくなりました
df["comments_count"] = comments_counts
df["caption"] = captions
df["timestamp"] = timestamps
df["children"] = childrens
df = df[~df.duplicated(subset='id')]
df["thumb_nail"] = ""
df.loc[df['media_url'] != "None", 'thumb_nail'] = df['media_url']
df.loc[df['media_url'] == "None", 'thumb_nail'] = df['children']
# データフレームをスプレッドシートへ出力
set_with_dataframe(workbook.worksheet("シート名"), df)
データポータル側でIMAGE関数でサムネイル作成
出力したスプレッドシートをベースにデータポータルでダッシュボードを作っていきます。
データポータルには、URLデータから画像を取得してくる「IMAGE関数」というものがあります。スプレッドシートに落としてきた画像URLをIMAGE関数に入れた項目を作ることで、サムネイルを作ることができます。

出来上がり
出来上がったデータポータルは下記画像リンクより確認可能です。
定期クローリングをすれば常に最新のデータを表示することもできます。今回はGASが不安定だったためPythonを経由して行っていますが、データ取得を最初からGoogle Apps Script(GAS)で行えば、定期実行も簡単に行えるでしょう。
以上、Instagram API(ハッシュタグ検索)でできることの解説でした。
※当社では広報活動のサポートの他、TwitterやInstagramなどのデータ抽出や、データスクレイピングの代行も行っています。 お問い合せフォーム よりお気軽にお問い合せください。
▼合わせて読みたい







