【Python】Qiita API 記事の閲覧数を集計

# 【Python】Qiita API 記事の閲覧数を集計

Qiitaは、エンジニアやプログラマー向けの情報共有プラットフォームとして広く利用されています。
自身の投稿記事のパフォーマンスを把握するために、記事の閲覧数を集計することは非常に有益です。

本記事では、Qiita APIを利用して自身の投稿記事の総閲覧数とトップ5の閲覧数を取得するPythonスクリプトについて、詳細に解説します。

## スクリプトの概要

以下に示すスクリプトは、Qiita APIを使用して認証済みユーザーの投稿記事を取得し、各記事の閲覧数を集計します。

最終的に、総記事数、総閲覧数、および閲覧数の多い上位10記事をコンソールに表示します。

```python
import requests
import time

def get_qiita_articles(access_token):
    # 初期設定
    base_url = "https://qiita.com/api/v2/authenticated_user/items"
    headers = {
        "Authorization": f"Bearer {access_token}"
    }
    
    all_articles = []
    page = 1
    per_page = 100  # 1ページあたりの最大記事数
    
    while True:
        # APIリクエストパラメータ
        params = {
            "page": page,
            "per_page": per_page
        }
        
        # APIリクエスト実行
        response = requests.get(base_url, headers=headers, params=params)
        
        # レスポンスのステータスコードチェック
        if response.status_code != 200:
            print(f"Error: Status code {response.status_code}")
            break
            
        # 記事データの取得
        articles = response.json()
        
        # 記事がない場合は終了
        if not articles:
            break
            
        all_articles.extend(articles)
        
        # 総記事数を取得
        total_count = int(response.headers.get('Total-Count', 0))
        
        # 全ての記事を取得済みかチェック
        if len(all_articles) >= total_count:
            break
            
        page += 1
        
        # API制限を考慮して少し待機
        time.sleep(1)
    
    return all_articles

def calculate_total_views(articles):
    total_views = 0
    article_views = []
    
    for article in articles:
        views = article['page_views_count']
        title = article['title']
        created_at = article['created_at']
        
        article_views.append({
            'title': title,
            'views': views,
            'created_at': created_at
        })
        total_views += views
    
    return total_views, article_views

def main():
    # アクセストークンを設定
    access_token = "YOUR_ACCESS_TOKEN"  # ここに自分のアクセストークンを入力
    
    # 記事データの取得
    articles = get_qiita_articles(access_token)
    
    # 閲覧数の計算
    total_views, article_views = calculate_total_views(articles)
    
    # 結果の表示
    print(f"総記事数: {len(articles)}")
    print(f"総閲覧数: {total_views:,}")
    
    # 閲覧数トップ10の記事を表示
    print("\n閲覧数トップ10の記事:")
    sorted_articles = sorted(article_views, key=lambda x: x['views'], reverse=True)
    for i, article in enumerate(sorted_articles[:10], 1):
        print(f"{i}. {article['title']}: {article['views']:,} views ({article['created_at']})")

if __name__ == "__main__":
    main()
```

## スクリプトの詳細解説

### 1. 必要なライブラリのインポート

```python
import requests
import time
```

- `requests`: HTTPリクエストを簡単に送信できるライブラリです。Qiita APIへのリクエストに使用します。
- `time`: 処理の待機時間を設けるために使用します。APIのレート制限を考慮する際に役立ちます。

### 2. Qiita APIから記事を取得する関数

```python
def get_qiita_articles(access_token):
    # 初期設定
    base_url = "https://qiita.com/api/v2/authenticated_user/items"
    headers = {
        "Authorization": f"Bearer {access_token}"
    }
    
    all_articles = []
    page = 1
    per_page = 100  # 1ページあたりの最大記事数
    
    while True:
        # APIリクエストパラメータ
        params = {
            "page": page,
            "per_page": per_page
        }
        
        # APIリクエスト実行
        response = requests.get(base_url, headers=headers, params=params)
        
        # レスポンスのステータスコードチェック
        if response.status_code != 200:
            print(f"Error: Status code {response.status_code}")
            break
            
        # 記事データの取得
        articles = response.json()
        
        # 記事がない場合は終了
        if not articles:
            break
            
        all_articles.extend(articles)
        
        # 総記事数を取得
        total_count = int(response.headers.get('Total-Count', 0))
        
        # 全ての記事を取得済みかチェック
        if len(all_articles) >= total_count:
            break
            
        page += 1
        
        # API制限を考慮して少し待機
        time.sleep(1)
    
    return all_articles
```

#### 主な機能とポイント

- **認証ヘッダーの設定**: `Authorization`ヘッダーにBearerトークンを設定し、認証済みユーザーとしてAPIにアクセスします。
  
- **ページネーションの処理**: Qiita APIはページネーションを採用しており、`page`と`per_page`パラメータを使用して複数ページにわたるデータを取得します。最大で1ページあたり100件のデータを取得可能です。
  
