Toma(とま)のゲーム日記

MHNOW、MHWIB、ELDEN RING、WILD HEARTSなどの役立ち情報をアップしていきます。ツイッターでの懸賞応募、自炊、家庭菜園といろいろ始めました。

記事内に商品プロモーションを含む場合があります。

【Python×はてなブログ】APIで1,000記事以上の全投稿リストをCSV出力!環境構築からエラー対策まで徹底解説

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

「1,000記事超を数分で名簿化! Pythonではじめるブログ資産の可視化戦略」というタイトルのアイキャッチ画像。 画像は3つのステップで構成されている。  【STEP 1:はてなブログAPI (AtomPub) 攻略】 「はてなID」「基底ドメイン (真のBLOG_ID)」「APIキー」の3つの入力項目が表示されている。 独自ドメイン運用時に発生する「404 Blog not found」エラーの解決策として、はてなブログの設定画面にある「ルートエンドポイント」URLの中から、プログラムに入力すべき「真のブログID」を特定する方法が図解されている。  【STEP 2:Pythonスクリプトで一括出力】 VS Code(黒背景)風のコードエディタに、1,000記事以上の取得に対応したページネーション(while next_url)処理を含む、Pythonの完成版コードが表示されている。 コードから「test.py」による疎通確認を経て、最終的に全データが「hatena_detailed_list.csv」として出力される流れが矢印で示されている。  【STEP 3:データ分析&活用】 CSVデータをExcel(緑のロゴ)で集計した「カテゴリー分布 (Top 5)」の横棒グラフが表示されている(ELDEN RING、MHWIB、MHNOW、Amazon、手法紹介)。 その下に、データの活用法として「ブログの強みを可視化」「リライト計画の立案」「死蔵記事の発見」という3つのメリットがリストアップされている。  下部のバナーには「客観的なデータでブログ運営を戦略的に!」というキャッチコピーと、PythonとExcelのロゴが配置されている。全体として、エンジニアリングによる効率化とデータに基づく戦略的なブログ運営をイメージさせるデザイン。

私自身、気がつけば1,300記事を超えており、全体像を把握するためにPythonを使って全記事リストをCSVで一括出力するツールを作成しました。

今回は、エンジニア視点で「はてなブログAPI」を攻略し、1,000記事以上のデータを数分で抽出する方法を詳しく解説します。

 

 

第1章:事前準備:はてなブログAPI(AtomPub)の確認

まずは、Pythonとはてなブログを連携させるための「鍵」を手に入れましょう。必要な情報は以下の3つです。

  1. はてなID:普段ログインに使っているIDです。
  2. ブログID:あなたのブログのドメイン名(例:toma-blog-ginfo.hatenablog.com)です。
  3. APIキー:管理画面の「詳細設定」から取得します。

💡 ちなみに:ルートエンドポイントの罠

設定画面にある「ルートエンドポイント」のURLを確認してください。.../atom/entry の手前にある文字列が、APIで正しく認識されるための正確なIDです。ここがズレていると、404エラーの原因になります。

 

第2章:Python環境を整える(初心者向けフォロー)

コードを書く前に、お使いのPCでPythonが正しく動く状態か確認しましょう。

  1. Pythonのインストール:公式サイトから最新版をダウンロード。
  2. Add Python.exe to PATH:インストーラーの最初に出てくるこのチェックボックスは、絶対にオンにしてください。
  3. ライブラリの準備:ターミナル(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章:まとめ

記事のポイントまとめ

  1. はてなブログAPIを使えば、1,000記事超のデータも一括取得可能。
  2. 「404エラー」や「環境変数」など、OS・API特有の罠を回避するのがコツ。
  3. CSV化することで、Excelでの分析やリライト計画の立案が劇的に楽になる。

ブログは書くだけでなく、時にはこうして「データ」として眺めてみることで、新しい発見や次の執筆へのモチベーションに繋がります。ぜひ、あなたも「自分だけの全記事名簿」を作ってみてください!

分からないことがあったら最近は師匠として認識し始めてるGeminiさんがおすすめです💦