Contents
Pocket からのエクスポート手順
1‑1. CSV 形式で取得する
| 手順 | 操作内容 |
|---|---|
| ① | Pocket にログインし、右上メニュー → Settings をクリック |
| ② | 左サイドバーの Export を選択 |
| ③ | 「Export as CSV」ボタンを押すと export.csv がダウンロードされます |
ポイント
- ダウンロード時は必ず「UTF‑8(BOMなし)」で保存してください。文字化け防止のため、ブラウザが自動的に UTF‑8 以外で保存しようとしたら手動で変更します。
- Pocket のエクスポート機能では「未読だけ」や「タグ別」などのフィルタはできません。全件取得後にローカルで絞り込みます。
1‑2. HTML 形式で取得する
| 手順 | 操作内容 |
|---|---|
| ① | 同様に Settings → Export ページへ |
| ② | 「Export as HTML」ボタンをクリック |
| ③ | export.html が生成され、ダウンロードフォルダーに保存されます |
HTML の構造は次のようになります(抜粋):
|
1 2 3 4 5 |
<li class="item"> <a href="https://example.com/article" class="title">記事タイトル</a> <blockquote class="excerpt">ハイライトやメモがここに入ります</blockquote> </li> |
エクスポートファイルの中身とインポート要件
CSV の主な列(Pocket が出力)
| 列名 | 内容 | Instapaper で必要か |
|---|---|---|
item_id |
Pocket 内部 ID | 不要(削除可) |
resolved_url / given_url |
記事の URL | 必須 |
given_title |
保存時に入力したタイトル | 必須 |
excerpt |
ユーザーが書いたメモ・ハイライト | 任意(後述の変換で使用) |
time_added |
Unix タイムスタンプ | 任意(ISO 8601 に変換推奨) |
tags |
カンマ区切りタグ | 任意(Instapaper の「フォルダー」へマッピング) |
Instapaper が受け付ける CSV 形式(公式ドキュメント参照)
- 文字コード:UTF‑8(BOMなし)
- 改行コード:LF (
\n) 推奨、CR+LF でも可 - 必須列:
url,title - 日付形式:ISO 8601(例:
2023-04-15T08:30:00Z)
注意
Instapaper の API エンドポイントや認証フローは予告なく変更されることがあります。実装時は必ず公式開発者向けページ( https://www.instapaper.com/api/simple など )で最新情報を確認してください。
Instapaper へインポートする方法
3‑1.Web UI(少量データ)でのインポート手順
| 手順 | 操作内容 |
|---|---|
| ① | Instapaper にサインアップ/ログイン |
| ② | 右上メニュー → Settings → Import |
| ③ | 「Import from Pocket」ボタンをクリックし、先ほど取得した CSV(または HTML)ファイルを選択 |
| ④ | アップロードが完了すると「Import started」の通知が表示され、数分後にインポート結果ページへ遷移 |
制限:1 回のアップロード上限は 5 MB(約10,000 件)です。これを超える場合はファイルを 4,500 件前後に分割して再度実行してください。
3‑2.公式 API を使ったバッチインポート
(1) 認証トークンの取得(OAuth 2.0)
Instapaper のシンプル認証は ユーザー名 + パスワード で access_token が返ります。以下は cURL の例です。
|
1 2 3 |
curl -X POST "https://www.instapaper.com/api/oauth/token" \ -d "grant_type=password&username=YOUR_EMAIL&password=YOUR_PASSWORD" |
レスポンス(JSON)
|
1 2 3 4 5 6 7 |
{ "access_token": "xxxxxxxxxxxx", "token_type": "Bearer", "expires_in": 3600, "refresh_token":"yyyyyyyyyy" } |
実装上のポイント
-grant_type=passwordは非推奨になる可能性があるため、将来的に「Authorization Code」フローへ移行することを検討してください。
- トークンは 1 時間で期限切れになるので、長時間バッチ処理を行う場合はリフレッシュトークンで再取得します。
(2) データインポート用エンドポイント
公式ドキュメントでは POST https://www.instapaper.com/api/1.1/import が推奨されています(※2026 年 4 月時点)。リクエストは multipart/form-data で CSV 全体を送信します。
|
1 2 3 4 |
curl -X POST "https://www.instapaper.com/api/1.1/import" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -F "file=@export_clean.csv;type=text/csv" |
注意
- CSV のヘッダーはurl,title,folder,note(Instapaper が認識できる形)である必要があります。
- ファイルサイズ上限は 10 MB、1 リクエストあたり最大 5,000 行程度です。
(3) Python スクリプトでバッチ処理(行単位送信)
CSV を行ごとに分割して POST https://www.instapaper.com/api/add に送る方法です。大量データでもレートリミットを回避しやすくなります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import csv, time, requests API_ADD = "https://www.instapaper.com/api/add" TOKEN = "YOUR_ACCESS_TOKEN" def add_item(url: str, title: str, folder: str = "", note: str = "") -> None: payload = { "url": url, "title": title, "folder": folder, "description": note # API が description を受け取る場合 } headers = {"Authorization": f"Bearer {TOKEN}"} r = requests.post(API_ADD, data=payload, headers=headers) if r.status_code != 201: print(f"[ERROR] {url} → {r.status_code} {r.text}") with open("export_clean.csv", newline="", encoding="utf-8") as f: reader = csv.DictReader(f) for i, row in enumerate(reader, 1): add_item(row["url"], row["title"], row.get("folder",""), row.get("note","")) if i % 100 == 0: # 100 件ごとに 1 秒待機 time.sleep(1) |
ポイントまとめ
| 項目 | 推奨設定 |
|---|---|
| リクエスト間隔 | 100 件ごとに time.sleep(1)(Instapaper のレートリミットは 5 req/秒) |
| エラーハンドリング | 失敗した行は別ファイル (failed.csv) に保存し、後で再送 |
| ログ出力 | 標準出力に進捗とステータスコードを表示(CI 環境でも可視化) |
タグ・ハイライト・コメントの変換例
Pocket の情報はすべてテキストデータとして扱う必要があります。以下は CSV 前処理 で行う典型的なマッピングです。
| Pocket 項目 | Instapaper への変換例 |
|---|---|
tags(カンマ区切り) |
folder にスラッシュ区切りで格納 (tech,python → tech/python) |
excerpt(ハイライト・メモ) |
note カラムにプレフィックス付与 【ハイライト】<テキスト> |
コメント(Pocket には別途保存できないが、excerpt に併記可能) |
同上、【コメント】 を付加 |
CSV 前処理のサンプル(pandas)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import pandas as pd df = pd.read_csv("export.csv", encoding="utf-8") # 必要列だけ抽出し名前を Instapaper 用にリネーム df = df[["resolved_url","given_title","excerpt","time_added","tags"]] df.rename(columns={"resolved_url":"url","given_title":"title"}, inplace=True) # タグ → フォルダー変換(空白は除外) df["folder"] = df["tags"].fillna("").str.replace(",", "/") # ハイライト・コメントを note に統合 def make_note(row): notes = [] if pd.notnull(row["excerpt"]): notes.append(f"【ハイライト】{row['excerpt']}") return "\n".join(notes) df["note"] = df.apply(make_note, axis=1) # 重複 URL は削除 df.drop_duplicates(subset=["url"], inplace=True) # 最終的に Instapaper が期待する列だけ残す df[["url","title","folder","note"]].to_csv("export_clean.csv", index=False, encoding="utf-8") print(f"変換完了:{len(df)} 件") |
インポート後の検証とトラブルシューティング
1. 成功・失敗件数の確認
| 方法 | 手順 |
|---|---|
| Instapaper の Import Report | Settings → Import → 「最近のインポート」から成功件数・エラー件数を閲覧 |
| CSV と突き合わせ | pandas の merge で url が一致しない行を抽出し、failed.csv に保存 |
|
1 2 3 4 5 6 7 8 |
import pandas as pd insta = pd.read_csv("instapaper_import_report.csv") # Instapaper が提供する CSV(例) pocket = pd.read_csv("export_clean.csv") missing = pocket[~pocket["url"].isin(insta["url"])] missing.to_csv("failed.csv", index=False, encoding="utf-8") print(f"未インポート件数: {len(missing)}") |
2. 重複チェック
Instapaper は同一 URL が既に保存されていると自動でスキップしますが、ローカル CSV でも drop_duplicates('url') しておくと API 呼び出し回数を削減できます。
3. リンク切れの検出
2026 年 2 月にリリースされた Link Checker 機能を活用します。
- Instapaper の Settings → Link Checker を開く
- 「Check all links」ボタンで全記事をスキャン
- 結果は画面上に一覧表示され、問題のある URL は個別に削除または再保存が可能
4. よくあるエラーと対処法
| エラーコード | 原因例 | 対策 |
|---|---|---|
400 Bad Request |
CSV の列名が不正、文字コードが UTF‑8 でない | 列名を url,title,folder,note に統一し、エンコーディングを再確認 |
401 Unauthorized |
トークンの期限切れまたは取得ミス | 再度 OAuth エンドポイントからアクセストークンを取得 |
413 Payload Too Large |
1 回のインポートでファイルサイズが上限超過 | ファイルを 4,000 行程度に分割して再実行 |
429 Too Many Requests |
短時間にリクエストしすぎた | time.sleep(1) 以上の待機時間を設ける |
Instapaper の日常的な保存方法
| 手段 | 設定手順 | メリット |
|---|---|---|
| ブラウザ拡張(Chrome / Edge) | Chrome ウェブストアで「Instapaper」拡張をインストール → アカウント連携 → 任意のページでアイコンクリック | ワンクリックで即保存、タグ付けも可能 |
| ブックマークレット | Settings → 「Bookmarklet」生成 → ブラウザのブックマークバーにドラッグ | 拡張機能が使えない環境(社内 PC など)でも動作 |
| モバイルアプリ(iOS / Android) | App Store/Google Play から公式アプリをインストール → iOS の共有シート、Android の「共有」メニューから Instapaper を選択 | スマホで読んだ記事も手軽に保存 |
ベストプラクティス
- 重要な記事はタグ(フォルダー)とともに 「Saved」 状態にしておくと、あとで検索しやすいです。
- 定期的に Export → CSV を取得し、ローカルバックアップを取っておくと万が一のサービス障害時にも安心です。
FAQ と参考リンク
| 質問 | 回答 |
|---|---|
| Pocket のサービス停止は本当にあるの? | 2026 年 5 月現在、公式に「2025 年 12 月終了」の発表はありません。リスクが指摘されているだけです。 |
| Instapaper の API エンドポイントは変わる可能性がありますか? | はい。実装前に必ず https://www.instapaper.com/api で最新情報を確認してください。 |
| CSV の文字化け対策はどうすればいいですか? | Excel で開く場合は「データ」→「テキスト/CSV から取得」→「ファイルの起動時に UTF‑8 を選択」します。 |
| タグが多層構造になるときのマッピング方法は? | Pocket の tags はカンマ区切りですので、Instapaper のフォルダーはスラッシュ区切りに変換すると階層表現できます(例: tech,python → tech/python)。 |
| 1 万件以上のインポートは可能ですか? | Web UI の上限は 5 MBですが、API を利用すればバッチ処理で数十万件まで対応可能です。ただしレートリミットとトークン有効期限に注意してください。 |
参考リンク
- Pocket ヘルプセンター(エクスポート手順): https://help.getpocket.com/article/1159-export-your-data
- Instapaper 開発者向けドキュメント: https://www.instapaper.com/api/simple
- UTF‑8 エンコーディング確認ツール: https://www.charset.org/utf8
まとめ
1. Pocket のデータは必ず CSV(UTF‑8)でエクスポートし、不要列や重複を削除。
2. Instapaper が要求するurlとtitleを中心に、タグはフォルダーへ、ハイライトは note に変換。
3. 少量なら Web UI、数千件以上は公式 API(/api/1.1/importまたは/api/add)でバッチ処理。
4. インポート後はレポートと CSV を突き合わせて失敗・重複を確認し、リンク切れは Link Checker で対策。
この手順に沿って作業すれば、Pocket のサービスが将来的に終了したとしても 記事・ハイライト・タグ情報を安全に保存 でき、Instapaper 上で快適な「あとで読む」体験を継続できます。