マーケティングチームはフィードで競合の投稿を確認できますが、手作業で眺めるだけでは、どの形式やテーマが継続的に反応を集め、どれが一度だけ目立ったのかという具体的な問いには答えにくいものです。解決策は、公開投稿のデータを毎日保存し、時期や形式、利用可能なカウンターごとに比較することです。

以下では、PythonとIG Scraper APIを使った基本的なパイプラインを紹介します。選択したアカウントの投稿を取得し、レスポンスをJSONL形式で保存して、新しいコンテンツのサマリーを作成します。このレポートの反応指標は、収集時点でAPIが返した値を示します。異なる日付のスナップショットを使えば、その変化を個別に分析できます。
まず、何を比較するかを決める
少数の競合アカウントを対象とするなら、公開アカウントのリストを作成し、同じスケジュールで投稿を収集すれば十分です。データで答えられる問いから始めましょう。たとえば、投稿頻度、Reelsなどの形式、繰り返し登場するテーマ、利用可能な「いいね」やコメントのカウンターの変化です。
ストレージでは「投稿」と「そのスナップショット」を分けて扱います。レスポンスに安定したIDが含まれている場合は、それを使って投稿を識別し、収集時刻を付けた別のレコードとして実行ごとに保存します。そうすれば、昨日の値を今日の値で上書きせず、利用可能なカウンターの推移を確認できます。
文書化されたエンドポイントを使う
jsonscraperのドキュメントでは、基本的なリクエスト先としてhttps://ig.jsonscraper.com、エンドポイントとしてGET /v1/user/by/usernameが示されています。投稿の取得については、API一覧にGET /v1/user/medias/chunkも記載されています。正確なパラメーターとレスポンスのフィールドは、製品に関連付けられたPostmanコレクションで確認してください。実際のリクエストに対するレスポンスを調べる前に、想定した構造に処理を固定しないようにしましょう。
初期確認には、文書に記載されたプロフィール取得リクエストの例を使います。キーはソースコードに書き込まず、環境変数で渡してください。
curl -G "https://ig.jsonscraper.com/v1/user/by/username" \
--data-urlencode "username=apple" \
--data-urlencode "license_key=$JSONSCRAPER_LICENSE_KEY" \
--data-urlencode "cache_timeout=60"
製品ページの例では、プロフィールのエンドポイントにusername、license_key、cache_timeoutを指定しています。このパラメーターをほかのエンドポイントにも使うのは、そのエンドポイントのドキュメントに記載されている場合だけにしてください。投稿をリクエストする際は、該当エンドポイントの仕様から最新のパラメーター名を確認します。
レスポンスを時系列スナップショットとして保存する
次のスクリプトは、実運用に向けたひな型です。Postmanのドキュメントを厳密に確認して設定できるよう、投稿取得エンドポイントのURLとパラメーターは設定項目として残しています。処理では元のJSONと収集時刻を保存します。フィールドの正規化は、実際のレスポンスを確認してから追加してください。
import json
import os
from datetime import datetime, timezone
from pathlib import Path
import requests
BASE_URL = "https://ig.jsonscraper.com"
USERNAME = os.environ["IG_USERNAME"]
LICENSE_KEY = os.environ["JSONSCRAPER_LICENSE_KEY"]
OUTPUT = Path("instagram_snapshots.jsonl")
# Postmanコレクションのドキュメントに従って、
# GET /v1/user/medias/chunk のエンドポイントとパラメーターを設定します。
MEDIA_PATH = os.environ["IG_MEDIA_PATH"]
MEDIA_PARAMS = json.loads(os.environ["IG_MEDIA_PARAMS_JSON"])
params = {
**MEDIA_PARAMS,
"username": USERNAME,
"license_key": LICENSE_KEY,
}
response = requests.get(
f"{BASE_URL}{MEDIA_PATH}", params=params, timeout=30
)
response.raise_for_status()
payload = response.json()
record = {
"collected_at": datetime.now(timezone.utc).isoformat(),
"username": USERNAME,
"response": payload,
}
with OUTPUT.open("a", encoding="utf-8") as file:
file.write(json.dumps(record, ensure_ascii=False) + "\n")
ここでは、ページネーションのパラメーターやフィールド名を推測で追加していません。具体的な仕様からコピーし、APIのレスポンスで確認してください。タイムアウトとraise_for_status()を使うと、結果を通常のデータとして保存する前にネットワークエラーを検出できます。自動実行では、JSONの検証とエラーログの記録も追加しましょう。
スケジュールと指標を追加する
cronや自動化ツールのスケジューラーを使い、1日1回収集を実行します。複数のアカウントがある場合は、設定リストを順に処理し、各アカウントのスナップショットを個別に保存します。一時的なエラーの後に再実行できるようにしておきましょう。キーは環境変数またはシークレット管理ツールに保存します。APIページでも、クライアントコードにキーを埋め込まないよう個別に推奨しています。
レスポンスを確認した後、username、media_id、collected_at、コンテンツ種別、利用可能なカウンターなどのフィールドを持つテーブルにレコードを正規化します。元のJSONは削除しないでください。レスポンス形式が変わったときや、計算を検証する必要があるときに役立ちます。
分析レイヤーでは、期間ごとの新規投稿数、形式別の利用可能な反応の中央値、同じ投稿についてスナップショット間で変化したカウンターを算出します。中央値を使うと、単発のバイラル投稿がサマリーに与える影響を抑えられます。アカウントを比較する際は、同じ期間を対象にし、集計値とともにサンプル数も表示しましょう。
得られるもの
チームは、再現可能な投稿データの表と、投稿頻度、形式別の分布、利用可能な反応の推移を示す日次サマリーを得られます。こうした情報は、フィードのスクリーンショットを集めるだけでなく、自社の編集カレンダーを考えるための仮説づくりに役立ちます。
次の段階では、正規化したレコードをGoogle Sheets、データベース、可視化システムに送信し、文章によるサマリーの作成は別工程にします。AIを使う場合は、集計済みデータを渡し、対象期間と投稿数を明記して観察できる傾向を説明するよう依頼しましょう。戦略の判断は編集者に委ねます。
まずは1つのアカウントと1つのエンドポイントから始めます。IG Scraper APIの説明でパラメーターとレスポンス構造を確認し、その設定をスケジュールに組み込みましょう。この方法なら、競合の監視を一度きりの手作業から、履歴を保存できる明確なパイプラインへと変えられます。