Google Apps Script @福岡

GASで面白Webサービス&コスト削減や!

Google Apps Script 講座初級編「GASでInstagramのフォローフォロワー数をスクレイピングする」

はじめに

後藤銃士です。7回目となります。Instagram のフォロー数、フォロワー数を取得したケースを考えてまして、今回はそのスクレイピングについて説明したいと思います。5回めに書きました「GASでTwitterのフォローフォロワー数をスクレイピングする」の姉妹編となります。

前回のスクレイピングでは Twitter のページのソースから正規表現を利用して欲しい情報を(フォローフォロワー数)を取り出しましたが、今回、Instagram のページのソースをよく見ると、JSON形式でサイトの概要が掲載されている箇所があるんでそこを利用することにします。

JSON形式とは?

詳しい解説は JSON とは何か

を読んでいただくとよいと思います。

JSONJavaScript オブジェクトの構文に従ったテキストベースのフォーマット

とかいわれてもチンプンカンプンでしょうから「ふーん」ぐらいでよいかと思います。具体的に説明していきますのでそこでざっくり理解できればよいです(できなくても大丈夫です、コピペなので)

この機能が役に立つのは

  • Instagram の自他問わずフォローフォロワー数を記録しておきたい人向け(マニア)
  • JSON のちょっとした知識

今回は初級編「GASでInstagramのフォローフォロワー数をスクレイピングする」

対象

  • 基本ができていればよいかもしれません。

学べること

Google Apps Script によるスクレイピングの基礎テクニック

講座スタート

いつもどおりコピペだけで大丈夫です。

新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。

そしていつもどおり1行目の3行目の間に

  var instagramId = 'rena_takeda'
  var url = 'https://www.instagram.com/' + instagramId;
  var response = UrlFetchApp.fetch(url);
  var html = response.getContentText('UTF-8');
  var json = html.match(/window._sharedData = (.*?);<\/script>/)[1];
  var jsonData = JSON.parse(json);
  var full_name = jsonData['entry_data']['ProfilePage'][0]['graphql']['user']['full_name']
  var follows   = jsonData['entry_data']['ProfilePage'][0]['graphql']['user']['edge_follow']['count'];
  var followers = jsonData['entry_data']['ProfilePage'][0]['graphql']['user']['edge_followed_by']['count'];
  Logger.log(full_name);
  Logger.log(follows);
  Logger.log(followers);

をコピペして保存し、実行してみましょう。

f:id:jijyoronn:20181223224846p:plain

表示>ログを選択してみて下さい。

f:id:jijyoronn:20181223225136p:plain

今回は人気女優の「武田玲奈さん」の Instagram を参考にさせていただいています。あっさり名前、フォロー、フォロワー数が取得できました。

f:id:jijyoronn:20181223225300p:plain

コードの instagramId を参照したい方の InstagramId に変えてもらえば誰のものでも参照できます。 instagramId は URL の https://www.instagram.com/rena_takeda/ の赤文字のところです。

ではコードの解説を少し。 1〜4行目は前回説明が済んでいると飛ばすします。

  var json = html.match(/window._sharedData = (.*?);<\/script>/)[1];

今回は個々がキモです。これは正規表現ソースコードの 「window._sharedData =」から「;<\/script>」の間の記述を取り出して json に格納してね、という命令です。 じゃあその間にあるデータがどういうものかというと、以下になります。

f:id:jijyoronn:20181223230155p:plain

…ゴチャゴチャしてよくわかんねーですね?複雑な構造のデータをコンピューターは気にせず処理できますが、人類が目視で確認するのは少々キツイ。そんなときは便利なサイトがあります。見やすいように整形してくれるんです。

JSONきれい ~JSON整形ツール~

f:id:jijyoronn:20181223230235p:plain

そうするとなにやらデータが構造的に定義されていることがわかるのではないでしょうか。Instagram の情報がてんこ盛りとなっていますので、ここかデータを取得します。 GAS、というか JavaScriptJSON データを配列に変換することで簡単に扱えるようにしてくれる仕組みがあって、それが

  var jsonData = JSON.parse(json);

です。あとはデータの構造にそって欲しい情報を指定すればデータを取得することができるわけです。

  var full_name = jsonData['entry_data']['ProfilePage'][0]['graphql']['user']['full_name']

entry_data → ProfilePage → 0

この「0」っていう、突然出てくるのでなんだこれ?と思うかもしれないですが、画面をよくみると「[」ってのがあるじゃないですか。こいつを指してます。これは配列と呼ばれるデータの持ち方で番号で指定します。

"ProfilePage" : [ { xxxx } ,  { yyyy },  {zzzz} ]

のようなデータで { xxxx } を指定したい場合は ['ProfilePage'][0] になります。今回は配列でデータを持っているのですが

"ProfilePage" : [ { xxxx } ]

なので 0 を指定することになります。

あとは、

entry_data → ProfilePage → 0 → graphql → user → full_name

とすれば、名前を取得できる、というわけです。 解析データを眺めるといろいろわかると思いますが、最新の画像の URL や投稿時のコメントなども合わせて取り出すことができますから、トリガーを使って定期取得する、というのも価値があるかと思います。

今回は、スクレイピングJSON について書きました。この JSON はあちこちで出現する重要データ形式ですので、扱い方を知っていると役に立つと思います。特にフロントは JavaScript を使いますしね。

よし、これで Twiter と Instagram 双方のフォロー、フォロワー数の自動記録の仕方はクリアです。おめでとうございます。次は YouTube や TicTok あたりがターゲットになるかもしれないですが、食傷気味かな。次はもっと別の GAS の使い方を解説出来るようにします。

それではご覧いただきありがとうございました。