ブログを書いていると、記事数が1,000件を超えたあたりから「あの記事いつ書いたっけ?」「どのカテゴリーが一番多いんだろう?」と、管理画面だけで把握するのが難しくなってきませんか。

私自身、気がつけば1,300記事を超えており、全体像を把握するためにPythonを使って全記事リストをCSVで一括出力するツールを作成しました。
今回は、エンジニア視点で「はてなブログAPI」を攻略し、1,000記事以上のデータを数分で抽出する方法を詳しく解説します。
- 第1章:事前準備:はてなブログAPI(AtomPub)の確認
- 第2章:Python環境を整える(初心者向けフォロー)
- 第3章:Step1:まずは疎通確認(テスト用コード)
- 第4章:Step2:全記事取得&CSV出力スクリプト(完成版)
- 第5章:実行結果とデータの活用法
- 第6章:まとめ
第1章:事前準備:はてなブログAPI(AtomPub)の確認
まずは、Pythonとはてなブログを連携させるための「鍵」を手に入れましょう。必要な情報は以下の3つです。
- はてなID:普段ログインに使っているIDです。
- ブログID:あなたのブログのドメイン名(例:toma-blog-ginfo.hatenablog.com)です。
- APIキー:管理画面の「詳細設定」から取得します。
💡 ちなみに:ルートエンドポイントの罠
設定画面にある「ルートエンドポイント」のURLを確認してください。.../atom/entry の手前にある文字列が、APIで正しく認識されるための正確なIDです。ここがズレていると、404エラーの原因になります。
第2章:Python環境を整える(初心者向けフォロー)
コードを書く前に、お使いのPCでPythonが正しく動く状態か確認しましょう。
- Pythonのインストール:公式サイトから最新版をダウンロード。
- Add Python.exe to PATH:インストーラーの最初に出てくるこのチェックボックスは、絶対にオンにしてください。
- ライブラリの準備:ターミナル(PowerShell等)で
pip install requestsを実行。
⚠️ 注意点:アプリ実行エイリアスの罠
Windowsの場合、python と打ってもMicrosoft Storeが開いてしまうことがあります。これはOS側の「アプリ実行エイリアス」が邪魔をしている証拠です。設定からオフにするか、代わりに py コマンドを試してみてください。
第3章:Step1:まずは疎通確認(テスト用コード)
環境ができたら、まずは最小限のコードで接続テストを行います。以下のコードを test.py として保存して実行してください。
import requests
# 設定情報
HATENA_ID = 'あなたのID'
BLOG_ID = 'あなたのブログドメイン'
API_KEY = 'あなたのAPIキー'
# エンドポイント
url = f'https://blog.hatena.ne.jp/{HATENA_ID}/{BLOG_ID}/atom/entry'
# 実行
response = requests.get(url, auth=(HATENA_ID, API_KEY))
print(f"ステータスコード: {response.status_code}")
if response.status_code == 200:
print("✅ 接続成功!")
else:
print("❌ 失敗。設定値を見直してください。")
実行結果として ステータスコード: 200 が返ってくれば準備完了です。
第4章:Step2:全記事取得&CSV出力スクリプト(完成版)
はてなブログのAPIは1回のリクエストで最大20件までしか取得できません。そのため、「次のページ」のリンクを自動で追いかけるループ処理を組み込みます。
import requests
import xml.etree.ElementTree as ET
import csv
import time
from datetime import datetime, timezone, timedelta
# --- 設定情報 ---
HATENA_ID = 'あなたのID'
BLOG_ID = 'あなたのブログドメイン'
API_KEY = 'あなたのAPIキー'
JST = timezone(timedelta(hours=+9), 'JST')
def fetch_all_articles():
articles = []
next_url = f'https://blog.hatena.ne.jp/{HATENA_ID}/{BLOG_ID}/atom/entry'
while next_url:
response = requests.get(next_url, auth=(HATENA_ID, API_KEY))
if response.status_code != 200: break
root = ET.fromstring(response.content)
ns = {'atom': 'http://www.w3.org/2005/Atom', 'app': 'http://www.w3.org/2007/app'}
for entry in root.findall('atom:entry', ns):
title = entry.find('atom:title', ns).text
pub_str = entry.find('atom:published', ns).text
# UTCからJSTへ変換
pub_dt = datetime.fromisoformat(pub_str.replace('Z', '+00:00')).astimezone(JST)
# カテゴリーとタグの分離
all_cats = [cat.get('term') for cat in entry.findall('atom:category', ns)]
main_cat = all_cats[0] if all_cats else ""
sub_tags = ", ".join(all_cats[1:]) if len(all_cats) > 1 else ""
articles.append({
'公開日時': pub_dt.strftime('%Y-%m-%d %H:%M:%S'),
'タイトル': title,
'メインカテゴリー': main_cat,
'サブタグ': sub_tags
})
# 次のページURLを取得
next_link = root.find("atom:link[@rel='next']", ns)
next_url = next_link.get('href') if next_link is not None else None
time.sleep(1) # サーバー負荷軽減
return articles
第5章:実行結果とデータの活用法
スクリプトを実行すると、同一フォルダにCSVファイルが生成されます。実際に1,300件以上のデータを出力してみると、興味深い事実が見えてきました。
実例:私のブログのメインカテゴリー集計(TOP 10)
実際にPythonで抽出した1,300件超のデータを集計した結果がこちらです。自分のブログの「強み」や「傾向」が客観的な数値として浮かび上がってきました。
| メインカテゴリー | 記事数 | 役割・傾向 |
|---|---|---|
| ELDEN RING | 233 | 不動のメインコンテンツ |
| MHWIB | 148 | モンハンワールド:不動の人気 |
| MHNOW | 106 | 現在進行形の主力 |
| Amazon | 83 | セール情報などの実用記事 |
| 雑記 | 78 | 日々の活動やライフスタイル |
| 手法紹介 | 72 | ノウハウ・技術系 |
| 情報整理 | 59 | 比較やまとめ |
| 地球防衛軍6 | 45 | EDF隊員としての記録 |
| プレイ感想 | 31 | 各種ゲームのレビュー |
| WILD HEARTS | 28 | 狩りゲー枠の蓄積 |
💡 分析のポイント
上位を占めるのはやはりゲーム攻略記事ですが、「手法紹介」や「情報整理」といった、エンジニアらしい切り口の記事も一定のボリュームがあることが分かります。こうした「自分のブログの成分表」を知ることで、今後の執筆方針がより明確になります。
- カテゴリーの偏り:私の場合、ELDEN RING関連記事が230件以上あり、全体の約2割を占めていることが判明。
- 投稿リズムの可視化:特定の時期に集中して執筆している傾向がデータとして現れます。
このように、客観的な数値で自分のブログを分析できるのが、Python自作ツールの最大のメリットです。
第6章:まとめ
記事のポイントまとめ
- はてなブログAPIを使えば、1,000記事超のデータも一括取得可能。
- 「404エラー」や「環境変数」など、OS・API特有の罠を回避するのがコツ。
- CSV化することで、Excelでの分析やリライト計画の立案が劇的に楽になる。
ブログは書くだけでなく、時にはこうして「データ」として眺めてみることで、新しい発見や次の執筆へのモチベーションに繋がります。ぜひ、あなたも「自分だけの全記事名簿」を作ってみてください!
分からないことがあったら最近は師匠として認識し始めてるGeminiさんがおすすめです💦