

# 論文用にInstagramの公開コメントをExcelへエクスポートする

書面で定めたルールに従って公開のトップレベルコメントをエクスポートし、Excelで開きます。取得元の各IDは文字列として保持します。分類する前に、そのコメントから何が分かるかを書き留めます。

トップレベルコメントとは、投稿そのものに付けられたコメントです。別のコメントに付けられた返信ではありません。この記事でいうサンプルとは、書面で定めたルールに従って保存した公開コメントです。Instagram上のすべてのコメントではありません。

エクスポートとは、保存した行をファイルとしてダウンロードすることです。Actorは、行を収集する、ホスティングされたプログラムです。Taskは、そのActorの入力設定を保存したものです。実行とは、1つの入力設定による1回の収集処理です。Actorは取得元のデータを行として保存します。件数の集計と分類は、自分で行います。

## 保存される各行の内容

以下のフィールドの仕様は、[Instagram Comments Scraper Actor](https://apify.com/chronometrica/instagram-comments-scraper)の公開ビルド0.1.21について、2026-10-13に確認しました。フィールドとは、行に含まれる名前付きの値です。このビルドは、1行につき1件の公開トップレベルコメントを保存します。

各行には、`postUrl`、`postId`、`postShortCode`、`commentId`、`text`、`createdAt`、`likesCount`、`repliesCount`、`ownerId`、`ownerUsername`、`ownerVerified`、`collectedAt`が含まれます。

`postUrl`は、入力した投稿リンクです。`postId`は、その投稿の取得元での識別子です。`postShortCode`は、そのリンクに含まれるショートコードです。ショートコードは、`/p/`、`/reel/`、`/tv/`の後にある部分です。`commentId`は、1件のコメントの取得元での識別子です。`text`は、コメントの本文です。`createdAt`は、取得元が示すコメントの日時です。`likesCount`は、取得元に表示されたいいね数です。`repliesCount`は、取得元に表示された返信数です。返信の本文ではありません。`ownerId`は、コメントを投稿したアカウントの取得元での識別子です。`ownerUsername`は、そのアカウントの公開ユーザーネームです。`ownerVerified`は、そのアカウントに認証マークが表示されていたかどうかを示します。`collectedAt`は、Actorがその行を保存した日時です。

nullは、値を取得できなかったことを意味します。空文字列には文字がありません。空文字列とnullは異なります。0は、数値が0だったことを意味します。falseは、認証マークがなかったことを意味します。null、0、falseは、別々の値として保持します。nullを0やfalseに変換しないでください。

このビルドは、各行に状態を示すフィールドを付けません。`parentId`は保存しません。返信の本文も保存しません。投稿のキャプションも保存しません。フォロワー数も保存しません。ボットスコアも保存しません。ボットスコアとは、アカウントが自動で動作しているかどうかを推測する指標です。感情ラベルも保存しません。感情ラベルとは、称賛や不満などの分類です。誰がある集団の正式な構成員に当たるかも示しません。投稿者のIDがnullになることもあります。

分類できる返信の行はありません。`repliesCount`がnullでも、本文が空の返信があるという意味ではありません。感情を表すものでもありません。

## 1. 収集する前に抽出の枠組みを書く

抽出の枠組みとは、選んだ投稿の一覧と、コメントを採用するルールです。Actorを実行する前に、この枠組みを書きます。

次の項目を書きます。

- 既に把握している公開投稿のリンク。
- それらの投稿を一覧に入れた選定ルール。
- 対象期間、または日付で絞り込まない旨の注記。
- `collectedAt`から転記する収集日時。
- 言語に関するルール。
- 数える対象：コメント、アカウント、投稿のいずれか。

対象期間とは、採用する最初の日と最後の日です。数える対象が集計単位になります。[コメント、アカウント、投稿は、それぞれ異なる単位です](/ja/articles/reddit-%E8%AA%BF%E6%9F%BB%E7%B5%90%E6%9E%9C-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AE%E5%BD%B1%E9%9F%BF-%E9%9B%86%E8%A8%88%E5%8D%98%E4%BD%8D/)。収集日時には`collectedAt`の値を記録し、分類を始めた日を使わないでください。

コメントを読む前に投稿一覧を書きます。そうすれば、コメントが自分の考えに合うという理由で投稿を追加せずに済みます。実行する前に対象期間を書くか、期間を設けないと書きます。同じ記録に集計単位も書きます。後で集計すると、数を取り違えやすいためです。以下の架空のファイルで、その理由を示します。Actorは言語フィールドを追加しません。自分が守れる言語ルールを書いてください。例えば、保存した本文をすべて残し、新しい列に言語を記入します。行を除外する場合は、理由を書きます。

既に把握している公開リンクを使います。リンクには、`/p/`、`/reel/`、`/tv/`のいずれかが必要です。プロフィールリンクは、アカウントのページです。ストーリーズは、短期間で消える投稿です。ハッシュタグのリンクは、タグのページです。検索と発見は、コンテンツを閲覧するページです。これらの経路には対応していません。公開投稿だけを使ってください。非公開アカウントや非表示のコメントは収集しないでください。

このサンプルで記述できるのは、保存した公開コメントの本文です。Instagramの全ユーザーを代表するものではありません。全ユーザーについて主張するには、人を選ぶための別の計画が必要です。この記事では、その計画は作成しません。

日付フィルターを使う場合、開始日と終了日も対象に含まれます。つまり、最初の日や最後の日のコメントも採用できます。日付フィルターが有効な間は、`createdAt`がないコメントは除外されます。取得件数の上限を解除しない限り、日付フィルターが確認する公開コメントは1投稿につき最大250件です。古い順を選んだ場合も、この確認件数の上限が適用されます。取得件数の上限を解除しても、公開フィード全体を収集できるわけではありません。日付や古い順を使う場合は、この制限を記録に書いてください。

## 2. 上限3件で1つの投稿を確認する

予備実行とは、最初に行う、ごく小規模な実行です。ファイルの構造を確認するために使います。既知の公開投稿1件と、上限3件から始めます。上限とは、1つの投稿から保存するよう指定するコメント数の最大値です。最大値であり、その件数を取得できるという保証ではありません。

保存済みの[CSVエクスポート用Task](https://apify.com/chronometrica/instagram-comments-scraper/examples/export-instagram-comments-to-csv)は、2026-10-13に確認しました。保存されている入力設定は次のとおりです。

```json
{
  "postUrls": ["https://www.instagram.com/reel/DZu6dkVyImf/"],
  "maxCommentsPerPost": 250,
  "commentSortMode": "default",
  "collectAllAvailable": false
}
```

2. 上限3件で1つの投稿を確認する

そのリールは、開始用の入力例です。開始用の入力例は、あなたの研究ではありません。実行しても、分類は行われません。そのリールを、自分が使う公開投稿のリンクに置き換えてください。

予備実行には、次の形式を使います。

```json
{
  "postUrls": ["https://www.instagram.com/p/YOURPUBLICPOST/"],
  "maxCommentsPerPost": 3,
  "commentSortMode": "default",
  "collectAllAvailable": false
}
```

2. 上限3件で1つの投稿を確認する

`YOURPUBLICPOST`はプレースホルダーです。プレースホルダーとは、置き換える必要がある仮の文字列です。この文字列を実際の投稿として実行しないでください。

`commentSortMode`を`default`にすると、そのリクエストに対して取得元が返した順序を保持します。標準の順序は、新しいコメント順を保証しません。古いコメント順も保証しません。全ユーザーからの無作為抽出でもありません。後で新しい順や古い順を選ぶ場合、その指定で並べ替えるのは、実行で収集したコメントです。その指定だけで、手順1に記載した確認件数の上限を超えられるわけではありません。

`collectAllAvailable`をfalseにすると、数値で指定した上限が適用されます。trueにすると、その上限は解除されます。それでも、公開フィードの終端、制限時間への到達、取得元での障害によって実行が停止することがあります。その時点で停止しても、すべての公開コメントを取得したことにはなりません。Instagramの全ユーザーを取得したことにもなりません。予備実行では、`collectAllAvailable`をfalseのままにします。

投稿を1件にすれば、最初の確認を小規模に保てます。2件の投稿で同時に失敗すると、原因が分かりにくくなります。上限が3件なら、保存されたすべての行を目で確認できます。Taskの値250は、保存された最大値にすぎません。250件のコメントを取得できるという保証ではありません。以前の公開質問では、ツールの制限として100件のコメントに言及している場合があります。その古い数値は、現在のActorの上限ではありません。書面に記した上限は、自分で設定した最大値です。上限を高くしても、すべてのコメントになるわけではありません。

実行後、`postShortCode`を自分のURLと照合します。次にOUTPUTを読みます。OUTPUTは、行とともに保存される実行レポートです。冒頭の`requestedTargets`、`savedRows`、`cappedTargets`を読みます。各対象について、`resultState`、`sampleHealth`、`stopReason`を読みます。

確認した実行では、指定したショートコードに対して3行が保存されました。その行には、コメントID、本文、投稿者ID、日時がありました。OUTPUTには、上限到達を示すcapped、停止理由`max_comments_reached`、`savedRows`の値3が示されていました。`repliesCount`はnullでした。この実行で分かるのは、その取得元におけるフィールドの構造です。投稿上のすべてのコメントを示すものではありません。どのコメントが最も古いかを証明するものでもありません。返信の本文や他の投稿も含まれていません。この実行では投稿者IDがありました。それでも、後の投稿では投稿者IDがnullになる可能性があります。

その実行は、上限に達したため停止しました。上限に達した結果でも、その投稿にコメントが3件しかないという意味ではありません。この構造の確認に合格してから、研究用の上限を選んでください。他の停止条件を理解するまでは、`collectAllAvailable`をfalseのままにします。

予備実行で行が返されなくても、その投稿にはコメントがないと書かないでください。取得元のデータを参照できなかった可能性があります。判断する前に、`resultState`、`sampleHealth`、`stopReason`を読んでください。行がないことと、感情を分類した結果は別のものです。

## 3. 元のJSONを保管する

JSONは、入れ子になった値やnullという語を保持できるテキスト形式です。JSONLは、1行に1つのJSONオブジェクトを記述する形式です。データセットは、実行で保存された行の集まりです。[Apifyのデータセットガイド](https://docs.apify.com/platform/storage/dataset)に記載された方法でエクスポートできます。

まず、元のJSONまたはJSONLと、OUTPUTレポートを保存します。その後、作業用のコピーとしてCSVまたはExcelファイルを作ります。CSVとは、列をカンマで区切るテキスト形式の表です。使った入力設定も保存します。投稿リンク、上限、並び順、`collectAllAvailable`、日付の指定を保存してください。

コメントの行には、データセット全体の状態を示すフィールドがありません。Excelのコメント用セルの中にOUTPUTが保持されるわけではありません。作業用ファイルだけを保管すると、そのファイルを作った条件を失う可能性があります。

CSVではnullと空文字列の違いが見えなくなることがあるため、JSONを保管します。次の2つの架空の値は、研究の集計結果ではありません。

```json
{"text": null, "likesCount": null, "ownerVerified": null}
```

3. 元のJSONを保管する

```json
{"text": "", "likesCount": 0, "ownerVerified": false}
```

3. 元のJSONを保管する

CSVのセルは、nullでも空文字列でも空欄に見える場合があります。どちらだったかが分かるのは、元のJSONだけです。いいね数0は、実際に0だったという値です。falseも、認証の有無を示す実際の値です。nullは0ではなく、falseでもありません。

## 4. IDを文字列として保持してCSVをインポートする

データセットから、作業用のコピーをCSVまたはExcel形式でダウンロードします。CSVの場合はExcelを開き、「データ」から「テキストまたはCSVから」を選びます。ファイルを読み込む前に、各列のデータ型を確認します。このインポート手順は、Microsoftの[テキストファイルやCSVファイルをインポートまたはエクスポートする](https://support.microsoft.com/en-us/office/import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba)で説明されています。

`postId`、`commentId`、`ownerId`は「テキスト」に設定します。実際の取得元IDは、長い数値に見えることがよくあります。数値型の列では、長いIDの桁が失われることがあります。`text`も文字列として保持します。`createdAt`と`collectedAt`は、JSONと一致したままの場合に限り、日時として保持します。UTCは、世界で共通して使う時刻の基準です。地域のタイムゾーンは使いません。Excelが時刻をずらす場合は、代わりに文字列として保持します。Excelが推測したデータ型を、そのまま信用しないでください。

インポート後、`commentId`を1つ、`createdAt`を1つ選び、変更していないJSONと照合します。行数も照合します。次の節では、この確認に使う架空のテキストテストを示します。

## 5. 分類する前に行数を数える

作業用ファイルを元のJSONと照合します。行数を数えます。空欄でないコメントIDを、重複を除いて数えます。重複を除くとは、同じIDを1回だけ数えることです。コピーされた行を探します。コメントIDがない行を探します。nullと空文字列は、JSONで区別します。

### 架空のインポートテスト

次のファイルは架空のものです。架空とは、説明のために作ったという意味です。Actorの取得結果ではありません。後で示す8行の集計にも含まれません。実際にExcelで実行した結果でもありません。

テスト用IDは`1234567890123456789`です。このIDは19桁です。文字列として保持します。期待されるIDは、この19桁と完全に同じです。この記事では、Excelが誤って生成したとする数値を作りません。インポート後にも確認できなければならない数字を示します。

テスト用の本文には、カンマ、改行、引用符、caféという語が含まれます。éは、基本的な英字A〜Zには含まれません。ファイルはéを保持する必要があります。

次のJSONが、架空の元データです。

```json
{
  "commentId": "1234567890123456789",
  "text": "Nice, work\nShe said \"hello\" at the café"
}
```

5. 分類する前に行数を数える

JSONでは、`\n`は改行を意味します。次のCSVは、同じ架空の行を表しています。引用符で囲まれた本文には、実際の改行が含まれています。内部の引用符は二重にして記述します。これは通常のCSVの書き方です。

```csv
commentId,text
"1234567890123456789","Nice, work
She said ""hello"" at the café"
```

5. 分類する前に行数を数える

正しくインポートできれば、IDは次のままです。

```text
1234567890123456789
```

5. 分類する前に行数を数える

本文は次のままです。

```text
Nice, work
She said "hello" at the café
```

5. 分類する前に行数を数える

これらが、保持されるべき値です。あなたのコンピューターで確認した結果ではありません。ID列が数値型になっていたり、caféのéが失われていたりする場合は、作業を止めてインポートを修正します。破損したファイルで分類を始めないでください。

### 架空の8行の研究用ファイル

次の8行も架空のものです。Actorの取得結果ではありません。確認済みの3行の実行結果でもありません。1つの架空の投稿から作った、説明用の1ファイルです。この件数を実際の論文に転記しないでください。

すべての行で、次の投稿の値を共通して使います。

- `postUrl`: `https://www.instagram.com/p/EXAMPLE0001/`
- `postId`: `1000000000000000001`
- `postShortCode`: `EXAMPLE0001`
- `collectedAt`: `2026-10-13T12:00:00Z`

`postId`は19桁です。実際のインポートでは、「テキスト」にする必要があります。コメントが8行あっても、属する投稿は1件です。8件の投稿として数えないでください。

表のnullは、値を取得できなかったことを意味します。空文字列は、本文に文字がないことを意味します。投稿者を表す短いラベルA、B、C、Dは、取得元のIDの代わりです。実際の投稿者IDは、長い場合があります。これらも文字列として保持します。

| 行 | commentId | text | ownerId | ownerUsername | likesCount | repliesCount | ownerVerified | createdAt |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| R1 | C1 | すばらしい投稿 | A | name_a | 2 | null | false | 2026-10-01T10:00:00Z |
| R2 | C1 | すばらしい投稿 | A | name_a | 2 | null | false | 2026-10-01T10:00:00Z |
| R3 | C2 | すばらしい投稿 | A | name_a | 1 | null | false | 2026-10-02T10:00:00Z |
| R4 | C3 | いい写真 | B | name_b | 0 | 0 | false | 2026-10-03T10:00:00Z |
| R5 | C4 | これ、大好き | C | name_c | 4 | null | false | 2026-10-04T10:00:00Z |
| R6 | C5 | 最高 | D | name_d | 3 | null | false | 2026-10-05T10:00:00Z |
| R7 | C6 | 空文字列 | null | null | null | null | null | 2026-10-06T10:00:00Z |
| R8 | null | かっこいい | null | null | null | null | null | 2026-10-07T10:00:00Z |

R1とR2は、取得元の値が同じです。R2は、エクスポートされた行のコピーです。コピーされた行では、同じコメントIDと同じ取得元の値が繰り返されます。R3の本文も「すばらしい投稿」ですが、コメントIDはC2です。C2は別のコメントです。日時といいね数も異なります。これらの違いも、見分ける助けになります。他のフィールドが一致していても、コメントIDだけで区別できます。

R4の`likesCount`が0なのは、いいね数が0という意味です。`repliesCount`が0なのは、取得元に返信数0と表示されていたという意味です。それでも、返信の本文はありません。`ownerVerified`がfalseなのは、取得元でそのアカウントが未認証と示されていたという意味です。R7のnullは、0やfalseを意味しません。C6の本文は空文字列です。この例では、C6の本文にnullは使っていません。CSVの作業用コピーでは、この空文字列、nullの投稿者、nullのいいね数、nullの返信数、nullの認証マークが、すべて空欄に見える場合があります。C6を分類する前に、元のJSONを確認してください。

次の順番でファイルの件数を数えます。

元の行数には、コピーを含むすべての行を数えます。元の行数 = 8。

R2は余分なコピーです。余分なコピー行数 = 1。

R8にはコメントIDがありません。コメントIDがない行数 = 1。

重複を除いた識別可能なコメント数 = 8 - 1 - 1。結果は6です。6つのIDは、C1、C2、C3、C4、C5、C6です。

C6の本文は空文字列です。本文が空文字列の識別可能なコメント数 = 1。

本文分析の母数 = 6 - 1。結果は5です。本文分析の母数とは、分類できる本文を持つ、識別可能なコメントの件数です。該当するコメントは、C1、C2、C3、C4、C5です。

文字が含まれる行から数え始めることもできます。R1、R2、R3、R4、R5、R6、R8には文字があります。7行です。コピーのR2と、判定が未確定のR8を除きます。7 - 1 - 1 = 5。どちらの方法でも、本文分析の母数は同じになります。

| 集計項目 | 算出方法 | 結果 |
| --- | --- | --- |
| 元の行数 | R1〜R8 | 8 |
| 余分なコピー行数 | R2はR1のコピー | 1 |
| コメントIDがない行数 | R8 | 1 |
| 重複を除いた識別可能なコメント数 | 8 - 1 - 1 | 6 |
| 本文が空文字列の識別可能なコメント数 | C6 | 1 |
| 本文分析の母数 | 6 - 1 | 5 |
| 投稿者が分かる識別可能なコメント数 | C1〜C5 | 5 |
| 重複を除いた識別可能なアカウント数 | A、B、C、D | 4 |

R1、R2、R3の本文は、すべて「すばらしい投稿」です。R1とR2は同じIDなので、C1は1回だけ数えます。C2はIDが異なるため残します。本文の繰り返しを削除すると、実際に別のコメントを失います。一致する行をすべて残すと、C1を2回数えてしまいます。

識別可能な6件のコメントの投稿者の値は、A、A、B、C、D、nullです。投稿者が分かる識別可能なコメントは、C1〜C5の5件です。アカウントAは、C1とC2の両方を書きました。重複を除いた識別可能なアカウント数 = 5 - 1。結果は4です。4つのアカウントは、A、B、C、Dです。投稿者の値が5つあるということは、コメントが5件あるという意味です。5アカウントでも、5人でもありません。

元の行のうち、投稿者がnullでないのは、R1、R2、R3、R4、R5、R6です。6行あります。R2はコピーなので、コメント総数を6とするのは誤りです。コピーを除くと、投稿者の値は5つ残ります。それでも、Aが2回現れるため、アカウント総数を5とするのは誤りです。

このファイルには、人物を示すフィールドがありません。1人が2つのアカウントを使うこともあります。2人が1つのアカウントを共有することもあります。識別可能なアカウントは4件と報告します。4人とは報告しないでください。5人とも報告しないでください。C6は、投稿者がnullの、識別可能なコメントです。C6の投稿者を0と書かないでください。このファイルでは、識別可能なコメントが6件、識別可能なアカウントが4件という記述は、どちらも正しいものです。同じ集計値ではありません。

R8には「かっこいい」という本文と日時がありますが、コメントIDはありません。他に「かっこいい」と書かれた行はありません。それでも、R8を識別可能なコメントとは扱えません。日時はコメントIDの代わりにはなりません。投稿者がどちらもnullだからといって、R8をC6と統合しないでください。両方がnullでも、一致したことにはなりません。R8が新しいコメントだとは証明されていません。コピーだとも証明されていません。元のJSONを確認するまでは、判定を未確定のままにします。空欄のコメントIDを基準に統合しないでください。

5を母数に使うのは、本文がある識別可能なコメントを必要とする指標に限ります。C6は、値の取得状況を数える際には残します。取得状況とは、値が存在したかどうかです。識別可能なすべてのコメントを対象とする指標では、母数は6です。指標の横に母数を書きます。8、6、5を、同じ母数であるかのように使わないでください。この例では、称賛の割合やその他の結果を計算していません。

`createdAt`がある識別可能なコメント = 6件中6件。この例では、日付がない識別可能なコメント = 0件です。R8には日時がありますが、その日時があってもコメントIDが得られるわけではありません。実際の実行では異なる場合があります。日付フィルターを使った場合、`createdAt`がnullのコメントは既に除外されています。

## 6. 元の本文の横に分類コードを追加する

取得元の本文は`raw_text`に保持します。そこでつづりを直さないでください。改行も削除しないでください。整形した本文が必要なら、`coding_text`などの新しい列に入れます。判断した内容は、すべて新しい列に記録します。列は、`coding_unit`、`code`、`coder`、`decision_note`、`coding_version`です。

`coding_unit`には、分類する対象を記します。この演習の単位はコメントです。`code`は、手作業で付けるラベルです。`coder`には、ラベルを選んだ人の名前を記します。`decision_note`には、その理由を書きます。`coding_version`には、適用したルールの版を記します。ルールが変わったら、新しい版を記録します。何も記録せずに古い注記を上書きしないでください。

[別の人が同じ分類判断を再現できる](/ja/articles/reddit%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88-%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC%E9%96%93%E3%81%AE%E4%B8%80%E8%87%B4%E5%BA%A6%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95/)のは、これらの列に情報が記入されている場合に限ります。Actorは、これらを記入しません。

ここでも、同じ架空のファイルを使います。これらのラベルは、caseyという架空の分類担当者が練習用に付けたものです。Actorのフィールドではありません。感情スコアでもありません。実在する人についての研究結果でもありません。

| commentId | raw_text | coding_unit | code | coder | decision_note | coding_version |
| --- | --- | --- | --- | --- | --- | --- |
| C1 | すばらしい投稿 | comment | in_text_base | casey | コピーされた行と取得元の値が同じ。C1は1回だけ数える。 | v1 |
| C2 | すばらしい投稿 | comment | in_text_base | casey | 本文はC1と一致する。コメントIDが異なるため、両方を残す。 | v1 |
| C3 | いい写真 | comment | in_text_base | casey | コメントIDが異なり、アカウントはB。 | v1 |
| C4 | これ、大好き | comment | in_text_base | casey | コメントIDが異なり、アカウントはC。 | v1 |
| C5 | 最高 | comment | in_text_base | casey | コメントIDが異なり、アカウントはD。 | v1 |

C1とC2はコメントIDが異なるため、2つの単位として扱います。どちらもアカウントAが書きました。アカウントを単位にすれば、両者はまとめられます。コメントを単位にする場合は、まとめません。

C6は本文が空文字列なので、この練習用の表には入れません。値の取得状況を数える際には、C6を残します。R8はコメントIDがないため入れません。本文分析の母数に無理に含めるために、R8に分類コードを付けないでください。

取得元の投稿が後で消えた場合も、日付付きのファイルを、`collectedAt`時点の観測記録として保管します。ページがなくなったことに合わせて、元の本文を変更しないでください。保存期間のルールは、ファイルをどれだけの期間保管し、誰が閲覧できるかを定める、別の書面上の決定です。この記事では、そのルールは定めません。

## 7. サンプルの台帳を作る

台帳とは、何を取得するよう指定し、何を保存し、何を除外したかを件数で記録したものです。元のJSONとOUTPUTから作成します。以下の架空の台帳には、架空の行だけを使っています。この例にはOUTPUTレポートがありません。実際の実行ではOUTPUTから転記する必要がある箇所を、この例では不明としています。

| 台帳の項目 | 架空のファイルでの値 |
| --- | --- |
| 指定した投稿数 | 架空の投稿1件 |
| 保存された行数 | 8 |
| 余分なコピー行数 | 1 |
| 重複を除いた識別可能なコメント数 | 6 |
| 本文分析の母数 | 5 |
| 本文が空文字列の識別可能なコメント数 | 1 |
| 判定が未確定の行数 | 1 |
| 重複を除いた識別可能なアカウント数 | 4 |
| 日付がある識別可能なコメント数 | 6 |
| 日付がない識別可能なコメント数 | 0 |
| 利用可能な結果が得られた対象数 | この例では不明です。OUTPUTを確認してください。 |
| 失敗した対象数 | この例では不明です。OUTPUTを確認してください。 |
| 結果が空だった対象数 | この例では不明です。OUTPUTを確認してください。 |
| 上限に達した対象数 | この例では不明です。OUTPUTを確認してください。 |

実際の実行では、OUTPUTから`requestedTargets`、`savedRows`、`cappedTargets`を転記します。各投稿の`resultState`、`sampleHealth`、`stopReason`も転記します。その後、コメントIDを自分で重複を除いて数えます。レポートの値を推測で置き換えないでください。この例の数字を、そのレポートに貼り付けないでください。

| 対象 | 処理方法 | 理由 |
| --- | --- | --- |
| R2 | コメント総数から除外する | 取得元の値が同じ、C1のコピー行だから |
| C6 | 本文分析の母数からのみ除外する | 本文が空文字列だから。値の取得状況の集計には残す |
| R8 | 判定未確定の別一覧に残す | コメントIDがないから。空欄のIDを基準に統合しない |

各行の横に、除外理由を書きます。標準の並び順や公開範囲によって、どの意見が現れるかは変わる可能性があります。その点を台帳の注記に書きます。上限に達した対象は、自分が設定した上限に到達したという意味です。それだけでは、除外されたすべてのコメントを特定できません。

取得元の表示総数とは、投稿ページに表示されたコメント数です。保存された行数とは分けて扱います。方法の記述では、両方の数値を使います。

## 8. ファイルの内容に合う方法の記述を書く

実際に保存した内容を書きます。各行が、公開表示されたトップレベルコメントであると明記します。投稿リンク、並び順、上限、対象期間、収集日時を記載します。取得元の表示総数と保存された行数は、分けて扱います。

この2つの数値が異なっても、その差だけでは原因は分かりません。差があることは、収集処理の不具合を証明しません。また、収集が完全だったことや、問題なく行われたことを証明するものでもありません。上限、フィード終端での停止、時間切れによる停止、取得元での障害、非表示コメント、そもそも行として保存されなかった返信は、いずれも件数を変える要因になります。実際に確認した停止理由は、OUTPUTについての記録に残します。

保存された行数が0でも、その投稿にコメントがなかったと書かないでください。先に対象ごとの状態を確認します。

次の文章はテンプレートです。角括弧の各項目を、自分の実行内容に置き換えます。架空の件数を転記しないでください。

```text
We saved publicly shown top-level comments.
The posts were the public URLs we listed before the run.
The order was default.
The cap per post was [your cap].
The collection time was [collectedAt].
The date window was [your dates], or we did not use a date filter.
We saved [saved rows] rows.
The source displayed total was [source total], or we did not record one.
A difference between those numbers is not proof of a bug.
That difference is also not proof that the file is complete.
We did not export reply text.
Null means a value was unavailable.
We kept zero and false as real values.
We counted comments, accounts, and posts separately.
This file describes the saved public comments only.
It does not describe all Instagram users.
```

8. ファイルの内容に合う方法の記述を書く

取得元の表示総数を記録していなければ、その欄は空欄にします。数値を作らないでください。別の人が、分類した各コメントを、コメントID、投稿リンク、`collectedAt`までたどれるようにします。

## 次に行うこと

サンプルのリールを、既に把握している公開投稿1件に置き換えます。上限を3件、並び順を標準にし、`collectAllAvailable`をfalseに設定します。上限を引き上げる前に、IDと本文を元のJSONと照合します。[Instagram Comments Scraper Actor](https://apify.com/chronometrica/instagram-comments-scraper)と[CSVエクスポート用Task](https://apify.com/chronometrica/instagram-comments-scraper/examples/export-instagram-comments-to-csv)から始めてください。

## 出典と参考資料

- [Instagram Comments Scraper Actor](https://apify.com/chronometrica/instagram-comments-scraper)
- [InstagramのコメントをCSVにエクスポートするTask](https://apify.com/chronometrica/instagram-comments-scraper/examples/export-instagram-comments-to-csv)
- [InstagramのコメントをExcelにダウンロードする方法についての質問](https://www.reddit.com/r/InstagramMarketing/comments/15m86x1/download_instagram_comments_to_excel/)
- [テキストファイルやCSVファイルをインポートまたはエクスポートする](https://support.microsoft.com/en-us/office/import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba)
- [Apifyのデータセットストレージ](https://docs.apify.com/platform/storage/dataset)