- **ループによる全記事の取得**: 取得した記事数が総記事数に達するまで、ループを継続して全ての記事を取得します。
  
- **エラーハンドリング**: ステータスコードが200以外の場合、エラーメッセージを表示してループを抜けます。
  
- **レート制限の考慮**: 各APIリクエスト後に1秒の待機を設けることで、APIのレート制限に引っかかるリスクを低減します。

### 3. 記事の閲覧数を集計する関数

```python
def calculate_total_views(articles):
    total_views = 0
    article_views = []
    
    for article in articles:
        views = article['page_views_count']
        title = article['title']
        created_at = article['created_at']
        
        article_views.append({
            'title': title,
            'views': views,
            'created_at': created_at
        })
        total_views += views
    
    return total_views, article_views
```

#### 主な機能とポイント

- **総閲覧数の計算**: すべての記事の`page_views_count`を合計し、総閲覧数を算出します。
  
- **個別記事のデータ収集**: 各記事のタイトル、閲覧数、作成日時をリストに格納し、後でランキング表示に使用します。

### 4. メイン関数

```python
def main():
    # アクセストークンを設定
    access_token = "YOUR_ACCESS_TOKEN"  # ここに自分のアクセストークンを入力
    
    # 記事データの取得
    articles = get_qiita_articles(access_token)
    
    # 閲覧数の計算
    total_views, article_views = calculate_total_views(articles)
    
    # 結果の表示
    print(f"総記事数: {len(articles)}")
    print(f"総閲覧数: {total_views:,}")
    
    # 閲覧数トップ5の記事を表示
    print("\n閲覧数トップ5の記事:")
    sorted_articles = sorted(article_views, key=lambda x: x['views'], reverse=True)
    for i, article in enumerate(sorted_articles[:5], 1):
        print(f"{i}. {article['title']}: {article['views']:,} views ({article['created_at']})")
```

#### 主な機能とポイント

- **アクセストークンの設定**: `access_token`変数に自身のQiitaアクセストークンを設定します。Qiita APIへのアクセスにはこのトークンが必要です。
  
- **記事データの取得と閲覧数の計算**: `get_qiita_articles`関数を呼び出して記事データを取得し、`calculate_total_views`関数で閲覧数を集計します。
  
- **結果の表示**: 総記事数と総閲覧数をコンソールに表示し、閲覧数が多い上位5記事をランキング形式で表示します。

### 5. スクリプトの実行

```python
if __name__ == "__main__":
    main()
```

この部分により、スクリプトが直接実行された場合に`main`関数が呼び出されます。

## スクリプトの使用方法

1. **Qiitaアクセストークンの取得**:
   - Qiitaのアカウントにログインし、[アクセストークンの設定ページ](https://qiita.com/settings/applications)にアクセスします。
   - 必要なスコープ（例えば、`read_qiita`）を選択し、新しいアクセストークンを発行します。
   - 発行されたトークンをコピーします。

2. **スクリプトの準備**:
   - 上記のスクリプトをPythonファイル（例: `qiita_views.py`）として保存します。
   - `access_token = "YOUR_ACCESS_TOKEN"`の部分を、取得したアクセストークンに置き換えます。

3. **必要なライブラリのインストール**:
   - `requests`ライブラリがインストールされていない場合、以下のコマンドでインストールします。
     ```bash
     pip install requests
     ```

4. **スクリプトの実行**:
   - ターミナルやコマンドプロンプトでスクリプトのあるディレクトリに移動し、以下のコマンドを実行します。
     ```bash
     python qiita_views.py
     ```
   - 実行すると、総記事数、総閲覧数、そして閲覧数トップ5の記事が表示されます。

## 注意点

- **アクセストークンの管理**: アクセストークンは個人の認証情報です。第三者に漏洩しないよう、コードを公開する際や共有する際には、トークンを含めないように注意してください。

- **APIのレート制限**: Qiita APIにはレート制限が存在します。スクリプト内で1秒の待機時間を設けていますが、大量のリクエストを行う場合はQiitaのAPIドキュメントを確認し、適切なレート制限を遵守してください。

- **エラーハンドリングの強化**: 現在のスクリプトでは、ステータスコードが200以外の場合にエラーメッセージを表示して処理を終了します。実運用では、より詳細なエラーハンドリングや再試行のロジックを追加すると良いでしょう。

## まとめ

Qiita APIを活用することで、自身の投稿記事のパフォーマンスを効率的に把握することができます。今回解説したスクリプトは、総閲覧数の集計や人気記事のランキング表示を簡単に実現するための基本的なツールです。これを基に、さらなるデータ分析や自動化ツールの開発に挑戦してみてはいかがでしょうか。

ぜひ、この記事を参考にして、Qiita APIを活用したデータ分析に取り組んでみてください！

### 参考

* ODCからQiita APIを使って自分の記事の閲覧数を取得する
    * https://qiita.com/jyunji_watanabe/items/c06c09b1fd539ab36b38

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/