はじめに

ググるとたくさん出てくるのでご存知かとは思いますが、Instagram には API があります。また、こちらもご存知かとは思いますが Instagram API の利用申請許可が降りる可能性は極めて低いです。昨今のインスタブームに乗っかって Instagram を利用したい経営者は多数いるかと思いますが、正規の方法での利用は諦めたほうがいいでしょう。また、Instagram のスクレイピングは規約で禁止されていますのでスクレイピングで実装を支持されたエンジニアの方はその旨を伝えて拒否しましょう。

不正な方法を用いて、アカウントの作成、情報へのアクセス、または情報の取得を試みることは禁止されています。
これには、弊社から明示的な許可を得ることなく、自動化された手段を用いてアカウントを作成したり、情報を取得したりする行為が含まれます。

とはいえ、Instagram のスクレイピング自体はお勉強の題材としては良いかと思いますので、少しだけ実装をしてみました。以下の内容は自己責任の範囲でご確認ください。

 

やりたいこと

  • Instagram のハッシュタグ検索をスクレイピング
    • 最新投稿の本文を取得
    • ハッシュタグ検索結果件数を取得

実装

私は PHPer なので PHP での実装となります。
とりあえずコード貼ります。


<?php
// 検索対象ハッシュタグ
$tagList = array(
    'インスタ映え',
    'インスタ萎え',
);
foreach ($tagList as $tag) {

    // Instagram へアクセス
    $encodedTag = urlencode($tag);
    $url = "https://www.instagram.com/explore/tags/{$encodedTag}/";
    // 自作の curl ライブラリ
    $requestObj = new CurlHttpRequest($url);
    $timeOutSecond = 30;
    $instagramContentsResponse = $requestObj->get($timeOutSecond);
    
    // タイムアウト処理等は適宜いれてください

    // レスポンスから必要な json 部分を抜き出す
    $instagramContentsResponse = $instagramContentsResponse['body'];
    $positionStart = mb_strpos($instagramContentsResponse, 'window._sharedData = ');
    $positionEnd = mb_strpos($instagramContentsResponse, ';</script>');
    $length = $positionEnd - $positionStart;
    $json = mb_substr($instagramContentsResponse, $positionStart, $length);
    $json = str_replace('window._sharedData = ', '', $json);
    $jsonObj = json_decode($json);
    $infoListObj = $jsonObj->entry_data->TagPage[0]->graphql->hashtag->edge_hashtag_to_media->edges;
    foreach ($infoListObj as $index => $infoObj) {
        // Instagram 投稿 ID ?
        $infoObj->node->shortcode;
        // 投稿日時
        $stamp = date('Y-m-d H:i:s', $infoObj->node->taken_at_timestamp);
        // 投稿本文
        $text = $infoObj->node->edge_media_to_caption->edges[0]->node->text;
    }
    // ハッシュタグ検索結果件数
    $instagramPostCount = $jsonObj->entry_data->TagPage[0]->graphql->hashtag->edge_hashtag_to_media->count;
}


Instagram へのアクセスは curl で行っていますが上記の例では自作の curl ラッパークラスを使っていますので、適宜ご自身の環境で書き換えてください。
GET でアクセスできれば、file_get_contents でもなんでも構いません。
取得したレスポンスから JavaScript の部分に必要な情報が入っていますので、その部分を抜き出します。
また、データは JSON 形式になっていたため json_decode しています。
あとは必要な情報へアクセスして DB に保存するなど煮るなり焼くなり。。。
もし、文字化けする場合はサーバーの設定か PHP の文字コード設定を見直してみてください。

まとめ

今回は Instagram ハッシュタグ検索のスクレイピングを試しましたが、同じ要領で個別の投稿のスクレイピングもできるかと思います(未検証)。
このデータを収集して機械学習用のデータにすると面白いかもしれないと思いました。
ただし、冒頭にも記載しましたが Instagram の利用規約に抵触する可能性が高いので自己責任の範囲で行ってください。
上記内容の利用に関して筆者は一切の責任を負いません。
では、楽しいインスタライフを。